Advertisement
hms11

ESP32ZoneCommandEdgent0.7.1

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