Senzor IoT temperatura cu transmisie GSM

Construieste-ti sezorul tau de temperatura IoT cu stocare de date in CLOUD. In acest proiect folosim senzorul 1 Wire 18B20 de la Dallas/Maxim si shieldul GSM dual SIM  a-gsmII sau shieldul GSM GNSS dual SIM b-gsmgnss  de la itbrainpower.net. Serviciul CLOUD este oferit gratuit de Robofun.

Necesar timp: 30-45 minute – pregatire hardware si aproximativ 30-60 minutes partea de software si setarile contului cloud.

Nivel de dificultate: intermediar.

Materiale necesare hardware IOT

Despre shieldurile GSM folosite
In acest proiect am folosit, pentru exemplificare, shieldul a-gsmII v2.105, dar exact aceleasi setari hardware se aplica pentru b-gsmgnss v2.105 (interfetele si jumperii sunt plasati in aceleasi pozitii). Mai multe informatii:
documentatie a-gsmII
documentatie b-gsmgnss

Detaliere senzor 18DS20
Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20 ca in imaginea de mai jos. Vezi referinta DALLAS/MAXIM 18B20.

Conectare hardware (toate componentele conectate in poza de mai jos)
Pasi de urmat:

  • lipiti headere (pini) ARDUINO la shieldul GSM a-gsmII
  • plug-in (conectati) sieldul a-gsmII in Arduino UNO
  • plasati jumperul a-gsmII “Power selector” in pozitia “Vin” (referinta)
  • inserati the SIM cardul in SIM socketul primar (slotul SIM aflat in proximitatea PCB). SIM-ul trebuie sa aiba dezactivata procedura de verificare a codului PIN (vezi cum se dezactiveaza verificarea PIN, aici).
  • Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20. Lipiti firele la terminalele senzorului 18B20.
  • Conectati firele 18B20 dupa cum urmeaza: 18B20 Vdd (pin3) la Arduino 5V, 18B20 DQ (pin2) la Arduino D8  si 18B20 GND (pin1) la Arduino GND.
  • conecteaza portul USB al Arduino UNO  la PCul tau

Alimentarea senzorului IOT va fi efectuata centralizat, prin intermediul conectorului de alimentare Arduino UNO.

SOFTWARE
a. Downloadeaza itbpGSMclass library [beta]: “a-gsmII series software IoT REST support for ARDUINO” de la a-gsmII download section, sau “b-gsmgnss series software IoT REST support for ARDUINO” de la b-gsmgnss download section. Pentru a efectua download-ul clasei va trebui sa introduci IMEI-ul (se afla marcat pe modem, sau poate fi citit folosind comanda “AT+CGSN”) si adresa ta de email.

b. Expandati archiva si instalati clasa. Pe scurt, copiati folderul “itbpGSMclass” in “Arduino local user folder” [la mine se afla in: “C:\Users\dragos\Documents\Arduino\libraries”], dupa care restartati mediul Arduino. Mai multe detalii despre intalarea manala de librarii Arduino: Arduino library manual installation.

c. Creaza un folder numit “agsmII_temperature_Robofun_cloud_logger”.

d. Salveaza codul din linkul de mai jos sub denumirea de “agsmII_temperature_Robofun_cloud_logger.ino” in folderul creat mai devreme: Temperature GSM IOT main Arduino code

e. Setari variabile in “agsmII_temperature_Robofun_cloud_logger.ino”:
– tempToken [linia 19] – inlocuieste cu tokenul senzorului tau generat in cloud Robofun
– samplingPeriod [line 29]

f. Setari variabile in “itbpGSMclass library”:
– seteaza SERVER_ADDRESS si SERVER_PORT in itbpGPRSIPdefinition.h pentru ROBOFUN CLOUD, ca mai jos
#define SERVER_ADDRESS “iot.robofun.ro”
#define SERVER_PORT “80”
– seteaza APN, USERNAME si PASSWORD, corespunzator SIM-ului tau, in itbpGPRSIPdefinition.h (pentru ORANGE RO, de exemplu, APN este “INTERNET” sau “NET”, USERNAME este “” si PASSWORD este “”)
– alege modemul itbrainpower folosit in itbpGSMdefinition.h, in acest caz:
#define __itbpModem__ agsmII
– nu uita sa salvezi setarile! 😉

g. alte setari utile >> itbpGSMClassDebug, atDebug on / off si MAX_BUFFER_SIZE… in itbpGSMdefinition.h

CLOUD ROBOFUN. CONT NOU, SENZORI si SETARI
CLOUDul Robofun este un serviciu extrem de simplu de utilizat si este disponibil in mod gratuit. Acesta este disponibil la adresa: https://iot.robofun.ro. Nu intru in detalii – creaza un cont nou si defineste un senzor nou. In interfata senzor, fa scroll down pana la paragraful “TOKEN”.

Copiaza acest cod si  foloseste-l pentru tempToken [linia 19 din “agsmII_…._logger.ino”]. Salveaza. Compileaza.

GATA!

Acest tutorial se bazeaza pe articolul “IoT temperature CLOUD logger with GSM and 1wire sensor howto” care a fost publicat original pe site-ul https://itbrainpower.net

 

Managementul conexiunii WiFi la ESP8266

Circuitul WiFi Espressif ESP8266 a reprezentat o evoluție importantă în universul plăcilor de dezvoltare în general dar și a comunității Arduino. Permițând conectivitate WiFi la un preț derizoriu și ușurință de programare și utilizare în cadrul sistemelor DIY, ESP8266 are o popularitate și o răspândire din ce în ce mai mare echipând plăci de dezvoltare diverse.

Facilitățile oferite de extensia ESP8266 pentru Arduino IDE includ conectarea la Internet prin intermediul unui AP, activarea ca un AP, funcționarea duală client WiFi și AP, utilizarea protocoalelor http și https, funcționarea ca server web sau server DNS ș.a.m.d. Toate aceste facilități oferite de circuitul ESP8266 fac din acesta un instrument extrem de util în cadrul proiectelor proprii. Una dintre problemele care apare totuși la construirea unui dispozitiv bazat pe circuitul ESP8266 este managementul datelor de conectarea la rețea. Dacă se dorește schimbarea datelor de acces la rețeaua WiFi (mutăm dispozitivul în altă locație sau modificăm infrastructura de acces la Internet) dispozitivul trebuie reprogramat. Chiar dacă luăm în calcul programarea OTA tot este necesară utilizarea unui sistem de calcul (PC sau laptop cu Arduino IDE instalat) pentru a modifica datele de acces (SSID și parolă).

Bineînțeles, este posibilă programarea unei interfețe web care să permită modificarea variabilelor corespunzătoare datelor de acces dar acest lucru este destul de consumator de timp și adaptarea codului pentru proiecte diverse este o sarcină repetitivă destul de anevoioasă. Din fericire există o bibliotecă software ce permite automatizarea acestui proces și ușurează foarte mult dezvoltarea noilor proiecte în care avem nevoie de modificarea parametrilor de funcționare fără a reprograma dispozitivul.

Această bibliotecă se numește WiFiManager și permite configurarea, prin intermediul unei interfețe web, a conexiunii WiFi în cazul în care configurarea implicită nu funcționează (interfața web de configurare se activează doar în cazul în care conectarea la rețea nu este posibilă cu datele de autentificare curente). Instalarea bibliotecii se face din Library Manager a mediului Arduino IDE. Testele au fost realizate pe o placă NodeMCU utilizând Arduino IDE 1.8.5 și extensia ESP8266 Community 2.4.1.

2

După instalarea bibliotecii facilitățile de configurare se includ în program inserând în cod secvențele următoare. La începutul programului se include biblioteca WiFiManager și dependințele acesteia:

#include <ESP8266WiFi.h>

#include <DNSServer.h>   

#include <ESP8266WebServer.h> 

#include <WiFiManager.h>

WiFiManager wifiManager;

În cadrul secțiunii setup() se înlocuiește codul obișnuit de conectare cu instrucțiunea:

wifiManager.autoConnect();

