Advertisement
hms11

ESP32ZoneCommandEdgent0.6.5

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