Advertisement
hms11

ESP32ZoneCommandEdgentRev0.4.0

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