Advertisement
hms11

ESP32ZoneCommandEdgentRev0.3.3

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