Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define TINY_GSM_MODEM_SIM808
- #define DEBUG_CLIENT 0 // toglierei lo zero e casomai commenterei la riga se non voglio il debug
- //--> lo uso con 1 e 0 per attivare e disattivare il debug senza dover commentare tutto prima di
- // caricare lo schetch. Ho letto che senza un pc collegato sennò va in crash per una specie di
- // memoria piena. Sbaglio?
- //no no il sistema e' buono e lo uso anche io
- // solo che
- #define DEBUG_CLIENT 0
- //e
- //#define DEBUG_CLIENT
- //sono la stessa cosa quindi io non uso lo zero e l'uno ,che puo confondere ma metto o tolgo le // davanti
- //le tolgo perche
- #define DEBUG_CLIENT 1
- #define DEBUG_CLIENT
- //sono la stessa cosa
- #include <TinyGsmClient.h>
- #include <PubSubClient.h>
- #include <SoftwareSerial.h>
- #include <OneWire.h>
- #include <avr/wdt.h>
- #define SerialMon Serial
- SoftwareSerial SerialAT(2, 3); // RX, TX
- int DS18B20_Pin = A0; // bus dati su pin analogico
- //--> ehehehe alle prime armi avevo seguito una guida, e lo avevano collegato li. Poi me ne sono
- // accorto, oramai ho lo scudo fatto ma ho letto che cmq arduino lo riesce a gestire come digitale
- // lo stesso. Sbaglio?
- //in generale no,ma l'ho notato. Non sono cosi...forbito da darti ulteriori info su cosa potrebbe succedere
- //probabilmente gli ingressi analogici hanno ANCHE la capacità analogica oltre a quella digitale :)
- OneWire ds(DS18B20_Pin);
- const char apn[] = "wap.tim.it";
- const char user[] = "";
- const char pass[] = "";
- const char* broker = "xxxxxxxxxxxxx.duckdns.org";
- const char* topicInit = "GsmClient1/init";
- const char* topicTemp = "GsmClient1/temp";
- const char* topicSpeed = "GsmClient1/speed";
- const char* topicJson = "location/camion1";
- float temperatura;
- float offsetTemp = 0; //questo non mi sembra usato //----> giusto! refuso vecchia versione e possibile implementazione
- float gps_latitude = 0;
- float gps_longitude = 0;
- float gps_speed = 0;
- float gps_alt = 0;
- char lat[15];
- char lon[15];
- char kmh[15];
- char temp[15];
- int tentativi = 0;
- TinyGsm modem(SerialAT);
- TinyGsmClient client(modem);
- PubSubClient mqtt(client);
- #define LED_PIN 13 //questo non mi sembra usato //---> Giusto! Refuso da schetch base usato per mqtt
- int ledStatus = LOW; //neanche questo //---> Giusto! Refuso da schetch base usato per mqtt
- long lastReconnectAttempt = 0;
- long lastSendTemp = 0;
- long lastSendGps = 0;
- long lastreset = 0;
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////// VOID SETUP ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void setup() {
- wdt_disable(); // da togliere //----> ok
- tentativi = 0;
- pinMode (12, OUTPUT); /// tutto qua per me non serve...un lampeggio....
- delay(100);
- digitalWrite (12, LOW);
- delay(100);
- digitalWrite (12, HIGH);
- delay (3000);
- digitalWrite (12, LOW);
- delay(100); // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
- //Benissimo , cambia sopra #define LED_PIN 13 in #define LED_PIN 12 e qui metti LED_PIN al posto del 12
- // in modo che se in un futuro cambi il piedinio collegato al led di segnalazione
- //devi cambiare solo nel define il pin associato :)
- //ed il codice e' piu leggibile
- SerialMon.begin(9600);
- delay(10);
- SerialAT.begin(9600);
- delay(100);
- #if DEBUG_CLIENT
- SerialMon.println("Initializzo il modem...");
- #endif
- modem.restart();
- // un delay(10) qui //---> ok
- if (modem.enableGPS()) {
- #if DEBUG_CLIENT
- SerialMon.println("Modulo GPS On");
- #endif
- } else {
- #if DEBUG_CLIENT
- SerialMon.println("Modulo GPS Off");
- #endif
- setup(); //praticamente se il modulo GPS e off vai immediatamente al setup di nuovo
- //---> se era acceso il passaggio commentato prima, lo spegne. Avevo provato a mettere il lampeggio sopra in
- // un if, ma nn aveva funzionato e quindi ho lasciato questa che cmq funziona.
- }
- //si c'hai un delay(3000) sopra quindi non e' immediato... il controllo avviene ogni tre secondi
- #if DEBUG_CLIENT
- String modemInfo = modem.getModemInfo(); // questa riga te l ho portata dentro l'if altrimenti è inutile
- //---> ok
- SerialMon.print("Modem: ");
- SerialMon.println(modemInfo);
- SerialMon.print("Connessione alla rete...");
- #endif
- while (!modem.waitForNetwork()) { ////modificato if con while <------ !!!!
- #if DEBUG_CLIENT
- SerialMon.println("Attesa network...");
- #endif
- delay(100);
- digitalWrite (12, LOW);
- delay(100);
- digitalWrite (12, HIGH);
- delay (3000);
- digitalWrite (12, LOW);
- delay(100); // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
- delay(2000);
- //
- //cambia un po' i tempi in modo che quando vedi lampeggiare
- //non so tre lampeggii brevi questo errore
- //tre lampegii lunghi un altro errore....
- }
- #if DEBUG_CLIENT
- SerialMon.println(" OK");
- SerialMon.print("Connessione a: ");
- SerialMon.print(apn);
- #endif
- while (!modem.gprsConnect(apn, user, pass)) { //modificato if con while <------ !!!!
- #if DEBUG_CLIENT
- SerialMon.println(" Waiting gprsConnect...."); //almeno sai cosa ha fallito
- #endif
- delay(100);
- digitalWrite (12, LOW);
- delay(100);
- digitalWrite (12, HIGH);
- delay (3000);
- digitalWrite (12, LOW);
- delay(100); // fino a qui intendo //--> Mi serve in caso venga a mancare l'alimentazione per accendere il modulo GPS/GSM
- delay(2000);
- //
- //cambia un po' i tempi in modo che quando vedi lampeggiare
- //non so tre lampeggii brevi questo errore
- //tre lampegii lunghi un altro errore....
- //while (true); //qui abbiamo dicusso,al limite fai setup() come sopra... //commentato while <------ !!!!
- //--> consiglio? la mia soluzione setup e buona?
- // si,ma io farei cosi,col while ed i lampegii ...almeno sai dove si impalla....
- }
- #if DEBUG_CLIENT
- SerialMon.println(" OK");
- #endif
- mqtt.setServer(broker, 1883);
- mqtt.setCallback(mqttCallback);
- temperatura = getTemp(); //non e' che deve essere inizializzata la sonda prima...non ricordo.
- //---> ho notato che sennò la prima lettura che fa e invia, mi da -501. Da noefita ho risolto
- // cosi. :)
- //ti da -501 perchè è il primo caso di errore nella funzione getTemp() che hai sotto alla riga 268 :)
- //se ti funziona,lascia.
- delay(100);
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// BOOL MQTT CONNECT //////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- boolean mqttConnect() {
- #if DEBUG_CLIENT
- SerialMon.print("Connessione a MQTT: ");
- SerialMon.print(broker);
- #endif
- byte willQoS = 0;
- const char* willMessage = "offline";
- boolean willRetain = true;
- boolean status = mqtt.connect("GsmClientTest2", "xxxxxxxxxx", "xxxxxxxxx", topicInit, willQoS, willRetain, willMessage);
- if (status == false) {
- #if DEBUG_CLIENT
- SerialMon.println(" fail");
- #endif
- return false;
- }
- #if DEBUG_CLIENT
- SerialMon.println(" OK");
- #endif
- delay(10);
- mqtt.publish(topicInit, "online", true);
- temperatura = getTemp();
- dtostrf(temperatura, 3, 2, temp);
- mqtt.publish(topicTemp, temp);
- #if DEBUG_CLIENT
- SerialMon.print(temperatura);
- SerialMon.println("°C");
- #endif
- return mqtt.connected();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////// VOID LOOP ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void loop() {
- if (tentativi == 5) {
- setup();
- }
- if (!mqtt.connected()) {
- #if DEBUG_CLIENT
- SerialMon.println("=== MQTT NOT CONNECTED ===");
- #endif
- unsigned long t = millis();
- if (t - lastReconnectAttempt > 10000L) {
- lastReconnectAttempt = t;
- tentativi ++;
- #if DEBUG_CLIENT
- SerialMon.println (tentativi);
- #endif
- if (mqttConnect()) {
- lastReconnectAttempt = 0;
- }
- }
- delay(100);
- return;
- }
- unsigned long e = millis();
- if (e - lastSendGps > 30000L) {
- getGps();
- gps_latitude = 44.036013;
- gps_longitude = 10.112153;
- dtostrf(gps_latitude, 4, 6, lat);
- dtostrf(gps_longitude, 4, 6, lon);
- dtostrf(gps_speed, 3, 2, kmh);
- String payload = "{\"longitude\":" + String(lon) + ",\"latitude\":" + String(lat) + "} ";
- mqtt.publish(topicJson, payload.c_str());
- mqtt.publish(topicSpeed, kmh, true);
- lastSendGps = e;
- }
- unsigned long f = millis();
- if (f - lastSendTemp > 300000L) {
- temperatura = getTemp();
- dtostrf(temperatura, 3, 2, temp);
- mqtt.publish(topicTemp, temp, true);
- #if DEBUG_CLIENT
- SerialMon.print(temperatura);
- SerialMon.println("°C");
- #endif
- lastSendTemp = f;
- }
- unsigned long g = millis();
- if (g - lastreset > 86400000L) {
- resetta();
- }
- wdt_reset();
- mqtt.loop();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// VOID CALLBACK /////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void mqttCallback(char* topic, byte* payload, unsigned int len) {
- #if DEBUG_CLIENT
- SerialMon.print("Message arrived [");
- SerialMon.print(topic);
- SerialMon.print("]: ");
- SerialMon.write(payload, len);
- SerialMon.println();
- #endif
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// FLOAT GET TEMP ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- float getTemp () {
- byte data[12];
- byte addr[8];
- if ( !ds.search(addr)) {
- ds.reset_search();
- return -501;
- }
- if ( OneWire::crc8( addr, 7) != addr[7]) {
- #if DEBUG_CLIENT
- SerialMon.print(" CRC is not valid!");
- #endif
- return -502;
- }
- if ( addr[0] != 0x10 && addr[0] != 0x28) {
- #if DEBUG_CLIENT
- SerialMon.print(" Device is not recognized");
- #endif
- return -503;
- }
- ds.reset();
- ds.select(addr);
- ds.write(0x44, 1);
- byte present = ds.reset();
- ds.select(addr);
- ds.write(0xBE);
- for (int i = 0; i < 9; i++) { // we need 9 bytes
- data[i] = ds.read();
- }
- ds.reset_search();
- byte MSB = data[1];
- byte LSB = data[0];
- float tempRead = ((MSB << 8) | LSB);
- float TemperatureSum = tempRead / 16;
- return TemperatureSum;
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// VOID GET GPS ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void getGps() {
- bool gps_fixstatus = modem.getGPS(&gps_latitude, &gps_longitude, &gps_alt, &gps_speed);
- if ( gps_fixstatus ) {
- if (gps_speed < 3) {
- gps_speed = 0;
- }
- #if DEBUG_CLIENT
- SerialMon.print("#Dati GPS: LAT: ");
- SerialMon.print(gps_latitude, 5 );
- SerialMon.print(" LON: ");
- SerialMon.print(gps_longitude, 5);
- SerialMon.print(" SPEED: ");
- SerialMon.println(gps_speed);
- #endif
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// VOID RESETTA ///////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- void resetta() {
- wdt_enable(WDTO_250MS);
- while(1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement