Advertisement
hms11

ESP32ZoneCommandEdgent0.4.9

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