DENMARK_V1.4_SDM630.ino 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. #include <FS.h>
  2. #include <ESP8266WiFi.h>
  3. #include <WiFiClient.h>
  4. #include <PubSubClient.h>
  5. #include <SDM.h>
  6. #include <SoftwareSerial.h>
  7. #include <ArduinoJson.h>
  8. #include <RTClib.h>
  9. #include <Wire.h>
  10. #include <SPI.h>
  11. #include <SD.h>
  12. #include <EEPROM.h>
  13. #include <WiFiManager.h>
  14. #include <ESP8266WebServer.h>
  15. #include <DNSServer.h>
  16. File myFile;
  17. #define ESP8266
  18. int band =1;
  19. int band_day =1;
  20. int dia_next;
  21. int mes_next;
  22. int dia_nextEEPROM;
  23. int mes_nextEEPROM;
  24. char t2_EEPROM[15];
  25. int anho_EEPROM;
  26. int dia_EEPROM;
  27. int mes_EEPROM;
  28. int diaEEPROM;
  29. int linea1_EEPROM;
  30. RTC_DS3231 rtc;
  31. char meterID[10];
  32. //Configuracion contador
  33. SoftwareSerial swSerSDM;
  34. SDM sdm(swSerSDM, 9600, 0, SWSERIAL_8N1, 2, 16);
  35. // Servidor MQTT
  36. char SERVER[50] = "denmark.inverlec.solar"; // denmark.inverlec.solar
  37. int SERVERPORT = 31010;
  38. WiFiClient espClient;
  39. PubSubClient client(espClient);
  40. // Callback al recibir mensaje por MQTT
  41. void callback(char* topic, byte* payload, unsigned int length) {
  42. Serial.print("Message arrived [");
  43. Serial.print(topic);
  44. Serial.print("] ");
  45. for (int i = 0; i < length; i++) {
  46. Serial.print((char)payload[i]);
  47. }
  48. Serial.println();
  49. }
  50. //funcion para mandar a mqqt la lectura cada 10s, 15 min y guardar en memoria SD
  51. int denmark() {
  52. char bufout[10];
  53. //Variable JSON que se mandara a mqtt aproximadamente cada 10 segundos
  54. char t1[15];
  55. char t2 [15];
  56. char t3[15];
  57. DateTime now = rtc.now();
  58. sprintf(t1, "%02d-%02d-%02d %02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second()); //Extrae del rtc hora y fecha
  59. sprintf(t2, "%02d-%02d-%02d ", now.year(), now.month(), now.day()); //Extrae del rtc hora y fecha
  60. sprintf(t3, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  61. DynamicJsonDocument JSONencoder(1024);
  62. JSONencoder["date"] = t1;//Manda al JSON la variable t
  63. JSONencoder["serialNumber"] = meterID;//numero serial de el medidor
  64. delay(50);
  65. JsonObject measures = JSONencoder.createNestedObject("measures");//Anidamos al JSON la variable measures
  66. float voltage = sdm.readVal(SDM630_VOLTAGE_AVERAGE);
  67. measures["Readings: Volts Average"] = String(voltage);
  68. delay(50);
  69. float voltage_a = sdm.readVal(SDM630_VOLTAGE1);
  70. measures["Readings: Volts A-N"] = String(voltage_a);
  71. delay(50);
  72. float voltage_b = sdm.readVal(SDM630_VOLTAGE2);
  73. measures["Readings: Volts B-N"] = String(voltage_b);
  74. delay(50);
  75. float voltage_c = sdm.readVal(SDM630_VOLTAGE3);
  76. measures["Readings: Volts C-N"] = String(voltage_c);
  77. delay(50);
  78. float current = sdm.readVal(SDM630_CURRENT_AVERAGE);
  79. measures["Readings: I A"] = String(current);
  80. delay(50);
  81. float current_a = sdm.readVal(SDM630_CURRENT1);
  82. measures["Readings: I A"] = String(current_a);
  83. delay(50);
  84. float current_b = sdm.readVal(SDM630_CURRENT2);
  85. measures["Readings: I B"] = String(current_b);
  86. delay(50);
  87. float current_c = sdm.readVal(SDM630_CURRENT3);
  88. measures["Readings: I C"] = String(current_c);
  89. delay(50);
  90. float frequency = sdm.readVal(SDM630_FREQUENCY);
  91. measures["Readings: Frequency"] = String(frequency);
  92. delay(50);
  93. float power = sdm.readVal(SDM630_POWERTOTAL);
  94. measures["Readings: Watts Total"] = String(power);
  95. delay(50);
  96. float power_a = sdm.readVal(SDM630_POWER1);
  97. measures["Readings: Watts A"] = String(power_a);
  98. delay(50);
  99. float power_b = sdm.readVal(SDM630_POWER2);
  100. measures["Readings: Watts B"] = String(power_b);
  101. delay(50);
  102. float power_c = sdm.readVal(SDM630_POWER3);
  103. measures["Readings: Watts C"] = String(power_c);
  104. delay(50);
  105. float received = sdm.readVal(SDM630_IMPORT_ACTIVE_ENERGY)*1000;
  106. measures["Scaled Energy: Wh received"] = String(received);
  107. delay(50);
  108. float received_a = sdm.readVal(SDM630_IMPORT1)*1000;
  109. measures["Scaled Energy: Wh received A"] = String(received_a);
  110. delay(50);
  111. float received_b = sdm.readVal(SDM630_IMPORT2)*1000;
  112. measures["Scaled Energy: Wh received B"] = String(received_b);
  113. delay(50);
  114. float received_c = sdm.readVal(SDM630_IMPORT3)*1000;
  115. measures["Scaled Energy: Wh received C"] = String(received_c);
  116. delay(50);
  117. float delivered = sdm.readVal(SDM630_EXPORT_ACTIVE_ENERGY)*1000;
  118. measures["Scaled Energy: Wh delivered"] = String(delivered);
  119. delay(50);
  120. float delivered_a = sdm.readVal(SDM630_EXPORT1)*1000;
  121. measures["Scaled Energy: Wh delivered A"] = String(delivered_a);
  122. delay(50);
  123. float delivered_b = sdm.readVal(SDM630_EXPORT2)*1000;
  124. measures["Scaled Energy: Wh delivered B"] = String(delivered_b);
  125. delay(50);
  126. float delivered_c = sdm.readVal(SDM630_EXPORT3)*1000;
  127. measures["Scaled Energy: Wh delivered C"] = String(delivered_c);
  128. delay(50);
  129. float wh_net = (received-delivered);
  130. float wh_net_a = (received_a - delivered_a);
  131. float wh_net_b = (received_b - delivered_b);
  132. float wh_net_c = (received_c - delivered_c);
  133. measures["Scaled Energy: Wh Total"] = String(wh_net) ;
  134. measures["Scaled Energy: Wh Total A"] = String(wh_net_a);
  135. measures["Scaled Energy: Wh Total B"] = String(wh_net_b);
  136. measures["Scaled Energy: Wh Total C"] = String(wh_net_c);
  137. delay(50);
  138. float wh_total = (received + delivered);
  139. measures["Scaled Energy: Wh Net"] = String(wh_total);
  140. delay(50);
  141. float wh_total_a = sdm.readVal(SDM630_TOTAL_ENERGY1)*1000;
  142. measures["Scaled Energy: Wh Net A"] = String(wh_total_a);
  143. delay(50);
  144. float wh_total_b = sdm.readVal(SDM630_TOTAL_ENERGY2)*1000;
  145. measures["Scaled Energy: Wh Net A"] = String(wh_total_b);
  146. delay(50);
  147. float wh_total_c = sdm.readVal(SDM630_TOTAL_ENERGY3)*1000;
  148. measures["Scaled Energy: Wh Net C"] = String(wh_total_c);
  149. delay(50);
  150. char JSONmessageBuffer[1000];
  151. serializeJson(JSONencoder, JSONmessageBuffer);
  152. if (( now.day() == dia_nextEEPROM || diaEEPROM ==0 ||(now.day()>dia_nextEEPROM & mes_nextEEPROM == now.month())) & band_day==1)
  153. {
  154. if (diaEEPROM == 0) {
  155. EEPROM.write(2,2);
  156. diaEEPROM =2;
  157. EEPROM.commit();
  158. }
  159. dia_next= now.day() + 7;
  160. mes_next = now.month();
  161. //Estos if es para el no superen el valor de 29, 30 o 31 dependiendo el mes
  162. if ((now.month()==1 || now.month()==3 || now.month()==5 || now.month()==7 || now.month()==8 || now.month()==10 || now.month()==12) & (dia_next>31)){
  163. dia_next= dia_next -31;
  164. mes_next = now.month() + 1;
  165. }
  166. else if ((dia_next>30)&(now.month()==4 || now.month()==6 || now.month()==9 || now.month()==11)){
  167. dia_next= dia_next -30;
  168. mes_next = now.month() + 1;
  169. }
  170. else if ((dia_next>29)&(now.month()==2 & ((now.year()==2020 || now.year()==2024 || now.year()==2028 || now.year()==2032 || now.year()==2036)))){
  171. dia_next= dia_next -29;
  172. mes_next = now.month() + 1;
  173. }
  174. else if ((dia_next>28)&(now.month()==2)){
  175. dia_next= dia_next -28;
  176. mes_next = now.month() + 1;
  177. }
  178. //Guardando variables EEPROM
  179. EEPROM.write(6,dia_next);
  180. EEPROM.write(0,mes_next);
  181. EEPROM.write(3,now.day());
  182. EEPROM.write(4,now.year()-2000);//si toma mas de tres dijitos me escribe otra cosa
  183. EEPROM.write(5,now.month());
  184. EEPROM.write(7,0);//Variable linea 1
  185. dia_EEPROM = now.day();
  186. anho_EEPROM = now.year()-2000;
  187. mes_EEPROM = now.month();
  188. dia_nextEEPROM = dia_next;
  189. mes_nextEEPROM = mes_next;
  190. linea1_EEPROM = 0;
  191. EEPROM.commit();
  192. band_day=2;
  193. }
  194. else if (( now.day() != dia_nextEEPROM & diaEEPROM !=0) & band_day==2)
  195. {
  196. band_day=1;
  197. }
  198. if ((now.minute()==00 || now.minute()==15 || now.minute()==30 || now.minute()==45) & band==1) {
  199. //if ((now.minute()==00 || now.minute()==05 || now.minute()==10 || now.minute()==15 || now.minute()==20 || now.minute()==25 || now.minute()==30 || now.minute()==35 || now.minute()==40 || now.minute()==45 || now.minute()==50 || now.minute()==55) & band==1) {
  200. //Variables que seran guardadas en el logging en formato csv
  201. String linea1=("date,serialNumber,Voltaje promedio(V),Voltale A-N(V),Voltale B-N(V),Voltale C-N(V),Corriente promedio(A),Corriente A(A),Corriente B(A),Corriente C(A),Frecuencia (Hz),Potencia total(W),Potencia A(W),Potencia B(W),Potencia C(W),Energia Neta total(Wh),Energia Neta A(Wh),Energia Neta B(Wh),Energia Neta C(Wh),Energia Importada total(Wh),Energia Importada A(Wh),Energia Importada B(Wh),Energia Importada C(Wh),Energia Exportada total(Wh),Energia Exportada A(Wh),Energia Exportada B(Wh),Energia Exportada C(Wh),Energia Total (Wh),Energia Total A(Wh),Energia Total B(Wh),Energia Total (Wh) C");
  202. delay(50);
  203. String measurescsv1 = (String(t1) + "," + String(meterID) + ","+ String(voltage) + "," + String(voltage_a) + ",");
  204. delay(50);
  205. String measurescsv2 = (String(voltage_b) + "," + String(voltage_c) + "," + String(current) + "," + String(current_a) + ",");
  206. delay(50);
  207. String measurescsv3 = (String(current_b) + "," + String(current_c) + "," + String(frequency) + "," + String(power) + ",");
  208. delay(50);
  209. String measurescsv4 = (String(power_a) + "," + String(power_b) + "," + String(power_c) + "," + String(wh_total) + ",");
  210. delay(50);
  211. String measurescsv5 = (String(wh_total_a) + "," + String(wh_total_b) + "," + String(wh_total_c) + "," + String(received) + ",");
  212. delay(50);
  213. String measurescsv6 = (String(received_a) + "," + String(received_b) + "," + String(received_c) + "," + String(delivered) + ",");
  214. delay(50);
  215. String measurescsv7 = (String(delivered_a) + "," + String(delivered_b) + "," + String(delivered_c) + "," + String(wh_net) + ",");
  216. delay(50);
  217. String measurescsv8 = (String(wh_net_a) + "," + String(wh_net_b) + "," + String(wh_net_c));
  218. delay(50);
  219. String measurescsv = (measurescsv1 + measurescsv2 + measurescsv3 + measurescsv4 + measurescsv5 + measurescsv6 + measurescsv7 + measurescsv8);
  220. Serial.println(measurescsv);
  221. sprintf(t2_EEPROM, "%02d-%02d-20%02d.csv",dia_EEPROM,mes_EEPROM,anho_EEPROM);
  222. myFile = SD.open(t2_EEPROM, FILE_WRITE);
  223. // if the file opened okay, write to it:
  224. if (myFile) {
  225. if (linea1_EEPROM ==0) {
  226. EEPROM.write(7,1); //Solo inicialmente valdra cero o cuando inicie una nueva medicion cada 7 dias
  227. linea1_EEPROM = 1;
  228. myFile.println(linea1); //Imprime en el csv la linea 1
  229. EEPROM.commit();
  230. }
  231. myFile.println(measurescsv); //imprime en el csv los parametros medidos
  232. // close the file:
  233. myFile.close();
  234. Serial.println("done.");
  235. } else {
  236. // if the file didn't open, print an error:
  237. Serial.println("error opening .csv");
  238. }
  239. //Variable JSON la cual se mandara al mqtt cada 15 minuntos
  240. DynamicJsonDocument var_login(1500);
  241. var_login["date"] = (String(t2) + String(t3));
  242. var_login["serialNumber"] = String(meterID);
  243. JsonArray feeds = var_login.createNestedArray("measures");
  244. /* JsonObject feed1=feeds.createNestedObject();
  245. feed1["tipo"] = "Voltaje";
  246. feed1["fase"] = "Total";
  247. feed1["lectura"] = voltage;
  248. feed1["unidad"] = "V";*/
  249. JsonObject feed1_a=feeds.createNestedObject();
  250. feed1_a["tipo"] = "Voltaje";
  251. feed1_a["fase"] = "A";
  252. feed1_a["lectura"] = String(voltage_a);
  253. //feed1_a["unidad"] = "V";
  254. JsonObject feed1_b=feeds.createNestedObject();
  255. feed1_b["tipo"] = "Voltaje";
  256. feed1_b["fase"] = "B";
  257. feed1_b["lectura"] = String(voltage_b);
  258. //feed1_b["unidad"] = "V";
  259. JsonObject feed1_c=feeds.createNestedObject();
  260. feed1_c["tipo"] = "Voltaje";
  261. feed1_c["fase"] = "C";
  262. feed1_c["lectura"] = String(voltage_c);
  263. //feed1_c["unidad"] = "V";
  264. /* JsonObject feed2=feeds.createNestedObject();
  265. feed2["tipo"] = "Corriente";
  266. feed2["fase"] = "Total";
  267. feed2["lectura"] = current;
  268. feed2["unidad"] = "A";*/
  269. JsonObject feed2_a=feeds.createNestedObject();
  270. feed2_a["tipo"] = "Corriente";
  271. feed2_a["fase"] = "A";
  272. feed2_a["lectura"] = String(current_a);
  273. //feed2_a["unidad"] = "A";
  274. JsonObject feed2_b=feeds.createNestedObject();
  275. feed2_b["tipo"] = "Corriente";
  276. feed2_b["fase"] = "B";
  277. feed2_b["lectura"] = String(current_b);
  278. //feed2_b["unidad"] = "A";
  279. JsonObject feed2_c=feeds.createNestedObject();
  280. feed2_c["tipo"] = "Corriente";
  281. feed2_c["fase"] = "C";
  282. feed2_c["lectura"] = String(current_c);
  283. //feed2_c["unidad"] = "A";
  284. JsonObject feed3=feeds.createNestedObject();
  285. feed3["tipo"] = "Frecuencia";
  286. feed3["fase"] = "Total";
  287. feed3["lectura"] = String(frequency);
  288. //feed3["unidad"] = "Hz";
  289. /* JsonObject feed4=feeds.createNestedObject();
  290. feed4["tipo"] = "Potencia";
  291. feed4["fase"] = "Total";
  292. feed4["lectura"] = power;
  293. feed4["unidad"] = "W";*/
  294. JsonObject feed4_a=feeds.createNestedObject();
  295. feed4_a["tipo"] = "Potencia";
  296. feed4_a["fase"] = "A";
  297. feed4_a["lectura"] = String(power_a);
  298. //feed4_a["unidad"] = "W";
  299. JsonObject feed4_b=feeds.createNestedObject();
  300. feed4_b["tipo"] = "Potencia";
  301. feed4_b["fase"] = "B";
  302. feed4_b["lectura"] = String(power_b);
  303. //feed4_b["unidad"] = "W";
  304. JsonObject feed4_c=feeds.createNestedObject();
  305. feed4_c["tipo"] = "Potencia";
  306. feed4_c["fase"] = "C";
  307. feed4_c["lectura"] = String(power_c);
  308. //feed4_c["unidad"] = "W";
  309. JsonObject feed5=feeds.createNestedObject();
  310. feed5["tipo"] = "Energy: Wh Total";
  311. feed5["fase"] = "Total";
  312. feed5["lectura"] = String(wh_total);
  313. //feed5["unidad"] = "Wh";
  314. JsonObject feed5_a=feeds.createNestedObject();
  315. feed5_a["tipo"] = "Energy: Wh Total";
  316. feed5_a["fase"] = "A";
  317. feed5_a["lectura"] = String(wh_total_a);
  318. //feed5_a["unidad"] = "Wh";
  319. JsonObject feed5_b=feeds.createNestedObject();
  320. feed5_b["tipo"] = "Energy: Wh Total";
  321. feed5_b["fase"] = "B";
  322. feed5_b["lectura"] = String(wh_total_b);
  323. //feed5_b["unidad"] = "Wh";
  324. JsonObject feed5_c=feeds.createNestedObject();
  325. feed5_c["tipo"] = "Energy: Wh Total";
  326. feed5_c["fase"] = "C";
  327. feed5_c["lectura"] = String(wh_total_c);
  328. //feed5_c["unidad"] = "Wh";
  329. /*JsonObject feed6=feeds.createNestedObject();
  330. feed6["tipo"] = "Energy: Wh received";
  331. feed6["fase"] = "Total";
  332. feed6["lectura"] = received;
  333. feed6["unidad"] = "Wh";*/
  334. JsonObject feed6_a=feeds.createNestedObject();
  335. feed6_a["tipo"] = "Energy: Wh received";
  336. feed6_a["fase"] = "A";
  337. feed6_a["lectura"] = String(received_a);
  338. //feed6_a["unidad"] = "Wh";
  339. JsonObject feed6_b=feeds.createNestedObject();
  340. feed6_b["tipo"] = "Energy: Wh received";
  341. feed6_b["fase"] = "B";
  342. feed6_b["lectura"] = String(received_b);
  343. //feed6_b["unidad"] = "Wh";
  344. JsonObject feed6_c=feeds.createNestedObject();
  345. feed6_c["tipo"] = "Energy: Wh received";
  346. feed6_c["fase"] = "C";
  347. feed6_c["lectura"] = String(received_c);
  348. //feed6_c["unidad"] = "Wh";
  349. /*JsonObject feed7=feeds.createNestedObject();
  350. feed7["tipo"] = "Energy: Wh delivered";
  351. feed7["fase"] = "Total";
  352. feed7["lectura"] = delivered;
  353. feed7["unidad"] = "Wh";*/
  354. JsonObject feed7_a=feeds.createNestedObject();
  355. feed7_a["tipo"] = "Energy: Wh delivered";
  356. feed7_a["fase"] = "A";
  357. feed7_a["lectura"] = String(delivered_a);
  358. //feed7_a["unidad"] = "Wh";
  359. JsonObject feed7_b=feeds.createNestedObject();
  360. feed7_b["tipo"] = "Energy: Wh delivered";
  361. feed7_b["fase"] = "B";
  362. feed7_b["lectura"] = String(delivered_b);
  363. //feed7_b["unidad"] = "Wh";
  364. JsonObject feed7_c=feeds.createNestedObject();
  365. feed7_c["tipo"] = "Energy: Wh delivered";
  366. feed7_c["fase"] = "C";
  367. feed7_c["lectura"] = String(delivered_c);
  368. //feed7_c["unidad"] = "Wh";
  369. char JSONmessageBuffer2[1300];
  370. serializeJson(var_login, JSONmessageBuffer2);
  371. Serial.println(JSONmessageBuffer2);
  372. char topic2[20];
  373. sprintf(topic2,"denmark/log/%s",meterID);
  374. Serial.println(topic2);
  375. if (client.publish(topic2, JSONmessageBuffer2) == true) { //update when server is changed
  376. Serial.println("Success sending message");
  377. } else {
  378. Serial.println("Error sending message");
  379. }
  380. band = 2;//Me limita que solo la primera medicion tomada en los minutos 0, 15, 30, 45 sean mandados al mqtt y al logging
  381. }
  382. else if ((now.minute()!=00 & now.minute()!=15 & now.minute()!=30 & now.minute()!=45) & band==2)
  383. //else if ((now.minute()!=00 & now.minute()!=05 & now.minute()!=10 & now.minute()!=15 & now.minute()!=20 & now.minute()!=25 & now.minute()!=30 & now.minute()!=35 & now.minute()!=40 & now.minute()!=45 & now.minute()!=50 & now.minute()!=55) & band==2)
  384. {
  385. band=1;
  386. }
  387. char topic1[10];
  388. sprintf(topic1,"denmark/tr/%s",meterID);
  389. Serial.println(topic1);
  390. if (client.publish(topic1, JSONmessageBuffer) == true) { //update when server is changed
  391. Serial.println("Success sending message");
  392. } else {
  393. Serial.println("Error sending message");
  394. }
  395. Serial.print("JSON: ");
  396. Serial.println(JSONmessageBuffer);
  397. }
  398. //Reconeccion al servidor de mqtt
  399. void reconnect() {
  400. // Loop until we're reconnected
  401. // while (!client.connected()) { //Creo que si comentareo este while en lugar de quedarse probando que conecte solo lo haria una vez
  402. Serial.print("Attempting MQTT connection...");
  403. // Create a random client ID
  404. String clientId = "ESP8266Client";
  405. // Attempt to connect
  406. if (client.connect(clientId.c_str())) {
  407. Serial.println("connected");// Mostrar mensaje de exito a MQTT
  408. // Once connected, publish an announcement...
  409. StaticJsonDocument<300> JSONEncoder;
  410. JSONEncoder['status'] = "true";
  411. char JSONmessageBuffer[100];
  412. serializeJson(JSONEncoder, JSONmessageBuffer);
  413. //client.publish("testTopic", JSONmessageBuffer);
  414. //client.publish("testTopic2", JSONmessageBuffer);
  415. // ... and resubscribe
  416. //client.subscribe("inTopic");
  417. } else {
  418. Serial.print("Conexión MQTT Falló, rc=");// Mostrar mensaje de fallo a MQTT
  419. Serial.print(client.state());
  420. Serial.println(" try again in 5 seconds");
  421. // Wait 5 seconds before retrying
  422. delay(5000);
  423. }
  424. //}
  425. }
  426. void setup() {
  427. // put your setup code here, to run once:
  428. Serial.begin(115200);
  429. //initialize serial
  430. EEPROM.begin(512);
  431. Wire.begin();
  432. rtc.begin();
  433. if (! rtc.begin()) {
  434. Serial.println("Couldn't find RTC");
  435. while (1);
  436. }
  437. if (rtc.lostPower()) {
  438. Serial.println("RTC lost power, lets set the time!");
  439. // following line sets the RTC to the date & time this sketch was compiled
  440. rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  441. }
  442. sdm.begin();
  443. delay(10);
  444. WiFiManagerParameter custom_output("Meter ID", "Meter ID", meterID, 10);
  445. //WiFiManager
  446. //Local intialization. Once its business is done, there is no need to keep it around
  447. WiFiManager wifiManager;
  448. //reset settings - for testing
  449. //wifiManager.resetSettings();
  450. /*
  451. //start-block2
  452. IPAddress _ip = IPAddress(192, 168, 98, 164);
  453. IPAddress _gw = IPAddress(192, 168, 98, 254);
  454. IPAddress _sn = IPAddress(255, 255, 255, 0);
  455. //end-block2
  456. wifiManager.setSTAStaticIPConfig(_ip, _gw, _sn);
  457. */
  458. wifiManager.addParameter(&custom_output);
  459. //tries to connect to last known settings
  460. //if it does not connect it starts an access point with the specified name
  461. //here "AutoConnectAP" with password "password"
  462. //and goes into a blocking loop awaiting configuration
  463. if (!wifiManager.autoConnect("DENMARK", "123456789")) {
  464. Serial.println("failed to connect, we should reset as see if it connects");
  465. delay(3000);
  466. ESP.reset();
  467. delay(5000);
  468. }
  469. //if you get here you have connected to the WiFi
  470. Serial.println("connected :)");
  471. //Guarda la variable IDMeter
  472. if (EEPROM.read(8) == 0) {
  473. strcpy(meterID, custom_output.getValue());//extrae el valor ingresado en la app
  474. EEPROM.write(8,1); //band para que no cambie el valor de IDMeter
  475. EEPROM.put(9,meterID); //guarda el valor de IDMeter y no se puede cambiar a menos que se borren las variable eeprom
  476. EEPROM.commit();
  477. }
  478. Serial.println("local ip");
  479. Serial.println(WiFi.localIP());
  480. delay(1000);
  481. Serial.println("Creando cliente MQTT...");
  482. client.setServer("denmark.inverlec.solar", 31010);
  483. client.setCallback(callback);
  484. if (!SD.begin(10)) {
  485. Serial.println("initialization SD card failed!");
  486. return;
  487. }
  488. else {
  489. Serial.println("initialization SD card done.");
  490. }
  491. ///Set variables en EEPROM
  492. EEPROM.get(9,meterID);
  493. diaEEPROM = EEPROM.read(2);// define que ya fue corrida al menos una vez el programa
  494. dia_EEPROM = EEPROM.read(3);//variable de dia de la carpeta actual csv
  495. anho_EEPROM = EEPROM.read(4);//variable de año de la carpeta actual csv
  496. mes_EEPROM = EEPROM.read(5); //variable de mes de la carpeta actual csv
  497. dia_nextEEPROM = EEPROM.read(6);//variable la cual contiene el siguiente dia en cual se creara la carpeta csv
  498. linea1_EEPROM = EEPROM.read(7);//Esta variable es para limitar que el encabezado se mande solo una vez al crar el csv
  499. mes_nextEEPROM = EEPROM.read(0);//variable la cual contiene el siguiente mes en cual se creara la carpeta csv
  500. /*Serial.println(mes_nextEEPROM);
  501. Serial.println(meterID);
  502. Serial.println(dia_nextEEPROM);
  503. Serial.println(anho_EEPROM);
  504. Serial.println(mes_EEPROM);
  505. */
  506. }
  507. void loop() {
  508. //Loop reconexion a Mqtt
  509. {
  510. if (!client.connected()) {
  511. reconnect();
  512. }
  513. client.loop();
  514. }
  515. denmark();
  516. delay(7920);
  517. }