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à.