Advertisement
hms11

ESP32ZoneCommandEdgentRev0.3.5

Feb 28th, 2022
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.25 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.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 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[] = {3500,3500,3500,3500};
  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. // set Water Level Pins to Input
  104. pinMode(wtrLvlTop, INPUT);
  105. pinMode(wtrLvlBtm, INPUT);
  106.  
  107. //Blynk Timers
  108. BlynkEdgent.begin();
  109. timer.setInterval(250L,blynkData);
  110. timer.setInterval(1000L,waterLevel);
  111. //timer.setInterval(500, zoneWater);
  112.  
  113. Serial.begin(115200);
  114. delay(100);
  115.  
  116. }
  117.  
  118.  
  119. void sensorRead()
  120. {
  121. for (zoneNumber = 0; zoneNumber < 3; zoneNumber++) {
  122. if (zoneActive[zoneNumber]) {
  123. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  124. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  125. digitalWrite(output[zoneNumber], HIGH);
  126. ledStatus[zoneNumber] = 1;
  127. }
  128. else if (sensor[zoneNumber] < triggerHigh[zoneNumber]) {
  129. digitalWrite(output[zoneNumber], LOW);
  130. ledStatus[zoneNumber] = 0;
  131. }
  132. Serial.println(sensor[zoneNumber]);
  133. }
  134. if (zoneManual[zoneNumber]) {
  135. sensor[zoneNumber] = 0;
  136. if (!zonePump[zoneNumber]) {
  137. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  138. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  139. digitalWrite(output[zoneNumber], LOW);
  140. ledStatus[zoneNumber] = 0;
  141. lastPumpTimer[zoneNumber] = millis();
  142. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  143. lastManualDayTimer[zoneNumber] = millis();
  144. zonePump[zoneNumber] = true;
  145. digitalWrite(output[zoneNumber], HIGH);
  146. ledStatus[zoneNumber] = 1;
  147. }
  148. }
  149. else if (zonePump[zoneNumber]) {
  150. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  151. zonePump[zoneNumber] = false;
  152. }
  153. }
  154. }
  155. }
  156. for (zoneNumber = 3; zoneNumber > 0; zoneNumber = 0) {
  157. if (zoneActive[zoneNumber]) {
  158. sensor[zoneNumber] = analogRead(sensPin[zoneNumber]);
  159. if (sensor[zoneNumber] > triggerLow[zoneNumber]) {
  160. digitalWrite(output[zoneNumber], HIGH);
  161. ledStatus[zoneNumber] = 1;
  162. }
  163. else if (sensor[zoneNumber] < triggerHigh[zoneNumber]) {
  164. digitalWrite(output[zoneNumber], LOW);
  165. ledStatus[zoneNumber] = 0;
  166. }
  167. Serial.println(sensor[zoneNumber]);
  168. }
  169. if (zoneManual[zoneNumber]) {
  170. sensor[zoneNumber] = 0;
  171. if (!zonePump[zoneNumber]) {
  172. pumpCountDown[zoneNumber] = ((unsigned long)(millis() - lastManualDayTimer[zoneNumber])) - manualDayTimer[zoneNumber];
  173. pumpCountDown[zoneNumber] = pumpCountDown[zoneNumber] * -1;
  174. digitalWrite(output[zoneNumber], LOW);
  175. ledStatus[zoneNumber] = 0;
  176. lastPumpTimer[zoneNumber] = millis();
  177. if ((unsigned long)(millis() - lastManualDayTimer[zoneNumber]) >= manualDayTimer[zoneNumber]) {
  178. lastManualDayTimer[zoneNumber] = millis();
  179. zonePump[zoneNumber] = true;
  180. digitalWrite(output[zoneNumber], HIGH);
  181. ledStatus[zoneNumber] = 1;
  182. }
  183. }
  184. else if (zonePump[zoneNumber]) {
  185. if ((unsigned long)(millis() - lastPumpTimer[zoneNumber]) >= pumpTimer[zoneNumber]) {
  186. zonePump[zoneNumber] = false;
  187. }
  188. }
  189. }
  190. }
  191. }
  192.  
  193.  
  194. void blynkData()
  195. {
  196.  
  197. for (blynkZone = 0; blynkZone < 3; blynkZone++) {
  198. Blynk.virtualWrite(sensorData[blynkZone], sensor[blynkZone]);
  199. Blynk.virtualWrite(triggerDisplay[blynkZone], triggerLow[blynkZone]);
  200. Blynk.virtualWrite(spreadDisplay[blynkZone], triggerSpread[blynkZone]);
  201. Blynk.virtualWrite(pumpTimeArray[blynkZone], pumpTimer[blynkZone] / 60000);
  202.  
  203. if (zoneManual[blynkZone]) {
  204. Blynk.virtualWrite(countdownArray[blynkZone], pumpCountDown[blynkZone] / 3600000);
  205. }
  206. else {
  207. Blynk.virtualWrite(countdownArray[blynkZone], 0);
  208. }
  209. if (ledStatus[blynkZone] == 1) {
  210. Blynk.virtualWrite(ledArray[blynkZone], HIGH);
  211. }
  212. else {
  213. Blynk.virtualWrite(ledArray[blynkZone], LOW);
  214. }
  215. }
  216. for (blynkZone = 3; blynkZone > 0; blynkZone = 0) {
  217. Blynk.virtualWrite(sensorData[blynkZone], sensor[blynkZone]);
  218. Blynk.virtualWrite(triggerDisplay[blynkZone], triggerLow[blynkZone]);
  219. Blynk.virtualWrite(spreadDisplay[blynkZone], triggerSpread[blynkZone]);
  220. Blynk.virtualWrite(pumpTimeArray[blynkZone], pumpTimer[blynkZone] / 60000);
  221.  
  222. if (zoneManual[blynkZone]) {
  223. Blynk.virtualWrite(countdownArray[blynkZone], pumpCountDown[blynkZone] / 3600000);
  224. }
  225. else {
  226. Blynk.virtualWrite(countdownArray[blynkZone], 0);
  227. }
  228. if (ledStatus[blynkZone] == 1) {
  229. Blynk.virtualWrite(ledArray[blynkZone], HIGH);
  230. }
  231. else {
  232. Blynk.virtualWrite(ledArray[blynkZone], LOW);
  233. }
  234. }
  235.  
  236. }
  237.  
  238. void waterLevel()
  239. {
  240. int topWtrLvl = analogRead(wtrLvlTop);
  241. int btmWtrLvl = analogRead(wtrLvlBtm);
  242. if (btmWtrLvl > lowWater) {
  243. digitalWrite(mtrOutA1, HIGH);
  244. digitalWrite(mtrOutA2, LOW);
  245. led1.on();
  246. led2.on();
  247. }
  248. if (topWtrLvl < highWater) {
  249. digitalWrite(mtrOutA1, LOW);
  250. digitalWrite(mtrOutA2, LOW);
  251. led1.off();
  252. led2.off();
  253. led3.on();
  254. }
  255. }
  256.  
  257. BLYNK_WRITE(V15)
  258. {
  259. triggerLow[0] = param.asInt();
  260. triggerHigh[0] = triggerLow[0] - triggerSpread[0];
  261. }
  262.  
  263. BLYNK_WRITE(V16)
  264. {
  265. triggerLow[1] = param.asInt();
  266. triggerHigh[1] = triggerLow[1] - triggerSpread[1];
  267. }
  268.  
  269. BLYNK_WRITE(V17)
  270. {
  271. triggerLow[2] = param.asInt();
  272. triggerHigh[2] = triggerLow[2] - triggerSpread[2];
  273. }
  274.  
  275. BLYNK_WRITE(V18)
  276. {
  277. triggerLow[3] = param.asInt();
  278. triggerHigh[3] = triggerLow[3] - triggerSpread[3];
  279. }
  280.  
  281. BLYNK_WRITE(V19)
  282. {
  283. if (zoneActive[0]){
  284. zoneActive[0] = false;
  285. zoneManual[0] = true;
  286. lastPumpTimer[0] = millis();
  287. lastManualDayTimer[0] = millis();
  288. digitalWrite(output[0], LOW);
  289. ledStatus[0] = 0;
  290. }
  291. else if (zoneManual[0]){
  292. zoneActive[0] = true;
  293. zoneManual[0] = false;
  294. lastPumpTimer[0] = millis();
  295. lastManualDayTimer[0] = millis();
  296. }
  297. }
  298.  
  299. BLYNK_WRITE(V20)
  300. {
  301. if (zoneActive[1]){
  302. zoneActive[1] = false;
  303. zoneManual[1] = true;
  304. lastPumpTimer[1] = millis();
  305. lastManualDayTimer[1] = millis();
  306. digitalWrite(output[1], LOW);
  307. ledStatus[1] = 0;
  308. }
  309. else if (zoneManual[1]){
  310. zoneActive[1] = true;
  311. zoneManual[1] = false;
  312. lastPumpTimer[1] = millis();
  313. lastManualDayTimer[1] = millis();
  314. }
  315. }
  316.  
  317. BLYNK_WRITE(V21)
  318. {
  319. if (zoneActive[2]){
  320. zoneActive[2] = false;
  321. zoneManual[2] = true;
  322. lastPumpTimer[2] = millis();
  323. lastManualDayTimer[2] = millis();
  324. digitalWrite(output[2], LOW);
  325. ledStatus[2] = 0;
  326. }
  327. else if (zoneManual[2]){
  328. zoneActive[2] = true;
  329. zoneManual[2] = false;
  330. lastPumpTimer[2] = millis();
  331. lastManualDayTimer[2] = millis();
  332. }
  333. }
  334.  
  335. BLYNK_WRITE(V22)
  336. {
  337. if (zoneActive[3]){
  338. zoneActive[3] = false;
  339. zoneManual[3] = true;
  340. lastPumpTimer[3] = millis();
  341. lastManualDayTimer[3] = millis();
  342. digitalWrite(output[3], LOW);
  343. ledStatus[3] = 0;
  344. }
  345. else if (zoneManual[3]){
  346. zoneActive[3] = true;
  347. zoneManual[3] = false;
  348. lastPumpTimer[3] = millis();
  349. lastManualDayTimer[3] = millis();
  350. }
  351. }
  352.  
  353. BLYNK_WRITE(V27)
  354. {
  355. triggerSpread[0] = param.asInt();
  356. }
  357.  
  358. BLYNK_WRITE(V28)
  359. {
  360. triggerSpread[1] = param.asInt();
  361. }
  362.  
  363. BLYNK_WRITE(V29)
  364. {
  365. triggerSpread[2] = param.asInt();
  366. }
  367.  
  368. BLYNK_WRITE(V30)
  369. {
  370. triggerSpread[3] = param.asInt();
  371. }
  372.  
  373. BLYNK_WRITE(V31)
  374. {
  375. zoneActive[0] = false;
  376. sensor[0] = 0;
  377. digitalWrite(output[0], HIGH);
  378. ledStatus[0] = 1;
  379. timer.setTimeout(pumpTimer[0], []()
  380. {
  381. zoneActive[0] = true;
  382. lastManualDayTimer[0] = millis();
  383. digitalWrite(output[0], LOW);
  384. ledStatus[0] = 0;
  385. });
  386. }
  387.  
  388. BLYNK_WRITE(V32)
  389. {
  390. zoneActive[1] = false;
  391. sensor[1] = 0;
  392. digitalWrite(output[1], HIGH);
  393. ledStatus[1] = 1;
  394. timer.setTimeout(pumpTimer[1], []()
  395. {
  396. zoneActive[1] = true;
  397. lastManualDayTimer[1] = millis();
  398. digitalWrite(output[1], LOW);
  399. ledStatus[1] = 0;
  400. });
  401. }
  402.  
  403. BLYNK_WRITE(V33)
  404. {
  405. zoneActive[2] = false;
  406. sensor[2] = 0;
  407. digitalWrite(output[2], HIGH);
  408. ledStatus[2] = 1;
  409. timer.setTimeout(pumpTimer[2], []()
  410. {
  411. zoneActive[2] = true;
  412. lastManualDayTimer[2] = millis();
  413. digitalWrite(output[2], LOW);
  414. ledStatus[2] = 0;
  415. });
  416. }
  417.  
  418. BLYNK_WRITE(V34)
  419. {
  420. zoneActive[3] = false;
  421. sensor[3] = 0;
  422. digitalWrite(output[3], HIGH);
  423. ledStatus[3] = 1;
  424. timer.setTimeout(pumpTimer[3], []()
  425. {
  426. zoneActive[3] = true;
  427. lastManualDayTimer[3] = millis();
  428. digitalWrite(output[3], LOW);
  429. ledStatus[3] = 0;
  430. });
  431. }
  432.  
  433. BLYNK_WRITE(V39)
  434. {
  435. manualDayTimer[0] = param.asInt();
  436. }
  437.  
  438. BLYNK_WRITE(V40)
  439. {
  440. manualDayTimer[1] = param.asInt();
  441. }
  442.  
  443. BLYNK_WRITE(V41)
  444. {
  445. manualDayTimer[2] = param.asInt();
  446. }
  447.  
  448. BLYNK_WRITE(V42)
  449. {
  450. manualDayTimer[3] = param.asInt();
  451. }
  452.  
  453. BLYNK_WRITE(V43)
  454. {
  455. pumpTimer[0] = param.asInt();
  456. }
  457.  
  458. BLYNK_WRITE(V44)
  459. {
  460. pumpTimer[1] = param.asInt();
  461. }
  462.  
  463. BLYNK_WRITE(V45)
  464. {
  465. pumpTimer[2] = param.asInt();
  466. }
  467.  
  468. BLYNK_WRITE(V46)
  469. {
  470. pumpTimer[3] = param.asInt();
  471. }
  472.  
  473. BLYNK_WRITE(V51)
  474. {
  475. if (param.asInt() == 0) {
  476. zoneActive[0] = false;
  477. sensor[0] = 0;
  478. }
  479. else {
  480. zoneActive[0] = true;
  481. }
  482. }
  483.  
  484. BLYNK_WRITE(V52)
  485. {
  486. if (param.asInt() == 0) {
  487. zoneActive[1] = false;
  488. sensor[1] = 0;
  489. }
  490. else {
  491. zoneActive[1] = true;
  492. }
  493. }
  494.  
  495. BLYNK_WRITE(V53)
  496. {
  497. if (param.asInt() == 0) {
  498. zoneActive[2] = false;
  499. sensor[2] = 0;
  500. }
  501. else {
  502. zoneActive[2] = true;
  503. }
  504. }
  505.  
  506. BLYNK_WRITE(V54)
  507. {
  508. if (param.asInt() == 0) {
  509. zoneActive[3] = false;
  510. sensor[3] = 0;
  511. }
  512. else {
  513. zoneActive[3] = true;
  514. }
  515. }
  516.  
  517. void loop() {
  518. BlynkEdgent.run();
  519. timer.run();
  520. sensorRead();
  521. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement