Solar Power GPRS Test

Întrebarea la care vom încerca să răspundem în cadrul acestui proiect este: putem construi un sistem IoT cu comunicație GPRS total independent de alimentarea de la rețeaua de energie? Sistemul propus pentru testare este un sistem ce se bazează exclusiv pe alimentare solară. Un astfel de sistem poate fi folosit pentru locații izolate în care nu există disponibile alimentare cu energie electrică și Internet.

Ca soluție de alimentare solară vom utiliza o componentă MPPT: Sunny Buddy – MPPT Solar Charger. Această componentă permite conectarea unei celule solare cu ieșirea între 6V și 20V și încărcarea unui acumulator LiIon sau LiPo cu o singură celulă (3.7V). Curentul maxim de încărcare este de 450mA deci este necesară utilizarea unui acumulator de capacitate minimă 450mAh. În testul nostru vom utiliza o celulă solară de 2.5W / 9V și un acumulator LiPo de 800mAh.  Pentru mai multe detalii despre funcționarea componentei MPTT puteți consulta materialul „Sunny Buddy Solar Charger V13 Hookup Guide”.

Pentru partea de achiziție și raportare IoT vom utiliza placa de dezvoltare Adafruit Feather 32u4 FONA echipată cu un microcontroler ATmega32U4 (la fel ca și placa de dezvoltare Arduino Leonardo) și un controler GSM/2G SIM800 quad-band (850/900/1800/1900MHz).

2

Placa va supraveghea nivelul de încărcare a acumulatorului și va raporta prin Internet (prin intermediul conexiunii GPRS) valorile către serviciul cloud iot.robofun.ro. Placa de dezvoltare se va alimenta de la acumulatorul LiPo conectat la componenta MPPT și va servi ca element de descărcare pentru acesta. Pentru mai multe detalii despre funcționarea și utilizarea plăcii de dezvoltare Adafruit Feather 32U4 FONA puteți consulta materialul „Overview | Adafruit Feather 32u4 FONA | Adafruit Learning System”.

Diagrama de interconectare între componentele sistemului de test este următoarea:

4

Funcționarea plăcii de dezvoltare necesită o antenă GSM uFL. Pentru a minimiza consumul și pentru a putea controla inițializarea sistemului (mai ales în cazul în care acumulatorul sistemului nu este încărcat suficient) pinul KEY al modulului GSM se va deconecta de la masă (necesită tăierea jumperului KEY de pe spatele plăcii) și se va conecta la pinul 0 al plăcii de dezvoltare (firul galben din schema de interconectare).  În acest fel modulul GSM de pe placă nu va mai fi activ continuu ci doar în cazul în care îl vom activa din software. ATENȚIE!!! Această operație conduce la pierderea garanției oferite de producător.

Programul sistemului a fost dezvoltat și testat utilizând Arduino IDE 1.8.5 având instalate extensia Adafruit AVR Boards 1.4.11 și bibliotecile Adafruit FONA Library 1.3.3 și Sleep_n0m1 1.1.1.

#include “Adafruit_FONA.h”

#include <Wire.h>

#define FONA_RX 9

#define FONA_TX 8

#define FONA_RST 4

#define FONA_RI 7

#define FONA_KEY 1

#define FONA_ALARM 13

Definirea constantelor apn, apnusername și apnpassword sunt specifice rețelei de telefonie mobile al SIM-ului GSM utilizat. ATENȚIE!!! Placa de dezvoltare necesită un SIM GSM ce suportă standardul 2G, comunicația GSM nu va funcționa în cazul unui SIM GSM exclusiv 3G/4G.

#define apn “net”

#define apnusername “” 

#define apnpassword “” 

char replybuffer[255];

#include <SoftwareSerial.h>

SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);

SoftwareSerial *fonaSerial = &fonaSS;

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

#include <Sleep_n0m1.h>

Sleep sleep;

În cadrul secțiunii setup() se vor inițializa pinii de control utilizați pentru controlul modulului GSM (FONA_KEY este utilizat pentru activarea modulului GSM, FONA_ALARM este conectat la LED-ul de semnalizare al plăcii de dezvoltare și va fi utilizat pentru avertizarea imposibilității inițializării corecte a modulului GSM).

void setup() {

  pinMode(FONA_KEY,OUTPUT);

  digitalWrite(FONA_KEY,HIGH);

  pinMode(FONA_ALARM,OUTPUT);

  digitalWrite(FONA_ALARM,LOW);

}

Secțiunea loop() conține algortimul complet de inițializare și comandă pentru modulul GSM, achiziția nivelului de încărcare a bateriei și transmiterea prin Internet a valorilor către serviciul IoT. Primul pas în execuția algoritmului este intrarea în starea de consum redus pentru o oră – stare obligatorie pentru revenirea sistemului dintr-o stare de oprire completă generată de consumarea completă a acumulatorului (acumulatorul este încărcat suficient pentru inițializarea microcontrolerului ATmega32U4 dar nu și pentru inițializarea modulului GSM).

void loop() {

  sleep.pwrDownMode();

  sleep.sleepDelay(3600000);

Pornirea modulului GSM necesită un impuls de 2 secunde pe pinul FONA_KEY. Sistemul va încerca de 10 ori inițializarea modulului GSM după care va relua perioada de o oră de consum redus.

  digitalWrite(FONA_KEY,LOW);

  digitalWrite(FONA_ALARM,HIGH);

  delay(2000);

  digitalWrite(FONA_KEY,HIGH);

  digitalWrite(FONA_ALARM,LOW);

  delay(2000);

  fonaSerial->begin(4800);

  byte i = 0;

  while (!fona.begin(*fonaSerial)) {

      i++;

      if (i==10) break;

      digitalWrite(FONA_KEY,LOW);

      digitalWrite(FONA_ALARM,HIGH);

      delay(2000);

      digitalWrite(FONA_KEY,HIGH);

      digitalWrite(FONA_ALARM,LOW);

      delay(2000);      

  }

În cazul în care modulul GSM s-a inițializat corect se va încerca deblocarea cartelei SIM pe baza codului PIN (trebuie modificat în program în funcție de codul cartelei folosite). Dacă deblocarea cartelei SIM nu se poate face se va relua perioada de o oră de consum redus – este posibil ca acumulatorul să scadă sub pragul de alimentare corectă a modulului GSM între inițializare și deblocarea cartelei SIM.

if (i!=10) {

    if (! fona.unlockSIM(“0000”) ) {

digitalWrite(FONA_ALARM,HIGH);

delay(1000); i=10; }

    else {  

Programul va aștepta înregistrarea în rețeaua GSM a cartelei SIM a sistemului pentru o perioadă de 100 de secunde.

    uint8_t n = fona.getNetworkStatus();

     i=0;

      while (n!=1) {

        i++;

        if (i==10) break;

        digitalWrite(FONA_ALARM,HIGH);

        delay(5000);

        digitalWrite(FONA_ALARM,LOW);

        delay(5000);

        n = fona.getNetworkStatus();

       }

     }

Postarea valorii de încărcare a acumulatorului se va face doar dacă se va inițializa cu succes partea de comunicații de date (fona.enableGPRS). Măsurarea se va face chiar de modulul GSM. În cadrul programului trebuie personalizate cheile de autentificare (SENSOR_TOKEN1 și SENSOR_TOKEN2) obținute prin înregistrarea gratuită în cadrul serviciului iot.robofun.ro.

if(i!=10) {

      fona.setGPRSNetworkSettings(F(apn),

F(apnusername),F(apnpassword));

      if (fona.enableGPRS(true)) {

      uint16_t vbat;

      uint16_t pbat;

      fona.getBattVoltage(&vbat);

      fona.getBattPercent(&pbat);

      delay(1000);

      uint16_t statuscode;

      int16_t length;

      String SENSOR_TOKEN1=”…”;

      String SENSOR_TOKEN2=”…”;

      String data =

         String(“http”) + “://iot.robofun.ro/api/v1/senzor/” + SENSOR_TOKEN1 +  “/input?value=” + String(vbat, DEC);

      char url[100];

      data.toCharArray(url,data.length()+1);

      fona.HTTP_GET_start(url, &statuscode,

(uint16_t *)&length);

      while (length > 0) {

          while (fona.available()) {

            char c = fona.read();

            length–;

            if (! length) break;

          }

          break;

      } 

      fona.HTTP_GET_end();

      delay(100);

      data = String(“http”) + “://iot.robofun.ro/api/v1/senzor/”) + SENSOR_TOKEN2 + “/input?value=” + String(pbat, DEC);

      data.toCharArray(url,data.length()+1);

      fona.HTTP_GET_start(url, &statuscode,

(uint16_t *)&length);

      while (length > 0) {

          while (fona.available()) {

            char c = fona.read();

            length–;

            if (! length) break;

          }

          break;

      } 

      fona.HTTP_GET_end();

      delay(100);

    }

La final, înainte de reintrarea în modul de consum pentru o oră, se va opri modulul GSM printr-un puls de 2 secunde pe pinul FONA_KEY.

      digitalWrite(FONA_KEY,LOW);

      delay(2000);

      digitalWrite(FONA_KEY,HIGH);

    }

  }

}

Testul a fost efectuat pornind cu acumulatorul sistemului complet consumat (tensiune sub 3.3V). După o zi cu soare, când tensiunea acumulatorului a ajuns la 3.7V, sistemul s-a inițializat complet cu succes și a început să posteze pe serviciul IoT. Acest lucru înseamnă că sistemul își poate reveni dintr-o stare de oprire completă generată de descărcarea acumulatorului (mai multe zile fără lumină solară) fără intervenție umană.

5

În timpul unei zile cu soare acumulatorul câștigă aproximativ 30% din nivelul de încărcare iar procentul de descărcare într-o zi înorată este de circa 15%. Asta înseamnă că o zi cu soare poate fi urmată de două zile înorate fără ca sistemul să descarce acumulatorul. Dacă acumulatorul sistemului este complet încărcat, sistemul poate funcționa fără lumină solară pentru un interval de 6-7 zile

6

Testul efectuat dovește că se poate construi un sistem de raportare IoT GSM/GPRS care să funcționeze în mod autonom pe baza energiei solare fără să fie nevoie de intervenția umană în cazuri speciale de descărcare a acumulatorului.