Advertisement
hms11

ESP32ZoneCommandEdgent0.4.4

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