Advertisement
hms11

ESP32ZoneCommandEdgent0.6.4

Jul 27th, 2022
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.91 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.4"
  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. ledcWrite(pwmChannel, 0);
  204.  
  205. }
  206. Blynk.virtualWrite(triggerDisplay[zoneNumber], triggerLow[zoneNumber]);
  207. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  208. Blynk.virtualWrite(pumpTimeArray[zoneNumber], pumpTimer[zoneNumber] / 1000);
  209.  
  210. if (zoneManual[zoneNumber]) {
  211. Blynk.virtualWrite(countdownArray[zoneNumber], pumpCountDown[zoneNumber] / 3600000);
  212. }
  213. else {
  214. Blynk.virtualWrite(countdownArray[zoneNumber], 0);
  215. }
  216. }
  217. for (zoneNumber = 3; zoneNumber > 0; zoneNumber = 0) {
  218.  
  219. int topWtrLvl = digitalRead(wtrLvlTop);
  220. int btmWtrLvl = digitalRead(wtrLvlBtm);
  221. if (btmWtrLvl == 1) {
  222. systemActive = false;
  223. led2.on();
  224. }
  225. else if (btmWtrLvl == 0) {
  226. systemActive = true;
  227. led2.off();
  228. }
  229.  
  230. if (systemActive) {
  231. if (zoneActive[zoneNumber]) {
  232. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  233. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  234. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  235. lastPumpTimer[zoneNumber] = millis();
  236. zonePump[zoneNumber] = true;
  237. }
  238. // Serial.println(sensor[zoneNumber]);
  239. }
  240. else if (zoneManual[zoneNumber]) {
  241. sensor[zoneNumber] = 0;
  242. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  243. if (!zonePump[zoneNumber]) {
  244. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  245. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  246. digitalWrite(output[zoneNumber], LOW);
  247. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  248. lastPumpTimer[zoneNumber] = millis();
  249. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  250. zonePump[zoneNumber] = true;
  251. }
  252. }
  253. }
  254. }
  255.  
  256. else {
  257.  
  258. zonePump[zoneNumber] = false;
  259. zoneSoak[zoneNumber] = false;
  260. sensor[zoneNumber] = 0;
  261. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  262. digitalWrite(output[zoneNumber], LOW);
  263. Blynk.virtualWrite(ledArray[zoneNumber], LOW);
  264. Blynk.virtualWrite(soakLedArray[zoneNumber], LOW);
  265. ledcWrite(pwmChannel, 0);
  266.  
  267. }
  268. Blynk.virtualWrite(triggerDisplay[zoneNumber], triggerLow[zoneNumber]);
  269. Blynk.virtualWrite(sensorData[zoneNumber], sensor[zoneNumber]);
  270. Blynk.virtualWrite(pumpTimeArray[zoneNumber], pumpTimer[zoneNumber] / 1000);
  271.  
  272. if (zoneManual[zoneNumber]) {
  273. Blynk.virtualWrite(countdownArray[zoneNumber], pumpCountDown[zoneNumber] / 3600000);
  274. }
  275. else {
  276. Blynk.virtualWrite(countdownArray[zoneNumber], 0);
  277. }
  278. }
  279. }
  280.  
  281. void zoneSoakCycle()
  282. {
  283. if (zoneSoak[0]) {
  284. Blynk.virtualWrite(soakLedArray[0], HIGH);
  285. if ((unsigned long)(millis() - lastSoakTimer[0]) >= soakTimer[0])
  286. {
  287. zoneSoak[0] = false;
  288. zoneActive[0] = true;
  289. lastManualDayTimer[0] = millis();
  290. Blynk.virtualWrite(soakLedArray[0], LOW);
  291. }
  292. }
  293. else if (zoneSoak[1]) {
  294. Blynk.virtualWrite(soakLedArray[1], HIGH);
  295. if ((unsigned long)(millis() - lastSoakTimer[1]) >= soakTimer[1])
  296. {
  297. zoneSoak[1] = false;
  298. zoneActive[1] = true;
  299. lastManualDayTimer[1] = millis();
  300. Blynk.virtualWrite(soakLedArray[1], LOW);
  301. }
  302. }
  303. else if (zoneSoak[2]) {
  304. Blynk.virtualWrite(soakLedArray[2], HIGH);
  305. if ((unsigned long)(millis() - lastSoakTimer[2]) >= soakTimer[2])
  306. {
  307. zoneSoak[2] = false;
  308. zoneActive[2] = true;
  309. lastManualDayTimer[2] = millis();
  310. Blynk.virtualWrite(soakLedArray[2], LOW);
  311. }
  312. }
  313. else if (zoneSoak[3]) {
  314. Blynk.virtualWrite(soakLedArray[3], HIGH);
  315. if ((unsigned long)(millis() - lastSoakTimer[3]) >= soakTimer[3])
  316. {
  317. zoneSoak[3] = false;
  318. zoneActive[3] = true;
  319. lastManualDayTimer[3] = millis();
  320. Blynk.virtualWrite(soakLedArray[3], LOW);
  321. }
  322. }
  323. }
  324.  
  325. void zoneWaterCycle()
  326. {
  327. if (*((uint32_t *)zonePump) > 0) {
  328. ledcWrite(pwmChannel, dutyCycle);
  329. }
  330.  
  331. else {
  332. ledcWrite(pwmChannel, 0);
  333. }
  334.  
  335.  
  336. if (zonePump[0]) {
  337. zoneActive[0] = false;
  338. sensor[0] = 0;
  339. digitalWrite(output[0], HIGH);
  340. Blynk.virtualWrite(ledArray[0], HIGH);
  341. if ((unsigned long)(millis() - lastPumpTimer[0]) >= pumpTimer[0])
  342. {
  343. digitalWrite(output[0], LOW);
  344. zonePump[0] = false;
  345. Blynk.virtualWrite(ledArray[0], LOW);
  346. zoneSoak[0] = true;
  347. lastSoakTimer[0] = millis();
  348. }
  349. }
  350. else if (zonePump[1]) {
  351. zoneActive[1] = false;
  352. sensor[1] = 0;
  353. digitalWrite(output[1], HIGH);
  354. Blynk.virtualWrite(ledArray[1], HIGH);
  355. if ((unsigned long)(millis() - lastPumpTimer[1]) >= pumpTimer[1])
  356. {
  357. digitalWrite(output[1], LOW);
  358. zonePump[1] = false;
  359. Blynk.virtualWrite(ledArray[1], LOW);
  360. zoneSoak[1] = true;
  361. lastSoakTimer[1] = millis();
  362. }
  363. }
  364. else if (zonePump[2]) {
  365. zoneActive[2] = false;
  366. sensor[2] = 0;
  367. digitalWrite(output[2], HIGH);
  368. Blynk.virtualWrite(ledArray[2], HIGH);
  369. if ((unsigned long)(millis() - lastPumpTimer[2]) >= pumpTimer[2])
  370. {
  371. digitalWrite(output[2], LOW);
  372. zonePump[2] = false;
  373. Blynk.virtualWrite(ledArray[2], LOW);
  374. zoneSoak[2] = true;
  375. lastSoakTimer[2] = millis();
  376. }
  377. }
  378. else if (zonePump[3]) {
  379. zoneActive[3] = false;
  380. sensor[3] = 0;
  381. digitalWrite(output[3], HIGH);
  382. Blynk.virtualWrite(ledArray[3], HIGH);
  383. if ((unsigned long)(millis() - lastPumpTimer[3]) >= pumpTimer[3])
  384. {
  385. digitalWrite(output[3], LOW);
  386. zonePump[3] = false;
  387. Blynk.virtualWrite(ledArray[3], LOW);
  388. zoneSoak[3] = true;
  389. lastSoakTimer[3] = millis();
  390. }
  391. }
  392. }
  393.  
  394. BLYNK_WRITE(V15)
  395. {
  396. triggerLow[0] = param.asInt();
  397. triggerHigh[0] = triggerLow[0] - triggerSpread[0];
  398. }
  399.  
  400. BLYNK_WRITE(V16)
  401. {
  402. triggerLow[1] = param.asInt();
  403. triggerHigh[1] = triggerLow[1] - triggerSpread[1];
  404. }
  405.  
  406. BLYNK_WRITE(V17)
  407. {
  408. triggerLow[2] = param.asInt();
  409. triggerHigh[2] = triggerLow[2] - triggerSpread[2];
  410. }
  411.  
  412. BLYNK_WRITE(V18)
  413. {
  414. triggerLow[3] = param.asInt();
  415. triggerHigh[3] = triggerLow[3] - triggerSpread[3];
  416. }
  417.  
  418. BLYNK_WRITE(V19)
  419. {
  420. zoneState[0] = param.asInt();
  421. if (zoneState[0] == 0) {
  422. zoneActive[0] = false;
  423. zoneManual[0] = true;
  424. lastPumpTimer[0] = millis();
  425. lastManualDayTimer[0] = millis();
  426. digitalWrite(output[0], LOW);
  427. ledStatus[0] = 0;
  428. Blynk.virtualWrite(ledArray[0], LOW);
  429. Blynk.virtualWrite(soakLedArray[0], LOW);
  430. }
  431. else {
  432. zoneActive[0] = true;
  433. zoneManual[0] = false;
  434. lastPumpTimer[0] = millis();
  435. lastManualDayTimer[0] = millis();
  436. }
  437. }
  438.  
  439. BLYNK_WRITE(V20)
  440. {
  441. zoneState[1] = param.asInt();
  442. if (zoneState[1] == 0) {
  443. zoneActive[1] = false;
  444. zoneManual[1] = true;
  445. lastPumpTimer[1] = millis();
  446. lastManualDayTimer[1] = millis();
  447. digitalWrite(output[1], LOW);
  448. ledStatus[1] = 0;
  449. Blynk.virtualWrite(ledArray[1], LOW);
  450. Blynk.virtualWrite(soakLedArray[1], LOW);
  451. }
  452. else {
  453. zoneActive[1] = true;
  454. zoneManual[1] = false;
  455. lastPumpTimer[1] = millis();
  456. lastManualDayTimer[1] = millis();
  457. }
  458. }
  459.  
  460. BLYNK_WRITE(V21)
  461. {
  462. zoneState[2] = param.asInt();
  463. if (zoneState[2] == 0){
  464. zoneActive[2] = false;
  465. zoneManual[2] = true;
  466. lastPumpTimer[2] = millis();
  467. lastManualDayTimer[2] = millis();
  468. digitalWrite(output[2], LOW);
  469. ledStatus[2] = 0;
  470. Blynk.virtualWrite(ledArray[2], LOW);
  471. Blynk.virtualWrite(soakLedArray[2], LOW);
  472. }
  473. else {
  474. zoneActive[2] = true;
  475. zoneManual[2] = false;
  476. lastPumpTimer[2] = millis();
  477. lastManualDayTimer[2] = millis();
  478. }
  479. }
  480.  
  481. BLYNK_WRITE(V22)
  482. {
  483. zoneState[3] = param.asInt();
  484. if (zoneState[3] == 0){
  485. zoneActive[3] = false;
  486. zoneManual[3] = true;
  487. lastPumpTimer[3] = millis();
  488. lastManualDayTimer[3] = millis();
  489. digitalWrite(output[3], LOW);
  490. ledStatus[3] = 0;
  491. Blynk.virtualWrite(ledArray[3], LOW);
  492. Blynk.virtualWrite(soakLedArray[3], LOW);
  493. }
  494. else {
  495. zoneActive[3] = true;
  496. zoneManual[3] = false;
  497. lastPumpTimer[3] = millis();
  498. lastManualDayTimer[3] = millis();
  499. }
  500. }
  501.  
  502.  
  503. BLYNK_WRITE(V31)
  504. {
  505. zonePump[0] = true;
  506. }
  507.  
  508. BLYNK_WRITE(V32)
  509. {
  510. zonePump[1] = true;
  511. }
  512.  
  513. BLYNK_WRITE(V33)
  514. {
  515. zonePump[2] = true;
  516. }
  517.  
  518. BLYNK_WRITE(V34)
  519. {
  520. zonePump[3] = true;
  521. }
  522.  
  523. BLYNK_WRITE(V39)
  524. {
  525. manualDayTimer[0] = param.asInt();
  526. }
  527.  
  528. BLYNK_WRITE(V40)
  529. {
  530. manualDayTimer[1] = param.asInt();
  531. }
  532.  
  533. BLYNK_WRITE(V41)
  534. {
  535. manualDayTimer[2] = param.asInt();
  536. }
  537.  
  538. BLYNK_WRITE(V42)
  539. {
  540. manualDayTimer[3] = param.asInt();
  541. }
  542.  
  543. BLYNK_WRITE(V43)
  544. {
  545. pumpTimer[0] = param.asInt();
  546. }
  547.  
  548. BLYNK_WRITE(V44)
  549. {
  550. pumpTimer[1] = param.asInt();
  551. }
  552.  
  553. BLYNK_WRITE(V45)
  554. {
  555. pumpTimer[2] = param.asInt();
  556. }
  557.  
  558. BLYNK_WRITE(V46)
  559. {
  560. pumpTimer[3] = param.asInt();
  561. }
  562.  
  563. BLYNK_WRITE(V51)
  564. {
  565. if (param.asInt() == 0) {
  566. zoneActive[0] = false;
  567. zonePump[0] = false;
  568. zoneSoak[0] = false;
  569. digitalWrite(output[0], LOW);
  570. ledStatus[0] = 0;
  571. sensor[0] = 0;
  572. Blynk.virtualWrite(ledArray[0], LOW);
  573. Blynk.virtualWrite(soakLedArray[0], LOW);
  574. }
  575. else {
  576. zoneActive[0] = true;
  577. }
  578. }
  579.  
  580. BLYNK_WRITE(V52)
  581. {
  582. if (param.asInt() == 0) {
  583. zoneActive[1] = false;
  584. zonePump[1] = false;
  585. zoneSoak[1] = false;
  586. digitalWrite(output[1], LOW);
  587. ledStatus[1] = 0;
  588. sensor[1] = 0;
  589. Blynk.virtualWrite(ledArray[1], LOW);
  590. Blynk.virtualWrite(soakLedArray[1], LOW);
  591. }
  592. else {
  593. zoneActive[1] = true;
  594. }
  595. }
  596.  
  597. BLYNK_WRITE(V53)
  598. {
  599. if (param.asInt() == 0) {
  600. zoneActive[2] = false;
  601. zonePump[2] = false;
  602. zoneSoak[2] = false;
  603. digitalWrite(output[2], LOW);
  604. ledStatus[2] = 0;
  605. sensor[2] = 0;
  606. Blynk.virtualWrite(ledArray[2], LOW);
  607. Blynk.virtualWrite(soakLedArray[2], LOW);
  608. }
  609. else {
  610. zoneActive[2] = true;
  611. }
  612. }
  613.  
  614. BLYNK_WRITE(V54)
  615. {
  616. if (param.asInt() == 0) {
  617. zoneActive[3] = false;
  618. zonePump[3] = false;
  619. zoneSoak[3] = false;
  620. digitalWrite(output[3], LOW);
  621. ledStatus[3] = 0;
  622. sensor[3] = 0;
  623. Blynk.virtualWrite(ledArray[3], LOW);
  624. Blynk.virtualWrite(soakLedArray[3], LOW);
  625. }
  626. else {
  627. zoneActive[3] = true;
  628. }
  629. }
  630.  
  631. void loop() {
  632. BlynkEdgent.run();
  633. timer.run();
  634. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement