Advertisement
hms11

ESP32ZoneCommandEdgent0.6.2

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