Execuția acesteia va conduce la conectarea la rețea dacă procesul de configurare a fost deja parcurs sau la blocarea programului și la pornirea interfeței de configurare web. Aceasta va fi accesibilă prin intermediul unui AP propriu sistemului, AP denumit ESPXXXXXX, la adresa IP 192.168.4.1 .

3

Interfața web permite configurarea și salvarea rețelei în care va funcționa dispozitivul, vizualizarea informațiilor hardware specifice plăcii de dezvoltare și resetarea acesteia.

4

5

Dacă conectivitatea de rețea nu este esențială în funcționarea dispozitivului – dispozitivul trebuie să funcționeze și fără conexiunea de rețea – putem adăuga următoarea instrucțiune pentru a defini un timp în care se așteaptă configurarea după care se trece mai departe la execuția normală a programului.

wifiManager.setConfigPortalTimeout(180);

În cazul în care dorim totuși să reluăm periodic tentativa de conectare la rețea, utilă de exemplu în cazul în care repornirea sistemului coincide cu indisponibilitatea AP-ului – datele de conectare sunt corecte dar în momentul în care se încearcă conectarea nu este disponibilă infrastructura, se poate insera o secvență de instrucțiuni, ca în exemplul de mai jos, în secțiunea loop():

if (WiFi.status() != WL_CONNECTED) wifiManager.autoConnect();

Pagina web de configurare poate fi pornită și în mod voit (la apăsarea unui buton de exemplu) prin intermediul instrucțiunii:

wifiManager.startConfigPortal();

O altă facilitate interesantă oferită de bibliotecă este posibilitatea de a adăuga în cadrul paginii de configurare a unor parametrii proprii ce vor fi salvați în memoria nevolatilă a circuitului ESP8266. Instrucțiunile de mai jos definesc o variabilă server ce permite memorarea adresei de rețea a unui server MQTT. Datele de configurat vor apărea în interfața web alături de configurația de acces în rețeaua WiFi.

WiFiManagerParameter custom_mqtt_server(“server”, “mqtt server”, mqtt_server, 40);

wifiManager.addParameter(&custom_mqtt_server);

mqtt_server = custom_mqtt_server.getValue();

6

Arduino Zombification

În ciuda simplității modului de programare oferit de mediul Arduino IDE și de familia de plăci Arduino există implementată o soluție ce permite utilizarea plăcilor de dezvoltare Arduino ca simple periferice USB fără a fi nevoie a înțelege modul de funcționare și programare a acestora. Prin încărcarea unui program gata scris placa Arduino se transformă într-un echipament „zombie” ce execută instrucțiunile primite prin conexiunea USB conform unui protocol standard.

Protocolul de zombificare a unei plăci Arduino se numește Firmata și este integrat ca suport software (bibliotecă + exemple) în Arduino IDE. Pentru instalare și utilizare puteți consulta materialul „Arduino: Installing Standard Firmata”. După încărcarea exemplului StandardFirmata.ino pe orice placă de dezvoltare Arduino, aceasta se va comporta ca un periferic USB pe care îl putem accesa de pe un sistem de calcul (PC sau chiar Raspberry Pi). Accesul intermediat de protocolul Firmata face disponibile toate perifericele hardware ale plăcii de dezvoltare (pini I/O, convertor analog/numeric, magistrale I2C, SPI, pini de comandă PWM) programelor ce rulează pe sistemul de calcul la care este conectată placa. Biblioteca Firmata oferă exemple pentru majoritatea limbajelor de programare: .NET, Java, Perl, Python, PHP, Processing, Flash etc. Firmata reprezintă o soluție extrem de simplă pentru extinderea funcționalităților unei plăci Raspberry Pi prin conectarea la o placă Arduino (a se vedea și proiectul „Access GPIO of Arduino from Raspberry Pi”).

2

