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.

440 lines
12 KiB

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