Advertisement
hms11

ESP32ZoneCommandEdgent0.4.7

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