Versiunile recente ale bibliotecii Firmata extind posibilitatea de zombificare și a altor plăci precum ChipKIT (exemplul din bibliotecă: StandardFirmataChipKIT.ino) dar și utilizând alte modalități de interconectare între placa de dezvoltare și sistemul de calcul:

  • Utilizând exemplul ino putem utiliza de la distanță o placă Arduino prin intermediul unei conexiuni bluetooth. Exemplul funcționează pe plăci ce integrează modul de comunicație BLE (de exemplu Arduino 101) sau pe orice placă Arduino cu un modul BLE atașat (de exemplu Adafruit Bluefruit nRF8001).
  • Exemplul ino permite, bineînțeles, controlul de la distanță prin intermediul unei conexiuni WiFi. Este posibilă utilizarea mai multor tipuri de plăci precum Arduino MKR1000 sau plăci de dezvoltare bazate pe circuitul ESP8266 (de exemplu Adafruit Feather HUZZAH). Această variantă de zombificare este utilizată de multe limbaje de control la distanță precum Gobot [13] sau Johny-Five.

3

O altă formă de zombificare prin intermediul unei conexiuni WiFi este oferită de placa de dezvoltare Arduino Yun. Există două variante de control la distanță a perifericelor integrate în microcontrolerul ATmega32U4 aflat pe placa de dezvoltare:

  • Prin intermediul serviciilor web de tip API REST adică prin intermediul unor URL-uri ce pot accesa diverse resurse hardware ale microcontrolerului. Acestea pot fi configurate astfel încât accesul să fie protejat de o parolă. Accesând IP-ul plăcii și calea /arduino putem configura, de exemplu, pinii I/O (pe Arduino Yun vom avea încărcat exemplul ino al bibliotecii Bridge):

4

http://myArduinoYun.local/arduino/digital/13 : calls digitalRead(13);

http://myArduinoYun.local/arduino/digital/13/1 : calls digitalWrite(13,1);

http://myArduinoYun.local/arduino/analog/9/123 : analogWrite(9,123);

http://myArduinoYun.local/arduino/analog/2 : analogRead(2);

http://myArduinoYun.local/arduino/mode/13/input : pinMode(13, INPUT);

http://myArduinoYun.local/arduino/mode/13/output : pinMode(13, OUTPUT);

  • Ultimele versiuni de plăci Arduino Yun ce rulează LininoOS permit programarea automată a microcontrolerului ATmega32U4 si utilizarea acestuia ca un periferic sub sistemul de operare. Programarea se face cu ajutorul comenzii:

/usr/bin/lininoio start

5

Utilizarea perifericelor se poate face direct din script bash:

echo 1 > /sys/class/gpio/TXLD/value

sau din alte limbaje de programare, de exemplu Node.JS:

var board = new require(‘ideino-linino-lib’).Board();

var led = 1;

board.connect( function(){

    board.pinMode(“D13”, “OUTPUT”);

    setInterval(function(){

        board.digitalWrite(“D13”, led);

        led = 1 – led;

    },500);

});

O soluție de zombificare pentru plăcile de dezvoltare echipate cu circuitul ESP8266 este ESPEasy. Prin încărcare acestui software pe o placă bazată pe ESP8266 vom putea configura foarte simplu atât partea de conectivitate WiFi (credențialele de acces la Internet) cât și perifericele conectate precum și rolul îndeplinit de sistem (configurare conexiune servicii IoT sau Home Automation) – totul prin intermediul unei interfețe web foarte simple.

6

7

Cum sa realizăm localizarea obiectelor utilizând balize Bluetooth

Problema localizării unui obiect sau a unei persoane are soluții variate adaptate în funcție de domeniul de utilizare și de infrastructura tehnică pe care se bazează. Localizarea prin GPS este utilizată la ora actuală pe scară largă pentru localizare pe întreg cuprinsul globului. Această metodă este îmbunătățită prin implementarea unor mecanisme complementare precum aGPS ce îmbunătățesc precizia de localizare. Totuși, există cazuri în care localizarea prin GPS este dificilă dacă nu imposibilă, cel mai bun exemplu fiind localizarea în interiorul unei clădiri. În aceste cazuri se utilizează, cel mai adesea, metode de localizare bazate pe triangularizarea unui semnal radio. Semnalul radio poate fi bazat pe frecvențe și modulații speciale sau larg răspândite (precum semnalul WiFi). Ne propunem să explorăm această metodă utilizând cea mai simplă și ieftină soluție: localizarea bazată pe balize radio Bluetooth. În cadrul procesului de localizare vor fi implicate două tipuri de sisteme: balize radio Bluetooth și receptor radio bluetooth. Baliza radio Bluetooth are rolul de a emite un semnal radio la un interval de timp fix. Acest semnal radio va reprezenta elementul pe care se va realiza localizarea. Receptorul radio are rolul de a recepționa semnalul radio și, pe baza puterii acestuia, de a determina distanța aproximativă față de emițător (baliza radio). Având în vedere distanța maximă pe care poate să o acopere semnalul radio Bluetooth o astfel de metodă poate fi folosită pentru localizarea în incinte sau zone cu raza de câteva zeci de metri sau, în spații deschise, pâna la o sută de metri. Există două scenarii posibile de localizare: mai multe balize ce permit localizarea receptorului radio pe baza distanței față de fiecare baliză în parte sau mai multe sisteme de recepție ce permit localizarea unei balize pe baza distanței față de fiecare de fiecare sistem de recepție radio (în acest caz trebuie să existe o formă de comunicație între sistemele receptor pentru a realiza triangularizarea semnalului radio).

Algoritmul de triangularizare a poziției în funcție de distanțele dintre sisteme este în afara ariei de acoperire a acestui material. Soluția propusă acoperă doar partea de măsurare a puterii semnalului radio de către receptorul radio Bluetooth. Pentru mai multe informații puteți să consultați articolul: „DIY localization using radio frequency beacons”.

Pentru implementarea unei balize radio bluetooth se poate apela la orice sistem ce include un modul radio Bluetooth (de exemplu Bettle BLE sau Feather BLE) sau, o variantă mult mai ieftină și mai simplă, se poate utiliza un dispozitiv de urmărire de tip iTag.

2

Acest tip de dispozitiv este disponibil comercial cu prețuri pornind de la 2$ și este gândit pentru a fi folosit împreună cu telefonul mobil pentru a localiza diverse lucruri în imediata apropiere (chei sau chiar animale de companie). Telefonul mobil are rolul de receptor radio Bluetooth și va măsura distanța până la dispozitivul iTag (localizarea este bazată doar pe distanță și pe mișcarea telefonului mobil – ne depărtăm de obiectul căutat crește distanța, ne apropiem scade distanța). Dispozitivul iTag nu este altceva decât un dispozitiv Bluetooth programabil ce este produs în serie – are un preț foarte mic. Pentru a vedea ce conține un astfel de dispozitiv se poate parcurge articolul: „Cheap Ebay BLE Tag Teardown (iTag via iTracing app)”.

Pentru implementarea receptorului radio (în cazul în care dorim o soluție de localizare bazată pe un sistem personalizat sau nu dorim să fim dependenți de aplicația mobilă oferită de producătorii dispozitivului iTag) se poate utiliza orice placă de dezvoltare cu modul radio bluetooth încorporat și, foarte important, care permite măsurarea puterii semnalului recepționat. Una dintre variante este placa Raspberry Pi 3, se poate vedea și articolul „Beacon tracking with Node.js and Raspberry Pi”. O altă variantă, mai ieftină și care permite realizarea unor sisteme de recepție compacte, este utilizarea plăcilor de dezvoltare bazate pe microprocesorul ESP32 ce integrează un modul radio Bluetooth.

3

Grație bibliotecii ESP32 BLE Arduino se poate implementa orice tip de comunicație bluetooth cu ajutorul circuitului ESP32 și a mediului de dezvoltare Arduino IDE (toate celelalte bibloteci bluetooth sunt proprietar sau implică medii de dezvoltare scumpe).

Implementarea propusă pentru receptorul radio a fost testată pe o placă de dezvoltare Sparkfun ESP32 Thing utillizând Arduino IDE 1.8.5, Arduino core for ESP32 WiFi chip 0.0.1 și biblioteca ESP32 BLE 0.4.7.

#include <BLEDevice.h>

static BLEAddress *pServerAddress;

BLEScan* pBLEScan;

BLEClient*  pClient;

bool deviceFound = false;

Sistemul va scana timp de 30 de secunde după dispozitive Bluetooth ce se găsesc în vecinătate. Pentru fiecare dispozitiv găsit se va afișa, în consola serială, textul emis ca identificator și puterea semnalului recepționat (RSSI).

4

int scanTime = 30;

class MyAdvertisedDeviceCallbacks: public

BLEAdvertisedDeviceCallbacks {

      void onResult(BLEAdvertisedDevice advertisedDevice)

{

  Serial.print(“BLE Advertised Device found: “);

     Serial.println(advertisedDevice.toString().c_str());

      pServerAddress = new

 BLEAddress(advertisedDevice.getAddress());

      Serial.print(“RSSI: “);

      Serial.println(advertisedDevice.getRSSI());

}

};

void setup() {

  Serial.begin(115200);

  Serial.println(“Scanning…”);

  BLEDevice::init(“”);

  pClient  = BLEDevice::createClient();

  pBLEScan = BLEDevice::getScan();

  pBLEScan->setAdvertisedDeviceCallbacks(new

MyAdvertisedDeviceCallbacks());

  pBLEScan->setActiveScan(true);

}

Scanarea se va relua la fiecare 60 de secunde.

void loop() {

  Serial.println();

  Serial.println(“BLE Scan restarted…..”);

  deviceFound = false;

  BLEScanResults scanResults = pBLEScan->start(30);

  delay(6000);

}

Programul dat ca exemplu poate fi un bun punct de plecare pentru triangularizarea poziției pe baza puterii semnalului emis de baliza radio Bluetooth.

LoRa meets ESP32

Intrarea pe piață a microprocesorului SoC ESP32 a marcat o nouă și interesantă etapă în cadrul familiei de circuite produse de compania Espressif. Două nuclee LX6 ce lucrează la frecvențe de până la 240MHz, conectivitate WiFi b/g/n și bluetooth 4.2, convertor analog-numeric pe 12 biți / 18 canale, două convertoare numeric-analogice pe 8 biți, patru interfețe SPI, două I2C, două I2S și trei UART, interfață CAN bus 2.0 sunt doar câteva dintre facilitățile puse la dispoziția dezvoltatorilor de către ESP32 făcând din acesta o alternativă atrăgătoare pentru noi proiecte. Mai mult decât atâta, pe lângă plăci de dezvoltare bazate pe ESP32 precum Adafruit HUZZAH32, Sparkfun ESP32 Thing sau Olimex ESP32-Gateway, asistăm la apariția unei generații noi de plăci de dezvoltare ce combină conectivitatea circuitului ESP32 cu conectivitatea modulelor radio LoRa.

LoPy este o astfel de placă de dezvoltare dar putem aminti și alte variante precum HELTEC WiFi LoRa 32 sau TTGO ESP32 SX1276 LoRa. Chiar dacă placa de dezvoltare LoPy este gândită pentru a fi programată în mediul MicroPython există și posibilitatea de a utiliza mediul Arduino IDE.

Avantajele unei plăci de dezvoltare ce îmbină conectivitatea circuitului ESP32 (WiFi + bluetooth) cu conectivitatea unui modul radio LoRa (comunicații radio pe distanțe mari) sunt evidente: posibilitatea de implementarea de dispozitive IoT multiprotocol, posibilitatea de implementarea de sisteme gateway LoRa sau bluetooth – implementări ce nu necesită nici un fel de montaj electronic pentru partea de comunicație, placa de dezvoltare integrează toate componentele necesare.

Realizarea unui nod LoRaWAN TTN, de exemplu, este extrem de simplă fără a fi nevoie să interconectăm o placă de dezvoltare cu un modul radio LoRa. Plecând de la exemplul ttn-abp al bibliotecii LMIC trebuie să personalizăm datele de autentificare în rețeaua TTN (obținute în urma înregistrării gratuite):

static const PROGMEM u1_t NWKSKEY[16] = { … };

static const u1_t PROGMEM APPSKEY[16] = { … };

static const u4_t DEVADDR = … ;

să modificăm pinii utilizați de modulul LoRa:

const lmic_pinmap lmic_pins = {

    .nss = 18,

    .rxtx = LMIC_UNUSED_PIN,

    .rst = 14,

    .dio = {26, 33, 32},

};

și să inserăm comanda de inițializare personalizată a portului SPI în cadrul secțiunii setup():

