Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.98 KB | None | 0 0
  1. #define TINY_GSM_MODEM_SIM808
  2. #define DEBUG_CLIENT 0  // toglierei lo zero e casomai commenterei la riga se non voglio il debug
  3.                         //--> lo uso con 1 e 0 per attivare e disattivare il debug senza dover commentare tutto prima di
  4.                         //    caricare lo schetch. Ho letto che senza un pc collegato sennò va in crash per una specie di
  5.                         //    memoria piena. Sbaglio?
  6. //no no il sistema e' buono e lo uso anche io
  7. // solo che
  8. #define DEBUG_CLIENT 0
  9. //e
  10. //#define DEBUG_CLIENT
  11. //sono la stessa cosa quindi io non uso lo zero e l'uno ,che puo confondere ma metto o tolgo le // davanti
  12. //le tolgo perche
  13. #define DEBUG_CLIENT 1
  14. #define DEBUG_CLIENT
  15. //sono la stessa cosa
  16. #include <TinyGsmClient.h>
  17. #include <PubSubClient.h>
  18. #include <SoftwareSerial.h>
  19. #include <OneWire.h>
  20. #include <avr/wdt.h>
  21.  
  22. #define SerialMon Serial
  23.  
  24. SoftwareSerial SerialAT(2, 3); // RX, TX
  25.  
  26. int DS18B20_Pin = A0; // bus dati su pin analogico
  27.                       //--> ehehehe alle prime armi avevo seguito una guida, e lo avevano collegato li. Poi me ne sono
  28.                       //    accorto, oramai ho lo scudo fatto ma ho letto che cmq arduino lo riesce a gestire come digitale
  29.                       //    lo stesso. Sbaglio?
  30. //in generale no,ma l'ho notato. Non sono cosi...forbito da darti ulteriori info su cosa potrebbe succedere
  31. //probabilmente gli ingressi analogici hanno ANCHE la capacità analogica oltre a quella digitale :)
  32. OneWire ds(DS18B20_Pin);
  33.  
  34. const char apn[]  = "wap.tim.it";
  35. const char user[] = "";
  36. const char pass[] = "";
  37.  
  38. const char* broker = "xxxxxxxxxxxxx.duckdns.org";
  39.  
  40. const char* topicInit = "GsmClient1/init";
  41. const char* topicTemp = "GsmClient1/temp";
  42. const char* topicSpeed = "GsmClient1/speed";
  43. const char* topicJson = "location/camion1";
  44.  
  45. float temperatura;
  46. float offsetTemp = 0; //questo non mi sembra usato //----> giusto! refuso vecchia versione e possibile implementazione
  47.  
  48. float gps_latitude = 0;
  49. float gps_longitude = 0;
  50. float gps_speed = 0;
  51. float gps_alt = 0;
  52.  
  53. char lat[15];
  54. char lon[15];
  55. char kmh[15];
  56. char temp[15];
  57.  
  58. int tentativi = 0;
  59.  
  60. TinyGsm modem(SerialAT);
  61. TinyGsmClient client(modem);
  62. PubSubClient mqtt(client);
  63.  
  64. #define LED_PIN 13 //questo non mi sembra usato //---> Giusto! Refuso da schetch base usato per mqtt
  65. int ledStatus = LOW; //neanche questo  //---> Giusto! Refuso da schetch base usato per mqtt
  66.  
  67. long lastReconnectAttempt = 0;
  68. long lastSendTemp = 0;
  69. long lastSendGps = 0;
  70. long lastreset = 0;
  71.  
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////
  73. //////////////////////////////////// VOID SETUP ///////////////////////////////////////////////////
  74. ///////////////////////////////////////////////////////////////////////////////////////////////////
  75.  
  76. void setup() {
  77.  
  78.   wdt_disable();  // da togliere //----> ok
  79.  
  80.   tentativi = 0;
  81.  
  82.   pinMode (12, OUTPUT); /// tutto qua per me non serve...un lampeggio....
  83.   delay(100);
  84.   digitalWrite (12, LOW);
  85.   delay(100);
  86.   digitalWrite (12, HIGH);
  87.   delay (3000);
  88.   digitalWrite (12, LOW);
  89.   delay(100);  // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
  90. //Benissimo , cambia sopra #define LED_PIN 13 in #define LED_PIN 12 e qui metti LED_PIN al posto del 12
  91. // in modo che se in un futuro cambi il piedinio collegato al led di segnalazione
  92. //devi cambiare solo nel define il pin associato :)
  93. //ed il codice e' piu leggibile
  94.   SerialMon.begin(9600);
  95.   delay(10);
  96.  
  97.   SerialAT.begin(9600);
  98.   delay(100);
  99. #if DEBUG_CLIENT
  100.   SerialMon.println("Initializzo il modem...");
  101. #endif
  102.   modem.restart();
  103.                         //    un delay(10) qui //---> ok
  104.   if (modem.enableGPS()) {
  105. #if DEBUG_CLIENT
  106.     SerialMon.println("Modulo GPS On");
  107. #endif
  108.   } else {
  109. #if DEBUG_CLIENT
  110.     SerialMon.println("Modulo GPS Off");
  111. #endif
  112.     setup(); //praticamente se il modulo GPS e off vai immediatamente al setup di nuovo
  113.  
  114.              //---> se era acceso il passaggio commentato prima, lo spegne. Avevo provato a mettere il lampeggio sopra in
  115.              //     un if, ma nn aveva funzionato e quindi ho lasciato questa che cmq funziona.
  116.              
  117.   }
  118. //si c'hai un delay(3000) sopra quindi non e' immediato... il controllo avviene ogni tre secondi
  119.  
  120. #if DEBUG_CLIENT
  121.   String modemInfo = modem.getModemInfo(); // questa riga te l ho portata dentro  l'if altrimenti è inutile
  122.                                            //---> ok
  123.   SerialMon.print("Modem: ");
  124.   SerialMon.println(modemInfo);
  125.   SerialMon.print("Connessione alla rete...");
  126. #endif
  127.   while (!modem.waitForNetwork()) {    ////modificato if con while <------   !!!!
  128. #if DEBUG_CLIENT
  129.     SerialMon.println("Attesa network...");
  130. #endif
  131.  
  132.   delay(100);
  133.   digitalWrite (12, LOW);
  134.   delay(100);
  135.   digitalWrite (12, HIGH);
  136.   delay (3000);
  137.   digitalWrite (12, LOW);
  138.   delay(100);  // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
  139.   delay(2000);
  140. //
  141. //cambia un po' i tempi in modo che quando vedi lampeggiare
  142. //non so tre lampeggii brevi questo errore      
  143. //tre lampegii lunghi un altro errore....
  144. }
  145. #if DEBUG_CLIENT
  146.   SerialMon.println(" OK");
  147.   SerialMon.print("Connessione a: ");
  148.   SerialMon.print(apn);
  149. #endif
  150.   while (!modem.gprsConnect(apn, user, pass)) {  //modificato if con while <------   !!!!
  151. #if DEBUG_CLIENT
  152.     SerialMon.println(" Waiting gprsConnect...."); //almeno sai cosa ha fallito
  153. #endif
  154.     delay(100);
  155.   digitalWrite (12, LOW);
  156.   delay(100);
  157.   digitalWrite (12, HIGH);
  158.   delay (3000);
  159.   digitalWrite (12, LOW);
  160.   delay(100);  // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
  161.   delay(2000);
  162. //
  163. //cambia un po' i tempi in modo che quando vedi lampeggiare
  164. //non so tre lampeggii brevi questo errore      
  165. //tre lampegii lunghi un altro errore....
  166.     //while (true); //qui abbiamo dicusso,al limite fai setup() come sopra... //commentato while <------   !!!!
  167.                   //--> consiglio? la mia soluzione setup e buona?
  168. // si,ma io farei cosi,col while ed i lampegii ...almeno sai dove si impalla....
  169.   }
  170. #if DEBUG_CLIENT
  171.   SerialMon.println(" OK");
  172. #endif
  173.  
  174.   mqtt.setServer(broker, 1883);
  175.   mqtt.setCallback(mqttCallback);
  176.  
  177.   temperatura = getTemp();  //non e' che deve essere inizializzata la sonda prima...non ricordo.
  178.                             //---> ho notato che sennò la prima lettura che fa e invia, mi da -501. Da noefita ho risolto
  179.                             //     cosi. :)
  180. //ti da -501 perchè è il primo caso di errore nella funzione getTemp() che hai sotto alla riga 268 :)
  181. //se ti funziona,lascia.
  182.   delay(100);
  183. }
  184.  
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////
  186. ////////////////////////////////// BOOL MQTT CONNECT //////////////////////////////////////////////
  187. ///////////////////////////////////////////////////////////////////////////////////////////////////
  188.  
  189. boolean mqttConnect() {
  190.  
  191. #if DEBUG_CLIENT
  192.   SerialMon.print("Connessione a MQTT: ");
  193.   SerialMon.print(broker);
  194. #endif
  195.  
  196.   byte willQoS = 0;
  197.   const char* willMessage = "offline";
  198.   boolean willRetain = true;
  199.  
  200.   boolean status = mqtt.connect("GsmClientTest2", "xxxxxxxxxx", "xxxxxxxxx", topicInit, willQoS, willRetain, willMessage);
  201.  
  202.   if (status == false) {
  203. #if DEBUG_CLIENT
  204.     SerialMon.println(" fail");
  205. #endif
  206.     return false;
  207.   }
  208. #if DEBUG_CLIENT
  209.   SerialMon.println(" OK");
  210. #endif
  211.   delay(10);
  212.   mqtt.publish(topicInit, "online", true);
  213.   temperatura = getTemp();
  214.   dtostrf(temperatura, 3, 2, temp);
  215.   mqtt.publish(topicTemp, temp);
  216. #if DEBUG_CLIENT
  217.   SerialMon.print(temperatura);
  218.   SerialMon.println("°C");
  219. #endif
  220.  
  221.   return mqtt.connected();
  222. }
  223.  
  224. ////////////////////////////////////////////////////////////////////////////////////////////////////
  225. ///////////////////////////////////// VOID LOOP ///////////////////////////////////////////////////
  226. ///////////////////////////////////////////////////////////////////////////////////////////////////
  227.  
  228. void loop() {
  229.  
  230.  
  231.   if (tentativi == 5) {
  232.     setup();
  233.   }
  234.  
  235.   if (!mqtt.connected()) {
  236. #if DEBUG_CLIENT
  237.     SerialMon.println("=== MQTT NOT CONNECTED ===");
  238. #endif
  239.     unsigned long t = millis();
  240.     if (t - lastReconnectAttempt > 10000L) {
  241.       lastReconnectAttempt = t;
  242.       tentativi ++;
  243. #if DEBUG_CLIENT
  244.       SerialMon.println (tentativi);
  245. #endif
  246.       if (mqttConnect()) {
  247.         lastReconnectAttempt = 0;
  248.       }
  249.     }
  250.     delay(100);
  251.     return;
  252.   }
  253.  
  254.   unsigned long e = millis();
  255.   if (e - lastSendGps > 30000L) {
  256.     getGps();
  257.     gps_latitude = 44.036013;
  258.     gps_longitude = 10.112153;
  259.     dtostrf(gps_latitude, 4, 6, lat);
  260.     dtostrf(gps_longitude, 4, 6, lon);
  261.     dtostrf(gps_speed, 3, 2, kmh);
  262.     String payload = "{\"longitude\":" + String(lon) + ",\"latitude\":" + String(lat) + "} ";
  263.     mqtt.publish(topicJson, payload.c_str());
  264.     mqtt.publish(topicSpeed, kmh, true);
  265.     lastSendGps = e;
  266.  
  267.   }
  268.  
  269.   unsigned long f = millis();
  270.   if (f - lastSendTemp > 300000L) {
  271.     temperatura = getTemp();
  272.     dtostrf(temperatura, 3, 2, temp);
  273.     mqtt.publish(topicTemp, temp, true);
  274. #if DEBUG_CLIENT
  275.     SerialMon.print(temperatura);
  276.     SerialMon.println("°C");
  277. #endif
  278.     lastSendTemp = f;
  279.   }
  280.  
  281.   unsigned long g = millis();
  282.   if (g - lastreset > 86400000L) {
  283.     resetta();
  284.   }
  285.  
  286.   wdt_reset();
  287.   mqtt.loop();
  288. }
  289.  
  290. ////////////////////////////////////////////////////////////////////////////////////////////////////
  291. ////////////////////////////////// VOID CALLBACK /////////////////////////////////////////////////
  292. ///////////////////////////////////////////////////////////////////////////////////////////////////
  293.  
  294. void mqttCallback(char* topic, byte* payload, unsigned int len) {
  295. #if DEBUG_CLIENT
  296.   SerialMon.print("Message arrived [");
  297.   SerialMon.print(topic);
  298.   SerialMon.print("]: ");
  299.   SerialMon.write(payload, len);
  300.   SerialMon.println();
  301. #endif
  302. }
  303.  
  304. ////////////////////////////////////////////////////////////////////////////////////////////////////
  305. ////////////////////////////////// FLOAT GET TEMP ///////////////////////////////////////////////////
  306. ///////////////////////////////////////////////////////////////////////////////////////////////////
  307.  
  308. float getTemp () {
  309.  
  310.   byte data[12];
  311.   byte addr[8];
  312.  
  313.   if ( !ds.search(addr)) {
  314.     ds.reset_search();
  315.     return -501;
  316.   }
  317.  
  318.   if ( OneWire::crc8( addr, 7) != addr[7]) {
  319. #if DEBUG_CLIENT
  320.     SerialMon.print(" CRC is not valid!");
  321. #endif
  322.     return -502;
  323.   }
  324.  
  325.   if ( addr[0] != 0x10 && addr[0] != 0x28) {
  326. #if DEBUG_CLIENT
  327.     SerialMon.print(" Device is not recognized");
  328. #endif
  329.     return -503;
  330.   }
  331.  
  332.   ds.reset();
  333.   ds.select(addr);
  334.   ds.write(0x44, 1);
  335.  
  336.   byte present = ds.reset();
  337.   ds.select(addr);
  338.   ds.write(0xBE);
  339.  
  340.   for (int i = 0; i < 9; i++) { // we need 9 bytes
  341.     data[i] = ds.read();
  342.   }
  343.  
  344.   ds.reset_search();
  345.  
  346.   byte MSB = data[1];
  347.   byte LSB = data[0];
  348.  
  349.   float tempRead = ((MSB << 8) | LSB);
  350.   float TemperatureSum = tempRead / 16;
  351.  
  352.   return TemperatureSum;
  353. }
  354.  
  355. ////////////////////////////////////////////////////////////////////////////////////////////////////
  356. ////////////////////////////////// VOID GET GPS ///////////////////////////////////////////////////
  357. ///////////////////////////////////////////////////////////////////////////////////////////////////
  358.  
  359. void getGps() {
  360.  
  361.   bool gps_fixstatus = modem.getGPS(&gps_latitude, &gps_longitude, &gps_alt, &gps_speed);
  362.   if ( gps_fixstatus ) {
  363.  
  364.     if (gps_speed < 3) {
  365.       gps_speed = 0;
  366.     }
  367. #if DEBUG_CLIENT
  368.     SerialMon.print("#Dati GPS: LAT: ");
  369.     SerialMon.print(gps_latitude, 5    );
  370.     SerialMon.print(" LON: ");
  371.     SerialMon.print(gps_longitude, 5);
  372.     SerialMon.print(" SPEED: ");
  373.     SerialMon.println(gps_speed);
  374. #endif
  375.   }
  376. }
  377.  
  378. ////////////////////////////////////////////////////////////////////////////////////////////////////
  379. ////////////////////////////////// VOID RESETTA ///////////////////////////////////////////////////
  380. ///////////////////////////////////////////////////////////////////////////////////////////////////
  381.  
  382. void resetta() {
  383.   wdt_enable(WDTO_250MS);
  384.   while(1);
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement