The arduino nano portion of the project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

472 lines
12 KiB

5 years ago
  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include "RTClib.h"
  4. #include <ArduinoJson.h>
  5. #include <SoftwareSerial.h>
  6. #include <Streaming.h>
  7. #include <SPI.h>
  8. #define RELAY_ON 0
  9. #define RELAY_OFF 1
  10. // #define ESP_TO_ARDUINO_PIN 2
  11. SoftwareSerial s(5, 6); //RX,TX
  12. RTC_DS1307 rtc;
  13. struct ballast
  14. {
  15. int id;
  16. int shour;
  17. int smin;
  18. uint32_t fadePeriod;
  19. int ehour;
  20. int emin;
  21. int stage;
  22. int brightness;
  23. int pin;
  24. unsigned long fadeStartMillis;
  25. int relayPin;
  26. };
  27. struct ballast ballast1, ballast2, ballast3;
  28. // struct ballast ballasts[3];
  29. void setupBallast(ballast *b);
  30. void setupBallast(ballast *b, JsonObject &root, int i);
  31. void doBallast(ballast *b);
  32. void updateBallast(ballast *b, JsonObject &root);
  33. void manualMode(ballast *b);
  34. int getFreeRam();
  35. const size_t bufferSize = JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(2) + 3 * JSON_OBJECT_SIZE(5) + 180;
  36. unsigned long currentMillis;
  37. unsigned long loopMillis;
  38. unsigned long loopPeriod = 1000;
  39. unsigned long data_send_millis;
  40. unsigned long data_send_period = 2000;
  41. static bool manualFlag;
  42. // char roul[] = "is a fag";
  43. // char data[60];
  44. void setup()
  45. {
  46. // put your setup code here, to run once:
  47. Serial.begin(115200);
  48. //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  49. //Tell me esp that arduino has turned on
  50. s.begin(9600);
  51. // analogWrite(13, 255);
  52. digitalWrite(13, 1);
  53. // strcpy(roul,"");
  54. //while (!Serial) continue;
  55. // DateTime now = rtc.now();
  56. //StaticJsonBuffer<400> jsonBuffer1;
  57. DynamicJsonBuffer jsonBuffer(bufferSize);
  58. // StaticJsonBuffer<100> jsonBuffer;
  59. JsonObject &root = jsonBuffer.parseObject(s);
  60. // root.printTo(data);
  61. // while(root == JsonObject::invalid())
  62. // {
  63. // Serial.println(F("Error code1");
  64. // }
  65. setupBallast(&ballast1, root, 1);
  66. setupBallast(&ballast2, root, 2);
  67. setupBallast(&ballast3, root, 3);
  68. root.prettyPrintTo(Serial);
  69. Serial.println(F("Settings initialized via json"));
  70. if (root["manual"] == F("True"))
  71. {
  72. manualFlag = true;
  73. }
  74. loopMillis = millis();
  75. data_send_millis = millis();
  76. }
  77. // // static bool newData = false;
  78. void loop()
  79. {
  80. while (!rtc.begin())
  81. {
  82. Serial.println(F("Couldn't find RTC"));
  83. //while (1);
  84. delay(100);
  85. }
  86. while (!rtc.isrunning())
  87. {
  88. Serial.println(F("RTC is NOT running!"));
  89. }
  90. if (s.available() > 0)
  91. {
  92. // delay(100);
  93. DynamicJsonBuffer jsonBuffer(bufferSize);
  94. // const size_t bufsize = JSON_ARRAY_SIZE(3) + JSON_OBJECT_SIZE(2) + 3*JSON_OBJECT_SIZE(5);
  95. // StaticJsonBuffer<bufsize> jsonBuffer;
  96. // StaticJsonBuffer<bufferSize> jsonBuffer;
  97. JsonObject &root = jsonBuffer.parseObject(s);
  98. // if(root.succes())
  99. Serial << F("Received JSON") << endl;
  100. root.prettyPrintTo(Serial);
  101. // // data = "";
  102. // root.printTo(data);
  103. // // newData = true;
  104. // }
  105. // if (newData)
  106. // {
  107. // Serial.println(F("Parsing data"));
  108. // DynamicJsonBuffer jsonBuffer(bufferSize);
  109. // JsonObject &root = jsonBuffer.parseObject(data);
  110. // root.prettyPrintTo(Serial);
  111. updateBallast(&ballast1, root);
  112. updateBallast(&ballast2, root);
  113. updateBallast(&ballast3, root);
  114. if (root["manual"] == "True")
  115. {
  116. manualFlag = true;
  117. Serial.println(F("Manual set to true"));
  118. }
  119. else if (root["manual"] == "False")
  120. {
  121. manualFlag = false;
  122. Serial.println(F("Manual set to false"));
  123. }
  124. // newData = false;
  125. }
  126. currentMillis = millis();
  127. if (currentMillis - loopMillis >= loopPeriod)
  128. {
  129. if (manualFlag == true)
  130. {
  131. Serial.println(F("Manual Mode"));
  132. manualMode(&ballast1);
  133. manualMode(&ballast2);
  134. manualMode(&ballast3);
  135. }
  136. else
  137. {
  138. doBallast(&ballast1);
  139. doBallast(&ballast2);
  140. doBallast(&ballast3);
  141. }
  142. Serial << F("Free RAM: ") << getFreeRam() << endl;
  143. loopMillis = currentMillis;
  144. }
  145. currentMillis = millis();
  146. if (currentMillis - data_send_millis >= data_send_period)
  147. {
  148. StaticJsonBuffer<50> jsonBuffer;
  149. JsonObject& root = jsonBuffer.createObject();
  150. JsonArray& lcd_data = root.createNestedArray("lcdData");
  151. char time_buffer[10];
  152. DateTime now = rtc.now();
  153. sprintf(time_buffer,"%02d:%02d",now.hour(),now.minute());
  154. // root["hello"] = ("world");
  155. lcd_data.add("90%%");
  156. lcd_data.add(time_buffer);
  157. root.printTo(s);
  158. root.printTo(Serial);
  159. data_send_millis = millis();
  160. Serial << endl;
  161. }
  162. delay(100);
  163. }
  164. void setupBallast(ballast *b)
  165. {
  166. b->id = 1;
  167. b->shour = 14;
  168. b->smin = 0;
  169. b->fadePeriod = 60 * 60000;
  170. //b->stage = 0;
  171. b->brightness = 0;
  172. b->pin = 11;
  173. }
  174. void setupBallast(ballast *b, JsonObject &root, int i)
  175. {
  176. pinMode(b->pin, OUTPUT);
  177. pinMode(b->relayPin, OUTPUT);
  178. JsonArray &settings = root["settings"];
  179. JsonObject &settings0 = settings[0];
  180. JsonObject &settings1 = settings[1];
  181. JsonObject &settings2 = settings[2];
  182. if (i == 1)
  183. {
  184. b->id = 1;
  185. b->shour = settings0["shour"];
  186. unsigned long fP = settings0["fadePeriod"];
  187. b->fadePeriod = fP * 60000;
  188. b->smin = settings0["smin"];
  189. b->ehour = settings0["ehour"];
  190. b->emin = settings0["emin"];
  191. b->brightness = 0;
  192. b->pin = 11;
  193. b->relayPin = 2;
  194. b->fadeStartMillis = millis();
  195. }
  196. else if (i == 2)
  197. {
  198. b->id = 2;
  199. b->shour = settings1["shour"];
  200. unsigned long fP = settings1["fadePeriod"];
  201. b->fadePeriod = fP * 60000;
  202. b->smin = settings1["smin"];
  203. b->ehour = settings1["ehour"];
  204. b->emin = settings1["emin"];
  205. b->brightness = 0;
  206. b->pin = 10;
  207. b->relayPin = 4;
  208. b->fadeStartMillis = millis();
  209. }
  210. else if (i == 3)
  211. {
  212. b->id = 3;
  213. b->shour = settings2["shour"];
  214. unsigned long fP = settings2["fadePeriod"];
  215. b->fadePeriod = fP * 60000;
  216. b->smin = settings2["smin"];
  217. b->ehour = settings2["ehour"];
  218. b->emin = settings2["emin"];
  219. b->brightness = 0;
  220. b->pin = 9;
  221. b->relayPin = 7;
  222. b->fadeStartMillis = millis();
  223. }
  224. }
  225. void updateBallast(ballast *b, JsonObject &root)
  226. {
  227. JsonArray &settings = root["settings"];
  228. JsonObject &settings0 = settings[0];
  229. JsonObject &settings1 = settings[1];
  230. JsonObject &settings2 = settings[2];
  231. if (b->id == 1)
  232. {
  233. b->shour = settings0["shour"];
  234. unsigned long fP = settings0["fadePeriod"];
  235. b->fadePeriod = fP * 60000;
  236. b->smin = settings0["smin"];
  237. b->ehour = settings0["ehour"];
  238. b->emin = settings0["emin"];
  239. }
  240. if (b->id == 2)
  241. {
  242. b->shour = settings1["shour"];
  243. unsigned long fP = settings1["fadePeriod"];
  244. b->fadePeriod = fP * 60000;
  245. b->smin = settings1["smin"];
  246. b->ehour = settings1["ehour"];
  247. b->emin = settings1["emin"];
  248. }
  249. if (b->id == 3)
  250. {
  251. b->shour = settings2["shour"];
  252. unsigned long fP = settings2["fadePeriod"];
  253. b->fadePeriod = fP * 60000;
  254. b->smin = settings2["smin"];
  255. b->ehour = settings2["ehour"];
  256. b->emin = settings2["emin"];
  257. }
  258. }
  259. int getStage(ballast *b)
  260. {
  261. DateTime now = rtc.now();
  262. int hr = now.hour();
  263. int mn = now.minute();
  264. Serial.print(F("Current hour is: "));
  265. Serial.println(hr);
  266. Serial.print(F("Current minute is: "));
  267. Serial.println(mn);
  268. if (hr < b->shour)
  269. return 0;
  270. if ((float)hr >= (float)b->shour && hr < (b->shour + (float)(b->fadePeriod) / 3600000 + (float)(b->smin) / 60))
  271. {
  272. if (hr == b->shour)
  273. {
  274. if (mn < b->smin)
  275. return 0;
  276. else
  277. return 1;
  278. }
  279. return 1;
  280. }
  281. if ((float)hr >= (b->shour + (float)(b->fadePeriod) / 3600000 + (float)(b->smin) / 60) && hr < b->ehour)
  282. {
  283. return 2;
  284. }
  285. if ((float)hr >= (b->ehour + (float)(b->fadePeriod) / 3600000))
  286. {
  287. if (hr == (b->ehour + (float)(b->fadePeriod) / 3600000))
  288. {
  289. if (mn < b->emin)
  290. return 3;
  291. else
  292. return 4;
  293. }
  294. else
  295. {
  296. // Serial.println((b->ehour + (float)(b->fadePeriod)/3600000));
  297. return 4;
  298. }
  299. }
  300. if ((float)hr >= (float)b->ehour && hr < (b->ehour + (float)(b->fadePeriod) / 3600000 + (float)(b->emin) / 60))
  301. {
  302. if (hr == b->ehour)
  303. {
  304. if (mn < b->emin)
  305. return 2;
  306. else
  307. return 3;
  308. }
  309. else
  310. return 3;
  311. }
  312. return 1;
  313. }
  314. void doBallast(ballast *b)
  315. {
  316. if (b->id == 1)
  317. {
  318. Serial.println(F("-------------------Ballast1-------------------"));
  319. }
  320. if (b->id == 2)
  321. {
  322. Serial.println(F("-------------------Ballast2-------------------"));
  323. }
  324. if (b->id == 3)
  325. {
  326. Serial.println(F("-------------------Ballast3-------------------"));
  327. }
  328. // DateTime now = rtc.now();
  329. // int hr = now.hour();
  330. Serial.print(F("Start hour is: "));
  331. Serial.println(b->shour);
  332. Serial.print(F("Start min is: "));
  333. Serial.println(b->smin);
  334. Serial.print(F("Fade Period is: "));
  335. Serial.print((b->fadePeriod) / 60000);
  336. Serial.println(F(" minutes"));
  337. Serial.print(F("End hour is: "));
  338. Serial.println(b->ehour);
  339. Serial.print(F("End min is: "));
  340. Serial.println(b->emin);
  341. Serial.print(F("Brightness: "));
  342. Serial.println(b->brightness);
  343. int stage = getStage(b);
  344. Serial.print(F("Stage: "));
  345. Serial.println(stage);
  346. if (stage == 0)
  347. {
  348. b->stage = 0;
  349. b->brightness = 0;
  350. analogWrite(b->pin, b->brightness);
  351. Serial.print(F("Stage = "));
  352. Serial.println(stage);
  353. Serial.print(F("brightness: "));
  354. Serial.println(b->brightness);
  355. analogWrite(b->relayPin, RELAY_OFF);
  356. }
  357. else if (stage == 1)
  358. {
  359. if (currentMillis - b->fadeStartMillis >= (b->fadePeriod / 255))
  360. {
  361. //Serial.println(b->fadePeriod/255);
  362. Serial.print(F("Stage = "));
  363. Serial.println(stage);
  364. digitalWrite(b->relayPin, RELAY_ON);
  365. if (b->brightness <= 254)
  366. {
  367. analogWrite(b->pin, b->brightness++);
  368. }
  369. //d = b->fadePeriod/255;
  370. Serial.print(F("Delay is: "));
  371. //t = d / 1000;
  372. Serial.print(b->fadePeriod / 255 / 1000);
  373. Serial.println(F(" seconds"));
  374. Serial.print(F("Brightness: "));
  375. Serial.println(b->brightness);
  376. //if(b->brightness == 255)
  377. //b->brightness = 0;
  378. //delay(d);
  379. b->fadeStartMillis = currentMillis;
  380. }
  381. }
  382. else if (stage == 2)
  383. {
  384. Serial.print(F("Stage = "));
  385. Serial.println(stage);
  386. b->brightness = 255;
  387. analogWrite(b->pin, b->brightness);
  388. }
  389. else if (stage == 3)
  390. {
  391. if (currentMillis - b->fadeStartMillis >= (b->fadePeriod / 255))
  392. {
  393. //Serial.println(b->fadePeriod/255);
  394. Serial.print(F("Stage = "));
  395. Serial.println(stage);
  396. //if(b->brightness == 0 && (float)hr < (b->ehour + (float)(b->fadePeriod)/3600000))
  397. //b->brightness = 255;
  398. if (b->brightness > 0)
  399. {
  400. analogWrite(b->pin, --b->brightness);
  401. }
  402. //d = b->fadePeriod/255;
  403. Serial.print(F("Delay is: "));
  404. //t = d / 1000;
  405. Serial.print(b->fadePeriod / 255 / 1000);
  406. Serial.println(F(" seconds"));
  407. Serial.print(F("Brightness: "));
  408. Serial.println(b->brightness);
  409. //if(b->brightness == 255)
  410. //b->brightness = 0;
  411. //delay(d);
  412. b->fadeStartMillis = currentMillis;
  413. }
  414. }
  415. else if (stage == 4)
  416. {
  417. Serial.print(F("Stage = "));
  418. Serial.println(stage);
  419. analogWrite(b->pin, 0);
  420. analogWrite(b->relayPin, RELAY_OFF);
  421. }
  422. Serial.println(F("----------------------------------------------"));
  423. }
  424. void manualMode(ballast *b)
  425. {
  426. /*DateTime now = rtc.now();
  427. byte hr = now.hour();
  428. byte mn = now.minute();
  429. if(hr <= b-> shour)
  430. {
  431. analogWrite("
  432. }*/
  433. analogWrite(b->pin, 255);
  434. analogWrite(b->relayPin, RELAY_ON);
  435. }
  436. int getFreeRam()
  437. {
  438. extern int __heap_start, *__brkval;
  439. int v;
  440. v = (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
  441. Serial.print("Free RAM = ");
  442. Serial.println(v, DEC);
  443. return v;
  444. }