Advertisement
hms11

ESP32ZoneCommandEdgent0.6.3

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