SPI.begin(5,19,27,18);

Pentru mai multe informații puteți consulta și materialele: „The ESP32 Oled Lora TTGO LoRa32 board and connecting it to TTN” și „Easy LoRaWAN and more with LoPy”.

Pentru a crea un gateway LoRaWAN TTN putem să apelăm la pachetul software Single Channel LoRaWAN Gateway în care vom avea de făcut câteva personalizări minore. În fișierul ESP-sc-gway.h vom modifica următoarele secțiuni:

  • Datele de identificare ale sistemului gateway (coordonate GPS, altitudine, platformă, descriere și email de contact)

#define _DESCRIPTION “ESP32 Single Channel Gateway”

#define _EMAIL “…”

#define _PLATFORM “ESP32”

#define _LAT …

#define _LON …

#define _ALT …

  • Datele serverului NTP cu care vom realiza sincroniza ceasul și fusul orar

#define NTP_TIMESERVER    “ro.pool.ntp.org”

#define NTP_TIMEZONES     2

#define SECS_PER_HOUR     3600

#define NTP_INTR      0

  • Datele de conectare la rețeaua WiFi ce asigură conectivitatea Internet

wpas wpa[] = {

{ “” , “” },

{ “…”, “…” }

};

După încărcarea programului pe placa de dezvoltare, deschizând consola serială a mediului Arduino IDE, obținem ID-ul gateway-ului ce trebuie înregistrat pe platforma TTN:

2

Sistemul gateway dispune de o interfață web (accesibilă din rețeaua locală din care face parte sistemul) ce permite supravegherea funcționării și modificarea unor parametrii (precum canalul radio pe care ascultă gateway-ul):

3

Pentru mai multe detalii despre implementarea unui sistem gateway LoRaWAN TTN puteți consulta și materialele: „LoPy to Single Channel Gateway to The Things Network” și „BIG ESP32 / SX127x”.

Carte „10(zece) proiecte Internet of Things” în format electronic

Carte „10(zece) proiecte Internet of Things” în format electronic.

240 de pagini cu proiecte despre Internetul obiectelor utilizând plăci de dezvoltare Arduino, Raspberry Pi și ESP8266.

Cartea poate fi cumpărată din magazinul 10proiecte iar plata se va face utilizând portalul PayPal. Formatul electronic permite accesul complet la formatul PDF al cărții cu posibilitate de tipărire și extragere de conținut.

banner

10ProiecteIoT_Cuprins

10ProiecteIoT_PrezentareProiecte

Puteți comanda cartea în format tipărit de pe site-ul Robofun la prețul de 39RON.

Touchless Heart

În cadrul acestui proiect vom exemplifica utilizarea senzorului APDS-9960. Acest senzor poate fi utilizat în aplicații diverse de detecție a luminii, a culorilor, a proximității dar și a gesturilor. Detecția gesturilor utilizatorului este funcționalitatea inedită oferită de senzorul APDS-9960. Această funcționalitate o vom utiliza pentru a controla prin gesturi o inimă de hârtie semitransparentă în care vom introduce un LED brick RGB. La pornirea sistemului LED-ul va pulsa roșu. Dacă vom apropria mâna de montaj LED-ul va pulsa din ce în ce mai rapid sugerând  emoție. Dacă vom depărta mâna LED-ul își va schima culoare din roșu în verde sugerând dezamăgire. Există 6 gesturi ce pot fi captate de senzor: apropierea și depărtarea mâinii, mișcare la dreapta, stânga, sus și jos. Având în vedere acest lucru, sistemul propus poate fi complicat mai ales că LED-ul utilizat poate genera o multitudine de culori și moduri de funcționare. Puteți crea o poveste proprie în care să îmbinați gesturi, culori și o „inimă de neatins”.

Pentru implementarea algoritmului de funcționare vom utiliza o placă de dezvoltare Arduino Uno dar poate fi utilizată orice placă Arduino. Conectarea dintre senzor și placa de dezvoltare se va face utilizând magistrala I2C, schema de interconectare este următoarea:

3

