Advertisement
hms11

ESP32ZoneCommandEdgent0.4.3

Jul 14th, 2022
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.21 KB | None | 0 0
  1. // Fill-in information from your Blynk Template here
  2. #define BLYNK_TEMPLATE_ID "TMPL3bTnPK_y"
  3. #define BLYNK_DEVICE_NAME "ZoneCommand"
  4.  
  5. #define BLYNK_FIRMWARE_VERSION "0.4.3"
  6.  
  7. #define BLYNK_PRINT Serial
  8. //#define BLYNK_DEBUG
  9.  
  10. #define APP_DEBUG
  11.  
  12. // Uncomment your board, or configure a custom board in Settings.h
  13. //#define USE_WROVER_BOARD
  14. //#define USE_TTGO_T7
  15.  
  16. #include "BlynkEdgent.h"
  17.  
  18. //Widget Setups
  19.  
  20. WidgetLED led1(V4);
  21. WidgetLED led2(V5);
  22. WidgetLED led3(V6);
  23. WidgetLED led4(V7);
  24. WidgetLED led5(V8);
  25. WidgetLED led6(V9);
  26. WidgetLED led7(V10);
  27. const int ledArray[] = {V7,V8,V9,V10};
  28. const int sensorData[] = {V0,V1,V2,V3};
  29. const int triggerDisplay[] = {V11,V12,V13,V14};
  30. const int spreadDisplay[] = {V23,V24,V25,V26};
  31. const int countdownArray[] = {V35,V36,V37,V38};
  32. const int pumpTimeArray[] = {V47,V48,V49,V50};
  33. int ledStatus[] = {0,0,0,0};
  34.  
  35. // Set Pin Assignments For Output Pins
  36.  
  37. // MOSFETS:
  38. const int output[] = {4,16,17,18};
  39. //Motor Drivers:
  40. //U4 Motor Driver:
  41. const int mtrOutA1 = 22;
  42. const int mtrOutA2 = 23;
  43. //U7 Motor Driver:
  44. const int mtrOutB1 = 19;
  45. const int mtrOutB2 = 21;
  46.  
  47. //Set Pin Assignments for Input Pins
  48.  
  49. //Analog Inputs:
  50.  
  51. //Moisture Sensors:
  52. const int sensPin[] = {35,34,39,36};
  53.  
  54. //Water Level Sensors:
  55. const int wtrLvlTop = 26;
  56. const int wtrLvlBtm = 27;
  57.  
  58.  
  59. //Zone Loop Controls
  60.  
  61. int zoneNumber = 0;
  62. int blynkZone = 0;
  63. int triggerLow[] = {3600,3600,3600,3600};
  64. int triggerHigh[] = {2700,2700,2700,2700};
  65. int triggerSpread[] = {700,700,700,700};
  66. bool systemActive[] = {true, true, true, true};
  67. bool zoneActive[] = {true, true, true, true};
  68. bool zoneManual[] = {false,false,false,false};
  69. bool zoneAuto[] = {true,true,true,true};
  70. bool zonePump[] = {false,false,false,false};
  71. int waterStatus[] = {0,0,0,0};
  72.  
  73.  
  74. // Sensor Data:
  75. int sensor[] = {0, 0, 0, 0}; // Sensor reading values array
  76. int topWtrLvl = 0;
  77. int btmWtrLvl = 0;
  78. int lowWater = 3500;
  79. int highWater = 3500;
  80.  
  81. // Timer Variables
  82.  
  83. int manualDayTimer[] = {86400000, 86400000, 86400000, 86400000}; // delay for x times a day manual watering mode
  84. unsigned long lastManualDayTimer[] = {0, 0, 0, 0,};
  85. unsigned long pumpCountDown[] = {0,0,0,0};
  86. unsigned long pumpTimer[] = {10000, 10000, 10000, 10000}; //Pump timers in array
  87. unsigned long lastPumpTimer[] = {0, 0, 0, 0}; // last value of Pump timers in array
  88.  
  89. BlynkTimer timer;
  90.  
  91. void setup()
  92. {
  93. // Set OUT Pins to Output
  94. pinMode(output[0], OUTPUT);
  95. pinMode(output[1], OUTPUT);
  96. pinMode(output[2], OUTPUT);
  97. pinMode(output[3], OUTPUT);
  98. // Set Sensor Pins to Input
  99. pinMode(sensPin[0], INPUT);
  100. pinMode(sensPin[1], INPUT);
  101. pinMode(sensPin[2], INPUT);
  102. pinMode(sensPin[3], INPUT);
  103.  
  104. // Ensure Mosfets are pulled low
  105. digitalWrite(output[0], LOW);
  106. digitalWrite(output[1], LOW);
  107. digitalWrite(output[2], LOW);
  108. digitalWrite(output[3], LOW);
  109.  
  110. // set Water Level Pins to Input
  111. pinMode(wtrLvlTop, INPUT);
  112. pinMode(wtrLvlBtm, INPUT);
  113.  
  114. //Blynk Timers
  115. BlynkEdgent.begin();
  116. timer.setInterval(250L,blynkData);
  117. //timer.setInterval(500, zoneWater);
  118.  
  119. // Serial.begin(115200);
  120. delay(100);
  121.  
  122. }
  123.  
  124.  
  125. void sensorRead()
  126. {
  127. for (zoneNumber = 0; zoneNumber < 3; zoneNumber++) {
  128.  
  129. bool topWtrLvl = digitalRead(wtrLvlTop);
  130. bool btmWtrLvl = digitalRead(wtrLvlBtm);
  131. if (btmWtrLvl) {
  132. // (systemActive[zoneNumber]) = false;
  133. led1.on();
  134. led3.off();
  135. }
  136. if (!btmWtrLvl) {
  137. // (systemActive[zoneNumber]) = true;
  138. led1.off();
  139. led2.off();
  140. led3.on();
  141. }
  142. if (systemActive[zoneNumber]) {
  143. if (zoneActive[zoneNumber]) {
  144. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  145. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  146. zoneActive[zoneNumber] = false;
  147. sensor[zoneNumber] = 0;
  148. digitalWrite(output[zoneNumber], HIGH);
  149. ledStatus[zoneNumber] = 1;
  150. timer.setTimeout(pumpTimer[zoneNumber], []()
  151. {
  152. zoneActive[zoneNumber] = true;
  153. lastManualDayTimer[zoneNumber] = millis();
  154. digitalWrite(output[zoneNumber], LOW);
  155. ledStatus[zoneNumber] = 0;
  156. });
  157. }
  158. // Serial.println(sensor[zoneNumber]);
  159. }
  160. else if (zoneManual[zoneNumber]) {
  161. sensor[zoneNumber] = 0;
  162. if (!zonePump[zoneNumber]) {
  163. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  164. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  165. digitalWrite(output[zoneNumber], LOW);
  166. ledStatus[zoneNumber] = 0;
  167. lastPumpTimer[zoneNumber] = millis();
  168. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  169. lastManualDayTimer[zoneNumber] = millis();
  170. zonePump[zoneNumber] = true;
  171. digitalWrite(output[zoneNumber], HIGH);
  172. ledStatus[zoneNumber] = 1;
  173. }
  174. }
  175. else if (zonePump[zoneNumber]) {
  176. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  177. zonePump[zoneNumber] = false;
  178. }
  179. }
  180. }
  181. }
  182. }
  183. for (zoneNumber = 3; zoneNumber > 0; zoneNumber = 0) {
  184.  
  185. bool topWtrLvl = digitalRead(wtrLvlTop);
  186. bool btmWtrLvl = digitalRead(wtrLvlBtm);
  187. if (btmWtrLvl) {
  188. // (systemActive[zoneNumber]) = false;
  189. led1.on();
  190. led3.off();
  191. }
  192. if (!btmWtrLvl) {
  193. // (systemActive[zoneNumber]) = true;
  194. led1.off();
  195. led2.off();
  196. led3.on();
  197. }
  198. if (systemActive[zoneNumber]) {
  199. if (zoneActive[zoneNumber]) {
  200. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  201. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  202. zoneActive[zoneNumber] = false;
  203. sensor[zoneNumber] = 0;
  204. digitalWrite(output[zoneNumber], HIGH);
  205. ledStatus[zoneNumber] = 1;
  206. timer.setTimeout(pumpTimer[zoneNumber], []()
  207. {
  208. zoneActive[zoneNumber] = true;
  209. lastManualDayTimer[zoneNumber] = millis();
  210. digitalWrite(output[zoneNumber], LOW);
  211. ledStatus[zoneNumber] = 0;
  212. });
  213. }
  214. // Serial.println(sensor[zoneNumber]);
  215. }
  216. else if (zoneManual[zoneNumber]) {
  217. sensor[zoneNumber] = 0;
  218. if (!zonePump[zoneNumber]) {
  219. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  220. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  221. digitalWrite(output[zoneNumber], LOW);
  222. ledStatus[zoneNumber] = 0;
  223. lastPumpTimer[zoneNumber] = millis();
  224. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  225. lastManualDayTimer[zoneNumber] = millis();
  226. zonePump[zoneNumber] = true;
  227. digitalWrite(output[zoneNumber], HIGH);
  228. ledStatus[zoneNumber] = 1;
  229. }
  230. }
  231. else if (zonePump[zoneNumber]) {
  232. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  233. zonePump[zoneNumber] = false;
  234. }
  235. }
  236. }
  237. }
  238. }
  239. }
  240.  
  241. void blynkData()
  242. {
  243.  
  244. for (blynkZone = 0; blynkZone < 3; blynkZone++) {
  245. Blynk.virtualWrite(sensorData[blynkZone], sensor[blynkZone]);
  246. Blynk.virtualWrite(triggerDisplay[blynkZone], triggerLow[blynkZone]);
  247. Blynk.virtualWrite(spreadDisplay[blynkZone], triggerSpread[blynkZone]);
  248. Blynk.virtualWrite(pumpTimeArray[blynkZone], pumpTimer[blynkZone] / 1000);
  249.  
  250. if (zoneManual[blynkZone]) {
  251. Blynk.virtualWrite(countdownArray[blynkZone], pumpCountDown[blynkZone] / 3600000);
  252. }
  253. else {
  254. Blynk.virtualWrite(countdownArray[blynkZone], 0);
  255. }
  256. if (ledStatus[blynkZone] == 1) {
  257. Blynk.virtualWrite(ledArray[blynkZone], HIGH);
  258. }
  259. else {
  260. Blynk.virtualWrite(ledArray[blynkZone], LOW);
  261. }
  262. }
  263. for (blynkZone = 3; blynkZone > 0; blynkZone = 0) {
  264. Blynk.virtualWrite(sensorData[blynkZone], sensor[blynkZone]);
  265. Blynk.virtualWrite(triggerDisplay[blynkZone], triggerLow[blynkZone]);
  266. Blynk.virtualWrite(spreadDisplay[blynkZone], triggerSpread[blynkZone]);
  267. Blynk.virtualWrite(pumpTimeArray[blynkZone], pumpTimer[blynkZone] / 1000);
  268.  
  269. if (zoneManual[blynkZone]) {
  270. Blynk.virtualWrite(countdownArray[blynkZone], pumpCountDown[blynkZone] / 3600000);
  271. }
  272. else {
  273. Blynk.virtualWrite(countdownArray[blynkZone], 0);
  274. }
  275. if (ledStatus[blynkZone] == 1) {
  276. Blynk.virtualWrite(ledArray[blynkZone], HIGH);
  277. }
  278. else {
  279. Blynk.virtualWrite(ledArray[blynkZone], LOW);
  280. }
  281. }
  282.  
  283. }
  284.  
  285.  
  286. BLYNK_WRITE(V15)
  287. {
  288. triggerLow[0] = param.asInt();
  289. triggerHigh[0] = triggerLow[0] - triggerSpread[0];
  290. }
  291.  
  292. BLYNK_WRITE(V16)
  293. {
  294. triggerLow[1] = param.asInt();
  295. triggerHigh[1] = triggerLow[1] - triggerSpread[1];
  296. }
  297.  
  298. BLYNK_WRITE(V17)
  299. {
  300. triggerLow[2] = param.asInt();
  301. triggerHigh[2] = triggerLow[2] - triggerSpread[2];
  302. }
  303.  
  304. BLYNK_WRITE(V18)
  305. {
  306. triggerLow[3] = param.asInt();
  307. triggerHigh[3] = triggerLow[3] - triggerSpread[3];
  308. }
  309.  
  310. BLYNK_WRITE(V19)
  311. {
  312. if (zoneActive[0]){
  313. zoneActive[0] = false;
  314. zoneManual[0] = true;
  315. lastPumpTimer[0] = millis();
  316. lastManualDayTimer[0] = millis();
  317. digitalWrite(output[0], LOW);
  318. ledStatus[0] = 0;
  319. }
  320. else {
  321. zoneActive[0] = true;
  322. zoneManual[0] = false;
  323. lastPumpTimer[0] = millis();
  324. lastManualDayTimer[0] = millis();
  325. }
  326. }
  327.  
  328. BLYNK_WRITE(V20)
  329. {
  330. if (zoneActive[1]){
  331. zoneActive[1] = false;
  332. zoneManual[1] = true;
  333. lastPumpTimer[1] = millis();
  334. lastManualDayTimer[1] = millis();
  335. digitalWrite(output[1], LOW);
  336. ledStatus[1] = 0;
  337. }
  338. else {
  339. zoneActive[1] = true;
  340. zoneManual[1] = false;
  341. lastPumpTimer[1] = millis();
  342. lastManualDayTimer[1] = millis();
  343. }
  344. }
  345.  
  346. BLYNK_WRITE(V21)
  347. {
  348. if (zoneActive[2]){
  349. zoneActive[2] = false;
  350. zoneManual[2] = true;
  351. lastPumpTimer[2] = millis();
  352. lastManualDayTimer[2] = millis();
  353. digitalWrite(output[2], LOW);
  354. ledStatus[2] = 0;
  355. }
  356. else {
  357. zoneActive[2] = true;
  358. zoneManual[2] = false;
  359. lastPumpTimer[2] = millis();
  360. lastManualDayTimer[2] = millis();
  361. }
  362. }
  363.  
  364. BLYNK_WRITE(V22)
  365. {
  366. if (zoneActive[3]){
  367. zoneActive[3] = false;
  368. zoneManual[3] = true;
  369. lastPumpTimer[3] = millis();
  370. lastManualDayTimer[3] = millis();
  371. digitalWrite(output[3], LOW);
  372. ledStatus[3] = 0;
  373. }
  374. else {
  375. zoneActive[3] = true;
  376. zoneManual[3] = false;
  377. lastPumpTimer[3] = millis();
  378. lastManualDayTimer[3] = millis();
  379. }
  380. }
  381.  
  382. BLYNK_WRITE(V27)
  383. {
  384. triggerSpread[0] = param.asInt();
  385. }
  386.  
  387. BLYNK_WRITE(V28)
  388. {
  389. triggerSpread[1] = param.asInt();
  390. }
  391.  
  392. BLYNK_WRITE(V29)
  393. {
  394. triggerSpread[2] = param.asInt();
  395. }
  396.  
  397. BLYNK_WRITE(V30)
  398. {
  399. triggerSpread[3] = param.asInt();
  400. }
  401.  
  402. BLYNK_WRITE(V31)
  403. {
  404. zoneActive[0] = false;
  405. sensor[0] = 0;
  406. digitalWrite(output[0], HIGH);
  407. ledStatus[0] = 1;
  408. timer.setTimeout(pumpTimer[0], []()
  409. {
  410. zoneActive[0] = true;
  411. lastManualDayTimer[0] = millis();
  412. digitalWrite(output[0], LOW);
  413. ledStatus[0] = 0;
  414. });
  415. }
  416.  
  417. BLYNK_WRITE(V32)
  418. {
  419. zoneActive[1] = false;
  420. sensor[1] = 0;
  421. digitalWrite(output[1], HIGH);
  422. ledStatus[1] = 1;
  423. timer.setTimeout(pumpTimer[1], []()
  424. {
  425. zoneActive[1] = true;
  426. lastManualDayTimer[1] = millis();
  427. digitalWrite(output[1], LOW);
  428. ledStatus[1] = 0;
  429. });
  430. }
  431.  
  432. BLYNK_WRITE(V33)
  433. {
  434. zoneActive[2] = false;
  435. sensor[2] = 0;
  436. digitalWrite(output[2], HIGH);
  437. ledStatus[2] = 1;
  438. timer.setTimeout(pumpTimer[2], []()
  439. {
  440. zoneActive[2] = true;
  441. lastManualDayTimer[2] = millis();
  442. digitalWrite(output[2], LOW);
  443. ledStatus[2] = 0;
  444. });
  445. }
  446.  
  447. BLYNK_WRITE(V34)
  448. {
  449. zoneActive[3] = false;
  450. sensor[3] = 0;
  451. digitalWrite(output[3], HIGH);
  452. ledStatus[3] = 1;
  453. timer.setTimeout(pumpTimer[3], []()
  454. {
  455. zoneActive[3] = true;
  456. lastManualDayTimer[3] = millis();
  457. digitalWrite(output[3], LOW);
  458. ledStatus[3] = 0;
  459. });
  460. }
  461.  
  462. BLYNK_WRITE(V39)
  463. {
  464. manualDayTimer[0] = param.asInt();
  465. }
  466.  
  467. BLYNK_WRITE(V40)
  468. {
  469. manualDayTimer[1] = param.asInt();
  470. }
  471.  
  472. BLYNK_WRITE(V41)
  473. {
  474. manualDayTimer[2] = param.asInt();
  475. }
  476.  
  477. BLYNK_WRITE(V42)
  478. {
  479. manualDayTimer[3] = param.asInt();
  480. }
  481.  
  482. BLYNK_WRITE(V43)
  483. {
  484. pumpTimer[0] = param.asInt();
  485. }
  486.  
  487. BLYNK_WRITE(V44)
  488. {
  489. pumpTimer[1] = param.asInt();
  490. }
  491.  
  492. BLYNK_WRITE(V45)
  493. {
  494. pumpTimer[2] = param.asInt();
  495. }
  496.  
  497. BLYNK_WRITE(V46)
  498. {
  499. pumpTimer[3] = param.asInt();
  500. }
  501.  
  502. BLYNK_WRITE(V51)
  503. {
  504. if (param.asInt() == 0) {
  505. zoneActive[0] = false;
  506. digitalWrite(output[0], LOW);
  507. ledStatus[0] = 0;
  508. sensor[0] = 0;
  509. }
  510. else {
  511. zoneActive[0] = true;
  512. }
  513. }
  514.  
  515. BLYNK_WRITE(V52)
  516. {
  517. if (param.asInt() == 0) {
  518. zoneActive[1] = false;
  519. digitalWrite(output[1], LOW);
  520. ledStatus[1] = 0;
  521. sensor[1] = 0;
  522. }
  523. else {
  524. zoneActive[1] = true;
  525. }
  526. }
  527.  
  528. BLYNK_WRITE(V53)
  529. {
  530. if (param.asInt() == 0) {
  531. zoneActive[2] = false;
  532. digitalWrite(output[2], LOW);
  533. ledStatus[2] = 0;
  534. sensor[2] = 0;
  535. }
  536. else {
  537. zoneActive[2] = true;
  538. }
  539. }
  540.  
  541. BLYNK_WRITE(V54)
  542. {
  543. if (param.asInt() == 0) {
  544. zoneActive[3] = false;
  545. digitalWrite(output[3], LOW);
  546. ledStatus[3] = 0;
  547. sensor[3] = 0;
  548. }
  549. else {
  550. zoneActive[3] = true;
  551. }
  552. }
  553.  
  554. void loop() {
  555. BlynkEdgent.run();
  556. timer.run();
  557. sensorRead();
  558. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement