Team di Lavoro

Foto del Team sul posto di lavoro

Eccoci qui! Finalmente scoperti i volti del BeeSafeTeam, sempre operativi per raggiungere il traguardo dell’arnia 3.0…

Supportati dal Sig. Landoni Boris, titolare dell’Azienda Futura Group Srl, e dalla Prof.ssa Pili Ornella, docente dell’indirizzo elettronica e automazione presso l’istituto di istruzione superiore C. Facchinetti, stiamo lavorando sodo per raggiungere al più presto possibile il completamento dell’arnia 3.0.

Configurazione con 8 Celle di Carico (da 50kg)

Dalla configurazione dell’articolo precedente, oggi abbiamo collegato un secondo sistema composto sempre da 4 mezze celle di carico.

Il circuito complessivo è formato da 8 mezze celle di carico e 2 HX711 posizionati sotto a delle assi di legno per simulare la base d’appoggio “definitiva” dell’arnia.

Inizialmente abbiamo utilizzato Arduino Uno per verificare che il circuito realizzato funzionasse correttamente. In seguito abbiamo adattato il programma affinché possa essere utilizzato sulla Maduino SIM808.

Revisione – supporto Celle di Carico (LoadCell)

Supporto LoadCell

Abbiamo optato per un cambiamento del supporto delle celle di carico, poiché nella soluzione precedente avevamo una scarsa protezione dell’integrato HX711. Ora, essendo integrato nel supporto, gode di un maggior riparo.
La nuova piattaforma è inoltre più stabile.
Viene sempre stampata con stampante 3D, ed avvitata al pezzo di legno quadrato con viti autofilettanti. Le celle sono incastrate e successivamente fissate con viti e rondelle di tenuta.

Configurazione con 4 Celle di Carico (da 50kg)

Schema di collegamento per le celle di carico (load cell).
Fonte: FuturaElettronica

Negli schemi precedenti sono collegate tra loro 4 celle di carico, ognuna da 50kg di portata, per un totale di 200kg. Da ogni singola cella viene “prelevato” il cavo rosso e collegato ai pin della scheda HX711.
Questa configurazione (ponte di Wheatstone) permette di avere un sistema bilanciato in cui il peso è misurato in modo equilibrato, considerando la presenza di una cella di carico in ognuno dei 4 angoli della base per l’arnia.
È stata quindi realizzata una base dove fissare le celle di carico con i relativi supporti:


Caratteristiche – cella di carico:

Le celle di carico vengono impiegate per misurare un peso; sono composte solitamente da un elemento elastico (acciaio o alluminio, ha poca elasticità ma è molto resistente e sensibile), sul cui sono posizionati gli estensimetri, i quali hanno il compito di rilevare le minime variazioni di tale elemento, il quale subisce una leggera alterazione ma è in grado di tornare nella posizione di partenza iniziale. Questa variazione permette di effettuare una misura sul peso di un corpo, ma nel nostro caso permetterà di rilevare la presenza dell’arnia e della sua componentistica, infatti, quando il peso non verrà più riconosciuto o rilevato, l’allarme scatterà avvisando immediatamente il proprietario.

  • Capacità: 50 kg
  • Sensibilità di uscita: 1 mV ( ±0,1)
  • Non linearità: 0,05 (% sul Fondo Scala)
  • Isteresi: 0,05 (% sul Fondo Scala)
  • Ripetibilità: 0,05 (% sul Fondo Scala)
  • Creep dopo 1 minuto: 0,1 (% sul Fondo Scala)
  • Effetto della temperatura sull’uscita: 10°C (0,1% sul Fondo Scala)
  • Effetto della temperatura sullo zero: 10°C (0,3% sul Fondo Scala)
  • Resistenza d’ingresso: 1 kohm (±10)
  • Resistenza di uscita: 1 kohm (±10)
  • Resistenza di isolamento: >2000 Mohm
  • Temperatura di funzionamento: da -10°C a +40°C
  • Tensione eccitazione: 10 Volt
  • Dimensioni (mm): 34x34x8
  • Peso: 19 grammi
  • – filo rosso -> Positivo (VCC)
    – filo nero -> Negativo (GND)
    – filo bianco -> OUT (pin Digitale)
  • Documentazione Tecnica: datasheet

