Advertisement
hms11

ESP32ZoneCommandEdgent0.6.9

Aug 2nd, 2022
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.90 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.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. 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. Blynk.virtualWrite(countdownArray[blynkZone], pumpCountDown[blynkZone] / 3600000);
  220. }
  221. else {
  222. Blynk.virtualWrite(countdownArray[blynkZone], 0);
  223. }
  224. }
  225.  
  226. void waterLevel()
  227. {
  228. int btmWtrLvl = digitalRead(wtrLvlBtm);
  229.  
  230. if (btmWtrLvl == 1) {
  231. systemActive = false;
  232. led2.on();
  233. }
  234. else if (btmWtrLvl == 0) {
  235. systemActive = true;
  236. led2.off();
  237. }
  238. }
  239.  
  240.  
  241. void sensorRead()
  242. {
  243. for (zoneNumber = 0; zoneNumber < 3; zoneNumber++) {
  244.  
  245. int topWtrLvl = digitalRead(wtrLvlTop);
  246. int btmWtrLvl = digitalRead(wtrLvlBtm);
  247. if (btmWtrLvl == 1) {
  248. systemActive = false;
  249. led2.on();
  250. }
  251. else if (btmWtrLvl == 0) {
  252. systemActive = true;
  253. led2.off();
  254. }
  255. if (systemActive) {
  256. if (zoneActive[zoneNumber]) {
  257. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  258. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  259. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  260. lastPumpTimer[zoneNumber] = millis();
  261. zonePump[zoneNumber] = true;
  262. }
  263. // Serial.println(sensor[zoneNumber]);
  264. }
  265. else if (zoneManual[zoneNumber]) {
  266. sensor[zoneNumber] = 0;
  267. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  268. if (!zonePump[zoneNumber]) {
  269. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  270. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  271. digitalWrite(output[zoneNumber], LOW);
  272. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  273. lastPumpTimer[zoneNumber] = millis();
  274. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  275. lastPumpTimer[zoneNumber] = millis();
  276. zonePump[zoneNumber] = true;
  277. }
  278. }
  279. }
  280. }
  281.  
  282. else {
  283.  
  284. zonePump[zoneNumber] = false;
  285. zoneSoak[zoneNumber] = false;
  286. sensor[zoneNumber] = 0;
  287. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  288. digitalWrite(output[zoneNumber], LOW);
  289. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  290. Blynk.virtualWrite(soakLedArray[zoneNumber], LOW);
  291. digitalWrite(mtrOutA1, LOW);
  292. digitalWrite(mtrOutB1, LOW);
  293. digitalWrite(mtrOutA2, LOW);
  294. digitalWrite(mtrOutB2, LOW);
  295.  
  296. }
  297. Blynk.virtualWrite(triggerDisplay[zoneNumber], triggerLow[zoneNumber]);
  298. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  299. Blynk.virtualWrite(pumpTimeArray[zoneNumber], pumpTimer[zoneNumber] / 1000);
  300.  
  301. if (zoneManual[zoneNumber]) {
  302. Blynk.virtualWrite(countdownArray[zoneNumber], pumpCountDown[zoneNumber] / 3600000);
  303. }
  304. else {
  305. Blynk.virtualWrite(countdownArray[zoneNumber], 0);
  306. }
  307. }
  308. for (zoneNumber = 3; zoneNumber > 0; zoneNumber = 0) {
  309.  
  310. int topWtrLvl = digitalRead(wtrLvlTop);
  311. int btmWtrLvl = digitalRead(wtrLvlBtm);
  312. if (btmWtrLvl == 1) {
  313. systemActive = false;
  314. led2.on();
  315. }
  316. else if (btmWtrLvl == 0) {
  317. systemActive = true;
  318. led2.off();
  319. }
  320.  
  321. if (systemActive) {
  322. if (zoneActive[zoneNumber]) {
  323. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  324. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  325. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  326. lastPumpTimer[zoneNumber] = millis();
  327. zonePump[zoneNumber] = true;
  328. }
  329. // Serial.println(sensor[zoneNumber]);
  330. }
  331. else if (zoneManual[zoneNumber]) {
  332. sensor[zoneNumber] = 0;
  333. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  334. if (!zoneManualPump[zoneNumber]) {
  335. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  336. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  337. digitalWrite(output[zoneNumber], LOW);
  338. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  339. lastPumpTimer[zoneNumber] = millis();
  340. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  341. lastPumpTimer[zoneNumber] = millis();
  342. zonePump[zoneNumber] = true;
  343. }
  344. }
  345. }
  346. }
  347.  
  348. else {
  349.  
  350. zonePump[zoneNumber] = false;
  351. zoneSoak[zoneNumber] = false;
  352. sensor[zoneNumber] = 0;
  353. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  354. digitalWrite(output[zoneNumber], LOW);
  355. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  356. Blynk.virtualWrite(soakLedArray[zoneNumber], LOW);
  357. digitalWrite(mtrOutA2, LOW);
  358. digitalWrite(mtrOutB2, LOW);
  359. digitalWrite(mtrOutA1, LOW);
  360. digitalWrite(mtrOutB1, LOW);
  361.  
  362. }
  363. Blynk.virtualWrite(triggerDisplay[zoneNumber], triggerLow[zoneNumber]);
  364. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  365. Blynk.virtualWrite(pumpTimeArray[zoneNumber], pumpTimer[zoneNumber] / 1000);
  366.  
  367. if (zoneManual[zoneNumber]) {
  368. Blynk.virtualWrite(countdownArray[zoneNumber], pumpCountDown[zoneNumber] / 3600000);
  369. }
  370. else {
  371. Blynk.virtualWrite(countdownArray[zoneNumber], 0);
  372. }
  373. }
  374. }
  375.  
  376. void zoneSoakCycle()
  377. {
  378. if (zoneSoak[zoneNumber]) {
  379. if ((unsigned long)(millis() - lastSoakTimer[zoneNumber]) >= soakTimer[zoneNumber])
  380. {
  381. zoneSoak[zoneNumber] = false;
  382. zoneActive[zoneNumber] = true;
  383. lastManualDayTimer[zoneNumber] = millis();
  384. }
  385. }
  386. }
  387.  
  388. void zoneControlManual() {
  389. if (zoneManual[zoneNumber]) {
  390. if (!zonePump[zoneNumber] && !zoneManualPump[zoneNumber]) {
  391. digitalWrite(output[zoneNumber], LOW);
  392. sensor[zoneNumber] = 0;
  393. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) > manualDayTimer[zoneNumber]) {
  394. zoneManualPump[zoneNumber] = true;
  395. digitalWrite(output[zoneNumber], HIGH);
  396. lastPumpTimer[zoneNumber] = millis();
  397. lastManualDayTimer[zoneNumber] = millis();
  398. zoneManual[zoneNumber] = false;
  399. }
  400. }
  401. }
  402. }
  403.  
  404. void zoneControl() {
  405. if (zoneAuto[zoneNumber]) {
  406. if (zoneActive[zoneNumber] && (!zonePump[zoneNumber] && !zoneManualPump[zoneNumber])) {
  407. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  408. digitalWrite(output[zoneNumber], LOW);
  409. if ((unsigned long)(millis() - lastSensorReadTime[zoneNumber]) >= sensorReadDelay[zoneNumber]) {
  410. lastSensorReadTime[zoneNumber] = millis();
  411.  
  412. // Set the sensor reading levels for the output trigger for sensor
  413. if (sensor[zoneNumber] >= triggerLow[zoneNumber]) {
  414. zonePump[zoneNumber] = true;
  415. digitalWrite(output[zoneNumber], HIGH);
  416. lastPumpTimer[zoneNumber] = millis();
  417. zoneActive[zoneNumber] = false;
  418. }
  419. }
  420. }
  421. }
  422. }
  423.  
  424.  
  425. void zoneControlPump() {
  426. if (zonePump[zoneNumber]) {
  427. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  428. digitalWrite(output[zoneNumber], LOW);
  429. zoneSoak[zoneNumber] = true;
  430. lastSensorReadTime[zoneNumber] = millis();
  431. zonePump[zoneNumber] = false;
  432. zoneManualPump[zoneNumber] = false;
  433. lastManualDayTimer[zoneNumber] = millis();
  434. }
  435. }
  436. else if (zoneManualPump[zoneNumber]) {
  437. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  438. digitalWrite(output[zoneNumber], LOW);
  439. zoneManual[zoneNumber] = true;
  440. zonePump[zoneNumber] = false;
  441. zoneManualPump[zoneNumber] = false;
  442. lastManualDayTimer[zoneNumber] = millis();
  443. }
  444. }
  445. else if (!zoneManualPump[zoneNumber] && !zonePump[zoneNumber]) {
  446. digitalWrite(output[zoneNumber], LOW);
  447. }
  448. }
  449.  
  450. void zoneWaterCycle()
  451. {
  452. if (*((uint32_t *)zonePump) > 0) {
  453. digitalWrite(mtrOutA2, HIGH);
  454. digitalWrite(mtrOutB2, HIGH);
  455. digitalWrite(mtrOutA1, LOW);
  456. digitalWrite(mtrOutB1, LOW);
  457. }
  458.  
  459. else {
  460. digitalWrite(mtrOutA1, LOW);
  461. digitalWrite(mtrOutB1, LOW);
  462. digitalWrite(mtrOutA2, LOW);
  463. digitalWrite(mtrOutB2, LOW);
  464. }
  465.  
  466.  
  467. if (zonePump[0]) {
  468. zoneActive[0] = false;
  469. sensor[0] = 0;
  470. digitalWrite(output[0], HIGH);
  471. Blynk.virtualWrite(ledArray[0], HIGH);
  472. if ((unsigned long)(millis() - lastPumpTimer[0]) >= pumpTimer[0])
  473. {
  474. digitalWrite(output[0], LOW);
  475. zonePump[0] = false;
  476. Blynk.virtualWrite(ledArray[0], LOW);
  477. zoneSoak[0] = true;
  478. lastSoakTimer[0] = millis();
  479. }
  480. }
  481. else if (zonePump[1]) {
  482. zoneActive[1] = false;
  483. sensor[1] = 0;
  484. digitalWrite(output[1], HIGH);
  485. Blynk.virtualWrite(ledArray[1], HIGH);
  486. if ((unsigned long)(millis() - lastPumpTimer[1]) >= pumpTimer[1])
  487. {
  488. digitalWrite(output[1], LOW);
  489. zonePump[1] = false;
  490. Blynk.virtualWrite(ledArray[1], LOW);
  491. zoneSoak[1] = true;
  492. lastSoakTimer[1] = millis();
  493. }
  494. }
  495. else if (zonePump[2]) {
  496. zoneActive[2] = false;
  497. sensor[2] = 0;
  498. digitalWrite(output[2], HIGH);
  499. Blynk.virtualWrite(ledArray[2], HIGH);
  500. if ((unsigned long)(millis() - lastPumpTimer[2]) >= pumpTimer[2])
  501. {
  502. digitalWrite(output[2], LOW);
  503. zonePump[2] = false;
  504. Blynk.virtualWrite(ledArray[2], LOW);
  505. zoneSoak[2] = true;
  506. lastSoakTimer[2] = millis();
  507. }
  508. }
  509. else if (zonePump[3]) {
  510. zoneActive[3] = false;
  511. sensor[3] = 0;
  512. digitalWrite(output[3], HIGH);
  513. Blynk.virtualWrite(ledArray[3], HIGH);
  514. if ((unsigned long)(millis() - lastPumpTimer[3]) >= pumpTimer[3])
  515. {
  516. digitalWrite(output[3], LOW);
  517. zonePump[3] = false;
  518. Blynk.virtualWrite(ledArray[3], LOW);
  519. zoneSoak[3] = true;
  520. lastSoakTimer[3] = millis();
  521. }
  522. }
  523. }
  524.  
  525. BLYNK_WRITE(V15)
  526. {
  527. triggerLow[0] = param.asInt();
  528. triggerHigh[0] = triggerLow[0] - triggerSpread[0];
  529. }
  530.  
  531. BLYNK_WRITE(V16)
  532. {
  533. triggerLow[1] = param.asInt();
  534. triggerHigh[1] = triggerLow[1] - triggerSpread[1];
  535. }
  536.  
  537. BLYNK_WRITE(V17)
  538. {
  539. triggerLow[2] = param.asInt();
  540. triggerHigh[2] = triggerLow[2] - triggerSpread[2];
  541. }
  542.  
  543. BLYNK_WRITE(V18)
  544. {
  545. triggerLow[3] = param.asInt();
  546. triggerHigh[3] = triggerLow[3] - triggerSpread[3];
  547. }
  548.  
  549. BLYNK_WRITE(V19)
  550. {
  551. zoneState[0] = param.asInt();
  552. if (zoneState[0] == 0) {
  553. zoneActive[0] = false;
  554. zoneManual[0] = true;
  555. lastPumpTimer[0] = millis();
  556. lastManualDayTimer[0] = millis();
  557. digitalWrite(output[0], LOW);
  558. ledStatus[0] = 0;
  559. Blynk.virtualWrite(ledArray[0], LOW);
  560. Blynk.virtualWrite(soakLedArray[0], LOW);
  561. }
  562. else {
  563. zoneActive[0] = true;
  564. zoneManual[0] = false;
  565. lastPumpTimer[0] = millis();
  566. lastManualDayTimer[0] = millis();
  567. }
  568. }
  569.  
  570. BLYNK_WRITE(V20)
  571. {
  572. zoneState[1] = param.asInt();
  573. if (zoneState[1] == 0) {
  574. zoneActive[1] = false;
  575. zoneManual[1] = true;
  576. lastPumpTimer[1] = millis();
  577. lastManualDayTimer[1] = millis();
  578. digitalWrite(output[1], LOW);
  579. ledStatus[1] = 0;
  580. Blynk.virtualWrite(ledArray[1], LOW);
  581. Blynk.virtualWrite(soakLedArray[1], LOW);
  582. }
  583. else {
  584. zoneActive[1] = true;
  585. zoneManual[1] = false;
  586. lastPumpTimer[1] = millis();
  587. lastManualDayTimer[1] = millis();
  588. }
  589. }
  590.  
  591. BLYNK_WRITE(V21)
  592. {
  593. zoneState[2] = param.asInt();
  594. if (zoneState[2] == 0){
  595. zoneActive[2] = false;
  596. zoneManual[2] = true;
  597. lastPumpTimer[2] = millis();
  598. lastManualDayTimer[2] = millis();
  599. digitalWrite(output[2], LOW);
  600. ledStatus[2] = 0;
  601. Blynk.virtualWrite(ledArray[2], LOW);
  602. Blynk.virtualWrite(soakLedArray[2], LOW);
  603. }
  604. else {
  605. zoneActive[2] = true;
  606. zoneManual[2] = false;
  607. lastPumpTimer[2] = millis();
  608. lastManualDayTimer[2] = millis();
  609. }
  610. }
  611.  
  612. BLYNK_WRITE(V22)
  613. {
  614. zoneState[3] = param.asInt();
  615. if (zoneState[3] == 0){
  616. zoneActive[3] = false;
  617. zoneManual[3] = true;
  618. lastPumpTimer[3] = millis();
  619. lastManualDayTimer[3] = millis();
  620. digitalWrite(output[3], LOW);
  621. ledStatus[3] = 0;
  622. Blynk.virtualWrite(ledArray[3], LOW);
  623. Blynk.virtualWrite(soakLedArray[3], LOW);
  624. }
  625. else {
  626. zoneActive[3] = true;
  627. zoneManual[3] = false;
  628. lastPumpTimer[3] = millis();
  629. lastManualDayTimer[3] = millis();
  630. }
  631. }
  632.  
  633.  
  634. BLYNK_WRITE(V31)
  635. {
  636. zonePump[0] = true;
  637. lastPumpTimer[0] = millis();
  638. }
  639.  
  640. BLYNK_WRITE(V32)
  641. {
  642. zonePump[1] = true;
  643. lastPumpTimer[1] = millis();
  644. }
  645.  
  646. BLYNK_WRITE(V33)
  647. {
  648. zonePump[2] = true;
  649. lastPumpTimer[2] = millis();
  650. }
  651.  
  652. BLYNK_WRITE(V34)
  653. {
  654. zonePump[3] = true;
  655. lastPumpTimer[3] = millis();
  656. }
  657.  
  658. BLYNK_WRITE(V39)
  659. {
  660. manualDayTimer[0] = param.asInt();
  661. }
  662.  
  663. BLYNK_WRITE(V40)
  664. {
  665. manualDayTimer[1] = param.asInt();
  666. }
  667.  
  668. BLYNK_WRITE(V41)
  669. {
  670. manualDayTimer[2] = param.asInt();
  671. }
  672.  
  673. BLYNK_WRITE(V42)
  674. {
  675. manualDayTimer[3] = param.asInt();
  676. }
  677.  
  678. BLYNK_WRITE(V43)
  679. {
  680. pumpTimer[0] = param.asInt();
  681. }
  682.  
  683. BLYNK_WRITE(V44)
  684. {
  685. pumpTimer[1] = param.asInt();
  686. }
  687.  
  688. BLYNK_WRITE(V45)
  689. {
  690. pumpTimer[2] = param.asInt();
  691. }
  692.  
  693. BLYNK_WRITE(V46)
  694. {
  695. pumpTimer[3] = param.asInt();
  696. }
  697.  
  698. BLYNK_WRITE(V51)
  699. {
  700. if (param.asInt() == 0) {
  701. zoneActive[0] = false;
  702. zonePump[0] = false;
  703. zoneSoak[0] = false;
  704. digitalWrite(output[0], LOW);
  705. ledStatus[0] = 0;
  706. sensor[0] = 0;
  707. Blynk.virtualWrite(ledArray[0], LOW);
  708. Blynk.virtualWrite(soakLedArray[0], LOW);
  709. }
  710. else {
  711. zoneActive[0] = true;
  712. }
  713. }
  714.  
  715. BLYNK_WRITE(V52)
  716. {
  717. if (param.asInt() == 0) {
  718. zoneActive[1] = false;
  719. zonePump[1] = false;
  720. zoneSoak[1] = false;
  721. digitalWrite(output[1], LOW);
  722. ledStatus[1] = 0;
  723. sensor[1] = 0;
  724. Blynk.virtualWrite(ledArray[1], LOW);
  725. Blynk.virtualWrite(soakLedArray[1], LOW);
  726. }
  727. else {
  728. zoneActive[1] = true;
  729. }
  730. }
  731.  
  732. BLYNK_WRITE(V53)
  733. {
  734. if (param.asInt() == 0) {
  735. zoneActive[2] = false;
  736. zonePump[2] = false;
  737. zoneSoak[2] = false;
  738. digitalWrite(output[2], LOW);
  739. ledStatus[2] = 0;
  740. sensor[2] = 0;
  741. Blynk.virtualWrite(ledArray[2], LOW);
  742. Blynk.virtualWrite(soakLedArray[2], LOW);
  743. }
  744. else {
  745. zoneActive[2] = true;
  746. }
  747. }
  748.  
  749. BLYNK_WRITE(V54)
  750. {
  751. if (param.asInt() == 0) {
  752. zoneActive[3] = false;
  753. zonePump[3] = false;
  754. zoneSoak[3] = false;
  755. digitalWrite(output[3], LOW);
  756. ledStatus[3] = 0;
  757. sensor[3] = 0;
  758. Blynk.virtualWrite(ledArray[3], LOW);
  759. Blynk.virtualWrite(soakLedArray[3], LOW);
  760. }
  761. else {
  762. zoneActive[3] = true;
  763. }
  764. }
  765.  
  766. void loop() {
  767. BlynkEdgent.run();
  768. timer.run();
  769. zoneLoop();
  770. }
  771.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement