Revisione – codice invio SMS con informazioni riguardo GPS, Peso, Temperatura ed Umidità

17/01/2019

Il codice precedente inviava le informazioni riguardo localizzazione GPS, Peso, Temperatura ed Umidità senza fare un refresh dei dati. I dati venivano quindi acquisiti una sola volta (all’avvio) e comunicati in loop, senza aggiornarli nel tempo.
Abbiamo quindi provveduto a revisionare il codice, diminuendo la latenza di acquisizione ed invio delle informazioni acquisite dai sensori (GPS, DHT11 e Cella di Carico).

Sono state utilizzate le seguenti librerie, compatibili con IDE Arduino:

  • HX711, per acquisire dati relativi al peso dalla Cella di Carico
  • SimpleDHT, per interfacciare il sensore DHT11 per rilevare Temperatura ed Umidità
  • TinyGSM, per la gestione della SIM e connessione dati (GPRS/GSM)
  • StreamDebugger, consente il debug dei comandi eseguiti nel codice Arduino

Codice Arduino (aggiornato al 17/01/2019):

#define TINY_GSM_MODEM_SIM808
int pon = 9;
#define SerialMon SerialUSB
#define SerialAT Serial1

//Cella di carico
#include "HX711.h"
#define DOUT A1
#define CLK A0
HX711 bilancia(DOUT, CLK);
int peso = 0; // zona di memorizzazione del peso corrente
int pesoprec = 0; // zona di memorizzazione dell'ultimo peso esposto

//DHT11
#include <SimpleDHT.h>
int pinDHT11 = 2;
SimpleDHT11 dht11(pinDHT11);
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;

//GSM
#define TINY_GSM_MODEM_SIM808
#define SerialMon SerialUSB
#define SerialAT Serial1
#define TINY_GSM_DEBUG SerialMon
#define SMS_TARGET  "+39xxxxxxxxxx" //NUMERO DI CELLULARE!
const char apn[]  = "YourAPN";
const char user[] = "";
const char pass[] = "";

#include <TinyGsmClient.h>
#ifdef DUMP_AT_COMMANDS
#include <StreamDebugger.h>
StreamDebugger debugger(SerialAT, SerialMon);
TinyGsm modem(debugger);
#else
TinyGsm modem(SerialAT);
#endif

String latitudine;
String longitudine;


void setup() {
  //Cella di Carico - Setup
  Serial.begin(9600);
  Serial.println("calcolo della tara");
  Serial.println("non mettere nulla sul piatto");
  delay (100);
  bilancia.set_scale(253); //inserire il valore di scala
  bilancia.tare(20); // il peso a vuoto e' considerato tara
  Serial.println("sistema pronto - system ready");

  //DHT11 Setup
  Serial.begin(9600);
  SerialMon.begin(9600);

  delay(3000);
  DBG("BeeSafe ON...");

  pinMode(pon, OUTPUT);
  digitalWrite(pon, HIGH);
  delay(3000);
  digitalWrite(pon, LOW);
  delay(3000);

  TinyGsmAutoBaud(SerialAT);
}