Interfacciamento celle di carico con Maduino – HX711:

Come definito nelle caratteristiche tecniche (ved. sopra), le celle di carico hanno un segnale in uscita in tensione nell’ordine dei mV.
Arduino non ha una risoluzione sufficiente a rilevare tensioni così basse. È quindi necessario utilizzare una scheda di interfaccia che amplifichi il segnale d’uscita in tensione (mV) della cella di carico, per poter essere gestito ed interpretato da Arduino.
La scheda di interfaccia HX711 (ADC) converte il segnale analogico “A” in un segnale digitale “D” a 24bit, adattando quindi l’uscita della cella di carico alla scheda Maduino.
Caratteristiche Tecniche – HX711: datasheet (MakerFabs)
L’HX711 ha 4 pin per il collegamento con la scheda Maduino:
– VCC -> pin +3.3V della Maduino
– DT -> pin digitale PWM
della Maduino
– SCK -> pin digitale
della Maduino
– GND -> pin GND
della Maduino

#include “HX711.h”
#define DOUT 4
#define CLK 5
const int buttonPin = 2;
int buttonState = 0;
HX711 scale(DOUT, CLK);
float calibration_factor = -9640.00; //-7050 worked for my 440lb max scale setup
void setup() {
Serial.begin(9600);
Serial.println(“HX711 calibration sketch”);
Serial.println(“Remove all weight from scale”);
Serial.println(“After readings begin, place known weight on scale”);
Serial.println(“Press + or a to increase calibration factor”);
Serial.println(“Press – or z to decrease calibration factor”);
scale.set_scale();
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
Serial.print(“Zero factor: “); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
Serial.println(zero_factor);
pinMode(buttonPin, INPUT);

}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
scale.set_scale();
scale.tare(); //Reset the scale to 0
long zero_factor = scale.read_average(); //Get a baseline reading
Serial.print(“Zero factor: “); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
Serial.println(zero_factor);
pinMode(buttonPin, INPUT);
}
scale.set_scale(calibration_factor); //Adjust to this calibration factor
Serial.print(“Reading: “);
float libbre = scale.get_units();
float kg = (libbre/2.2046);
Serial.print(kg, 1); //scale.get_units() returns a float
Serial.print(” kg”);
Serial.print(” calibration_factor: “);
Serial.print(calibration_factor);
Serial.println();

if(Serial.available())
{
char temp = Serial.read();
if(temp == ‘+’ || temp == ‘a’)
calibration_factor += 10;
else if(temp == ‘-‘ || temp == ‘z’)
calibration_factor -= 10;
}
}

Utilizzo delle Celle di Carico (LoadCell)

In questo progetto sono state utilizzate delle celle di carico per capire se l’arnia è stata sottratta.

Sfruttiamo questo tipo di sensore con lo scopo di verificare l’effettivo spostamento di essa: se viene rilevato un cambiamento repentino del peso, vuol dire che l’arnia è stata sollevata o il suo contenuto interno sottratto. Verrebbe pertanto inviato un SMS di allerta, in cui verranno fornite le coordinate precise (convertite in un link di google maps, costantemente aggiornate, in modo da localizzarla istantaneamente ed in maniera rapida), il livello di umidità e di temperatura. L’allarme resterà in funzione anche se successivamente il peso tornasse standard (in caso dopo il furto i ladri riappoggiassero l’arnia su un piano), finchè il proprietario non lo disattiverà dal proprio cellulare.

Utilizzeremo questo tipo di frame per contenere la cella di carico

Informazioni sulle Arnie

Com’è fatta un’arnia?


A FONDO