Pinul INT al senzorului se va conecta la pinul D2 al plăcii de dezvoltare, SCL la A5, SDA la A4, VCC la 3.3V și GND la GND. Pentru mai multe informații despre funcționarea senzorului APDS-9960 puteți consulta: „APDS-9960 RGB and Gesture Sensor Hookup Guide”.

Brick-ul LED RGB se conectează la placa de dezvoltare prin intermediul pinilor D5 (red), D6 (green) și D9 (blue) – toți cei trei pini ai plăcii de dezvoltare au capabilitatea de a genera semnal PWM adică puteți folosi și efecte de aprindere parțială a oricărei dintre cele trei culori (roșu, verde, albastru).

Programul sistemului este derivat din exemplul GestureTest.ino al bibliotecii Sparkfun APDS-9960 RGB and Gesture Sensor. Programul a fost testat utilizând Arduino IDE 1.8.5 și biblioteca Sparkfun APDS-9960 RGB and Gesture Sensor 1.4.2. În consola serială se va afișa interpretarea gesturilor recunoscute de senzor (FAR, NEAR, UP, DOWN, LEFT, RIGHT) chiar dacă pentru comanda inimii sunt folosite doar două (FAR și NEAR). NONE semnifică nerecunoaștere gestului.

4

#include <Wire.h>

#include <SparkFun_APDS9960.h>

#define APDS9960_INT    2

#define redPin   5

#define greenPin 6

#define bluePin 9

SparkFun_APDS9960 apds = SparkFun_APDS9960();

int isr_flag = 0;

byte r,g,b;

int beat;

void setup() {

  pinMode(APDS9960_INT, INPUT);

  pinMode(redPin, OUTPUT);

  pinMode(greenPin, OUTPUT);

  pinMode(bluePin, OUTPUT);

  Serial.begin(9600);

  Serial.println();

  Serial.println(F(“——————————–“));

  Serial.println(F(“Touchless Heart – Start beating…”));

  Serial.println(F(“——————————–“));

  attachInterrupt(0, interruptRoutine, FALLING);

  if ( apds.init() ) {

    Serial.println(F(“APDS-9960 initialization

complete”));

  } else {

    Serial.println(F(“Something went wrong during APDS-

9960 init!”));

  }

  if ( apds.enableGestureSensor(true) ) {

    Serial.println(F(“Gesture sensor is now running”));

  } else {

    Serial.println(F(“Something went wrong during gesture

sensor init!”));

  }

  r=255;

  g=0;

  b=0;

  beat = 1000;

}

Programul pornește cu un beat (interval de timp aprins / stins) de 1000 ms (1 secundă). La fiecare semn de apropriere (NEAR) recunoscut din acesta se scade 100 ms. La semnul de îndepărtare (FAR) intervalul revine la 1000 ms.

void loop() {

  if( isr_flag == 1 ) {

    detachInterrupt(0);

    handleGesture();

    isr_flag = 0;

    attachInterrupt(0, interruptRoutine, FALLING);

  }

  color(r,g,b);

  delay(beat);

  color(0,0,0);

  delay(beat);

}

void color(byte red, byte green, byte blue) {

  analogWrite(redPin, red);

  analogWrite(greenPin, green);

  analogWrite(bluePin, blue);

}

void interruptRoutine() { isr_flag = 1; }

void handleGesture() {

    if ( apds.isGestureAvailable() ) {

    switch ( apds.readGesture() ) {

      case DIR_UP:

        Serial.println(“UP”);

           break;

      case DIR_DOWN:

        Serial.println(“DOWN”);

        break;

      case DIR_LEFT:

        Serial.println(“LEFT”);

        break;

      case DIR_RIGHT:

        Serial.println(“RIGHT”);

        break;

      case DIR_NEAR:

        Serial.println(“NEAR”);

        r=255;

        g=0;

        beat-=100;

        break;

      case DIR_FAR:

        Serial.println(“FAR”);

        r=0;

        g=255;

        beat = 1000;

        break;

      default:

        Serial.println(“NONE”);

    }

  }

}

Vă recomandăm și un proiect interesant ce utilizează senzorul APDS-9960 pentru a detecta culorile: „Arduino Color Differentiate /with Apds-9960”.