void loop() {

  //GSM
  DBG("Initializing modem...");
  if (!modem.restart()) {
    delay(10000);
  }
  bool res;
  String modemInfo = modem.getModemInfo();
  DBG("Modem:", modemInfo);
  String imei = modem.getIMEI();
  DBG("IMEI:", imei);
  String cop = modem.getOperator();
  DBG("Operator:", cop);
  IPAddress local = modem.localIP();
  DBG("Local IP:", local);
  int csq = modem.getSignalQuality();
  DBG("Signal quality:", csq);

  int battLevel = modem.getBattPercent();
  DBG("Battery lavel:", battLevel);
  float battVoltage = modem.getBattVoltage() / 1000.0F;
  DBG("Battery voltage:", battVoltage);

  String gsmLoc = modem.getGsmLocation();
  DBG("GSM location:", gsmLoc);
  String gsmTime = modem.getGSMDateTime(DATE_TIME);
  DBG("GSM Time:", gsmTime);
  String gsmDate = modem.getGSMDateTime(DATE_DATE);
  DBG("GSM Date:", gsmDate);

  String ussd_balance = modem.sendUSSD("*111#");
  DBG("Balance (USSD):", ussd_balance);
  String ussd_phone_num = modem.sendUSSD("*161#");
  DBG("Phone number (USSD):", ussd_phone_num);

#if defined(TINY_GSM_MODEM_SIM808)
  modem.enableGPS();
  String gps_raw = modem.getGPSraw();

  modem.disableGPS();
  DBG("GPS raw data:", gps_raw);
#endif

#if defined(SMS_TARGET)
  res = modem.sendSMS(SMS_TARGET, String("Hello from BeeSafe -> IMEI: ") + imei);
  DBG("SMS:", res ? "OK" : "fail");
#endif

  while (1) {
#if defined(TINY_GSM_MODEM_SIM808)
    modem.enableGPS();
    String gps_raw = modem.getGPSraw();

    DBG("GPS raw data:", gps_raw);

    int counter = 0;
    String pieces[30];
    int ultimavirgola = 0;
    int a = 0;
      for (a = 0; a < gps_raw.length(); a++) {
        if (gps_raw.substring(a, a + 1) == ",") {
          pieces[counter] = gps_raw.substring(ultimavirgola, a);
          DBG("trovata una virgola");
          ultimavirgola = a + 1;
          DBG("b");
          counter++;
        }
  
        if (a == gps_raw.length() - 1) {
          pieces[counter] = gps_raw.substring(ultimavirgola, a);
        }

        latitudine = pieces[3];
        longitudine = pieces[4];
        DBG("https://www.google.com/maps?q=loc:"); DBG(latitudine); DBG(","); DBG(longitudine);
      }
    
#endif

  // Cella di carico
  peso=pesa();

  //DHT11
  int temperature=temp();
  int humidity=humd(); 

#if defined(SMS_TARGET)
  //if(gps_raw!="0,,,,,,,,,,,,,,,,,,,,"){
    res = modem.sendSMS(SMS_TARGET, "https://www.google.com/maps?q=loc:" + pieces[3] + "," + pieces[4] + "  Peso: " + peso + " g" + "  Temperatura: " + (int)temperature + " C" + "  Umidita': " + (int)humidity + " H");

    DBG("SMS:", res ? "OK" : "fail");

#endif
    int i = 15;
    while (i > 0) {
      delay (1000);
      i--;
      DBG("Invio sms tra ", i);
      DBG(" secondi");
    }
  }
#if defined(CALL_TARGET)
  DBG("Calling:", CALL_TARGET);

  // This is NOT supported on M590
  res = modem.callNumber(CALL_TARGET);
  DBG("Call:", res ? "OK" : "fail");

  if (res) {
    delay(1000L);

    // Play DTMF A, duration 1000ms
    modem.dtmfSend('A', 1000);

    for (char tone = '0'; tone <= '4'; tone++) {
      modem.dtmfSend(tone);
    }

    delay(5000);

    res = modem.callHangup();
    DBG("Hang up:", res ? "OK" : "fail");
  }
#endif

  modem.gprsDisconnect();
  if (!modem.isGprsConnected()) {
    DBG("GPRS disconnected");
  } 
  else {
    DBG("GPRS disconnect: Failed.");
  }

  modem.poweroff();
  DBG("Poweroff.");

  while (true) {
    modem.maintain();
  }
}


int temp(){
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Lettura fallita, err="); Serial.println(err); delay(1000);
  }

  Serial.print("Temperatura: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.println(" ");
  Serial.print("Umidita': ");
  Serial.print((int)humidity); Serial.println(" H");

  // DHT11 sampling rate is 1HZ.
  delay(1500);

  return int(temperature);
}

int humd(){
  byte temperature = 0;
  byte humidity = 0;
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Lettura fallita, err="); Serial.println(err); delay(1000);
  }

  Serial.print("Temperatura: ");
  Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.println(" ");
  Serial.print("Umidita': ");
  Serial.print((int)humidity); Serial.println(" H");

  // DHT11 sampling rate is 1HZ.
  delay(1500);

  return int(humidity);
}

int pesa(){
  peso = bilancia.get_units(20), 3;
  if (!(peso == pesoprec)) // se e' variato il peso
  {
    pesoprec = peso; // memorizza il peso corrente
    Serial.print("peso - weigth: ");
    Serial.print(peso);
    Serial.println("g");
  }

  return peso;
}

Prossimo step: inviare un messaggio con “Coordinate non disponibili” quando il segnale GPS non è presente, pur continuando a comunicare le informazioni relative al Peso, alla Temperatura e all’Umidità.

Lascia un commento