É la base di appoggio di tutta l’arnia. Viene sollevato dal suolo attraverso l’uso di pedane di materiale adatto a sostenere il peso dell’arnia ed è costituito da un insieme di listelli di legno di diverse misure. Le caratteristiche principali sono due: ha un’apertura sulla base che consente l’utilizzo di un fondo mobile (C) ed  del fondo antivarroa (B)non ha listelli di legno nella parte anteriore che risulta quindi aperta e sulla quale viene posta una griglia metallica (D).

BFONDO ANTIVARROA

É una rete di metallo il cui utilizzo si è molto diffuso negli ultimi anni a causa dell’acaro parassita varroa destructor. Quando il parassita precipita oltre la rete non è più in grado di risalireall’interno del nido.
 

CFONDO MOBILE

É una lastra di metallo estraibile attraverso la parte posteriore del fondo dell’arnia. Permette di controllare indirettamente non solo le attività delle api senza doverle disturbare aprendo l’arnia (es.: sarà per esempio possibile capire se hanno iniziato ad utilizzare le scorte di miele, nel qual caso si potranno osservare sulla lastra gli opercoli di cera delle celle un tempo chiuse e piene di miele) ma è possibile anche effettuare il conteggio della varroa e verificare lo stato di infestazione della famiglia.

DGRIGLIA METALLICA

É una griglia di metallo posta nella parte anteriore dell’arnia attraverso la quale le api entrano ed escono dal nido. Preclude ad animali di maggiori dimensioni di penetrare nel nido.

ENIDO

É una scatola di legno d’abete costituita da quattro pannelli. Al suo interno, nella parte superiore, presenta anteriormente e posteriormente delle scanalature che sono i punti di appoggio per i telaini da nido.

FTELAINI DA NIDO

Sono formati da quattro listelli di legnoIl superiore è il più lungo dei quattro e fa da sostegno a tutto il telaino appoggiandosi alle rientranze sulla parte anteriore e posteriore del nido. Dei telaini di un’arnia è il più grande. Il telaino viene “armato” facendovi passare dentro verticalmente in più punti un filo di ferro sul quale si pone poi il foglio cereo.

GESCLUDI REGINA

Si tratta di una griglia metallica che viene prodotta tramite stampi che presenta delle fessurecalibrate per permettere il passaggio esclusivamente alle api operaie impedendo alla regina, di dimensioni maggiori, di poter passare.

HMELARIO

Si tratta di una scatola in legno di abete che viene posta sopra all’escludi regina. Come il nido presenta delle scanalature nella parte anteriore e posteriore per permettere l’appoggio dei telaini da melario. E’ alto poco più della metà del nido.

ITELAINI DA MELARIO

Costituiti da quattro listelli di legno di cui il superiore più lungo per permettere l’appoggio sulle scanalature del melario. E’ alto circa la metà di un telaino da nido. Dato che solo le operaie riescono a raggiungere questi telaini grazie all’escludi regina (G)questi telaini non contengono covata.

LCOPRIFAVO

É una lastra di abete con un foro centrale ai cui lati vengono montati quattro regoli che permettono di tener sollevato il tetto (M)Il foro centrale può essere utilizzato per somministrare alimenti alle api.

MTETTO

Ha un’anima di legno d’abete su cui viene fissata una lamiera metallica per garantire una maggiore protezione all’arnia contro gli agenti atmosferici.

Fonte: https://www.ilmielebuono.it

Il peso di un’Arnia (vuota) può arrivare a 25Kg ovviamente il peso varia a seconda della capacità e la grandezza di essa. Esistono quattro tipi diversi di arnie denominati:

1)Langstroth: ha una capacità totale di 85L.

2)Dadant: questo tipo di arnia si suddivide in due diversi tipi: Dadant1 : che pesa 19Kg ed ha una capacità di 84L Dadant2: che pesa 22Kg ed ha una capacità di 86L

3)Lusitana: ha una capacità totale di 66L

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