Hunting the Heat

Măsurarea temperaturii este o operație simplă de achiziție din punct de vedere al unui sistem electronic. Monitorizarea temperaturii însă ridică câteva provocări cu privire la înregistrarea datelor și vizualizarea acestora. În cadrul proiectului de față vom da exemplu de două soluții de monitorizare a temperaturii prin intermediul unui serviciu de cloud.

Pentru trimiterea datelor în cloud vom utiliza placa de dezvoltare Adafruit Feather HUZZAH bazată pe microprocesorul WiFi ESP8266. Prima variantă de monitorizare va utiliza sensorul digital de temperatură și umiditate SHT11 – o soluție de precizie recomandată când dorim să monitorizăm temperatura din aer (ambientală). Din punct de vedere al confortului termic monitorizarea temperaturii trebuie însoțită de monitorizarea umidității din aer. Schema de interconectare dintre placa de dezvoltare și senzor este următoarea:

2

Senzorul se va alimenta la 3.3V iar liniile de comunicație se vor conecta la pinii 13 (pinul DAT al senzorului) și 15 (pinul SCK al senzorului) ai plăci de dezvoltare. Pentru intergrarea plăcii de dezvoltare în mediul Arduino IDE este necesară parcurgerea materialului „Adafruit Feather HUZZAH – WiFi with built-in battery charging for IoT on-the-go!”.

Ca serviciu de monitorizare în cloud vom utiliza serviciul Robofun IoT. Pentru utilizarea acestuia este necesară înregistrarea gratuită.

4

După înregistrare și conectare este necesară definirea a doi noi senzori (Adauga senzor) pentru a putea înregistra cele două valori măsurate (temperatură și umiditate).

5

După definirea celor doi senzori este necesar să copiem cheile de autentificare (Token) pentru a le utiliza în program.

3

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.3 cu extensia esp8266 2.3.0 instalată și biblioteca SHT1x commit be7042c. În cadrul programului trebuie personalizate datele de conectare WiFi (ssid și pass) precum și cheile de autentificare oferite de procesul de înregistrare a senzorilor pe platforma Robofun IoT (SENSOR_TOKEN1 și SENSOR_TOKEN2).

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>

char ssid[] = ““;    

char pass[] = ““;   

WiFiClient client;

#include <SHT1x.h>

#define dataPin  13

#define clockPin 15

SHT1x sht1x(dataPin, clockPin);

void setup() {

  Serial.begin(9600);

  delay(10);

  Serial.println();

  Serial.println();

  Serial.print(“Connecting to “);

  Serial.println(ssid);

  WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(“.”);

  }

  Serial.println(“”);

  Serial.println(“WiFi connected”); 

  Serial.println(“IP address: “);

  Serial.println(WiFi.localIP());

}

unsigned long lastConnectionTime = 0;

const unsigned long postingInterval = 60L * 1000L;

void loop() {

  if (millis() – lastConnectionTime > postingInterval) {

    IoTpublish();

  }

}

void IoTpublish() {

  String SENSOR_TOKEN1=”“;

  String SENSOR_TOKEN2=”“;

  float temp_c;

  float humidity;

  temp_c = sht1x.readTemperatureC();

  humidity = sht1x.readHumidity();

  Serial.print(“Temperature: “);

  Serial.print(temp_c, DEC);

  Serial.print(“C “);

  Serial.print(” Humidity: “);

  Serial.print(humidity);

  Serial.println(“%”);

   HTTPClient http;

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

  http.begin(data);

  int httpCode = http.GET();

  http.end();

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

  http.begin(data);

  httpCode = http.GET();

  http.end();

  lastConnectionTime = millis();

}

După încărcarea programului și punerea în funcțiune a sistemului putem monitoriza on-line valorile măsurate:

3

4

Cea de a doua variantă propusă pentru monitorizarea temperaturii este specifică monitorizării temperaturii materialelor și spațiilor de echipamente. Pentru măsurarea temperaturii vom utiliza senzorul digital DS18B20 ce permite realizarea unei rețele de senzori pe o magistrală cu un singur fir (1-Wire) facilitând astfel supravegherea temperaturii în mai multe puncte. Vom utiliza un modul brick DS18B20 ca prim element în rețeaua de senzori și mai mulți sensori DS18B20+ pentru diverse puncte de supraveghere.

Soluția bazată pe comunicația 1-Wire a fost aleasă pentru distanța mare la care pot fi plasați senzorii față de placa de dezvoltare (aproximativ 200 de metri) și a unui număr mare de senzori care pot fi conectați simultan (având în vedere faptul că fiecare senzor are o adresă proprie din fabricație pe 64 de biți nu există o limitare de protocol privind numărul de senzori dintr-o rețea). A se vedea și: „Guidelines for Reliable Long Line 1-Wire Networks”.

Prin intermediul rețelei de senzori DS18B20 sistemul va putea monitoriza din punct de vedere al măsurării temperaturii un număr ”nelimitat” de zone. Conectarea cu placa de dezvoltare implică conectarea componentei brick în felul următor: pinul GND al modulului la pinul de GND al plăcii de dezvoltare, pinul 5V la pinii de 3V al plăcii de dezvoltare (senzorii DS18B20 acceptă alimentare de la 3V la 5.5V) și pinul DQ al modulului la pinul 3 al plăcii de dezvoltare. Următorii senzori atașați în rețea se vor conecta la modulul brick prin intermediul conectorului cu șurub respectând semnificația pinilor.

5

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.3 cu extensia esp8266 2.3.0 instalată și bibliotecile OneWire 2.3.3 și DallasTemperature 3.7.6. În cadrul programului trebuie personalizate datele de conectare WiFi (ssid și pass) precum și cheile de autentificare oferite de procesul de înregistrare a senzorilor pe platforma Robofun IoT (vectorul SENSOR_TOKEN).

#include <ESP8266WiFi.h>

#include <ESP8266HTTPClient.h>

char ssid[] = ““;    

char pass[] = ““;   

WiFiClient client;

#include <DallasTemperature.h>

#include <OneWire.h>

#define ONE_WIRE_BUS 2

#define MAX_ATTACHED_DS18B20 10

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

int numSensors=2;

void setup() {

  sensors.begin();

  delay(100);

  Serial.begin(9600);

  delay(100);

  Serial.println();

  Serial.println();

  Serial.print(“Connecting to “);

  Serial.println(ssid);

  WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(“.”);

  }

  Serial.println(“”);

  Serial.println(“WiFi connected”); 

  Serial.println(“IP address: “);

  Serial.println(WiFi.localIP());

}

unsigned long lastConnectionTime = 0;

const unsigned long postingInterval = 60L * 1000L;

void loop() {

  if (millis() – lastConnectionTime > postingInterval) {

    IoTpublish();

  }

}

void IoTpublish() {

  String SENSOR_TOKEN[] = {““,”“};

  HTTPClient http;

  Serial.print(“Requesting temperatures…”);

  sensors.requestTemperatures();

  Serial.println(“DONE”);

  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++)  {

    float temperature = sensors.getTempCByIndex(i);

    Serial.print(“Temperature for the device “); Serial.print(i); Serial.print(” is: “);

    Serial.println(temperature); 

    String data = String(“http” + “://iot.robofun.ro/api/v1/senzor/”) + SENSOR_TOKEN[i] + “/input?value=” + String(temperature, DEC);

    http.begin(data);

    int httpCode = http.GET();

    if(httpCode > 0) {

      Serial.printf(“[HTTP] GET… code: %d\n”, httpCode);

      if(httpCode == HTTP_CODE_OK) {

        String payload = http.getString();

        Serial.println(payload);

      }

      } else {

      Serial.printf(“[HTTP] GET… failed, error: %s\n”,

             http.errorToString(httpCode).c_str());

      }

    http.end();

  }

  lastConnectionTime = millis();

}

Programul va prezenta în consolă desfășurarea procesului de achiziți și înregistrare cloud (exemplificare cu doi senzori conectați):

6

dar monitorizarea se va face online:

7

8

Blynk the Siren

Sirenele vizuale sunt elemente ce permit avertizarea unor situații de urgență dar pot fi și elemente de divertisment vizual. În cadrul materialului de față dorim să vă propunem un sistem de comandă la distanță (prin WiFi) a unei astfel de sirene luminoase.

Pentru comandă vom utiliza o placă de dezvoltare Adafruit Feather HUZZAH ESP8266 și un shield mini releu bistabil FeatherWing. Shieldul se conectează la placă în mod simplu (ca orice shield Arduino) dar este necesară realizarea a două conexiuni suplimentare: pinul SET la shield-ului se conectează la pinul 4 al shield-ului iar pinul UNSET la pinul 5. Pentru mai multe detalii legate de funcționarea shield-ului puteți consulta materialul „Mini Relay FeatherWings”.

Pentru transmiterea comenzii prin Internet se va utiliza serviciul Blynk despre care am vorbit și în materialul „Cum să realizăm un sistem IoT fără să scriem nici o linie de cod?”.. Programul pentru placa de dezvoltare a fost dezvoltat și testat utilizând mediul Arduino IDE 1.8.5 având instalate extensia ESP8266 Community 2.4.1 și biblioteca Blynk 0.5.3.

#include <ESP8266WiFi.h>

#include <BlynkSimpleEsp8266.h>

În cadrul programului trebuie personalizate datele de acces la o rețea WiFi și cheia de acces la serviciul Blynk ce se obține prin înregistrare gratuită.

char auth[] = “…”;

char ssid[] = “…”;

char pass[] = “…”;

#define SETPin 4

#define UNSETPin 5

În cadrul secțiunii setup() vom inițializa pinii de comandă (pinii 4 și 5 de SET și UNSET) și comunicația cu serviciul Blynk.

void setup() {

pinMode(SETPin, OUTPUT);

pinMode(UNSETPin, OUTPUT);

digitalWrite(SETPin,LOW);

digitalWrite(UNSETPin,LOW);

Blynk.begin(auth, ssid, pass);

}

Procedura BLYNK_WRITE va primi comenzile transmise prin serviciul Blynk și va comanda releul prezent pe shield. Secțiunea loop nu conține altceva decât apelul la procedura de primire a comenzilor.

BLYNK_WRITE(V0) {

int pinValue = param.asInt();

if (pinValue) {

digitalWrite(SETPin,HIGH);

delay(10);

digitalWrite(SETPin,LOW);

}

else {

digitalWrite(UNSETPin,HIGH);

delay(10);

digitalWrite(UNSETPin,LOW);

}

}

void loop() {

Blynk.run();

}

Comanda se va realiza de pe un telefon mobil ce rulează Android și pe care trebuie instalată aplicația Blynk.

2

În cadrul aplicației vom crea un proiect nou ce va conține un buton de tip switch asociat cu pinul virtula V0.

3

4

Astfel vom putea comanda de la distanță prin intermediul Internet-ului releul de pe shield. Bineînțeles, proiectul de comandă se poate îmbunătăți, se pot adăuga diverși alți declanșatori automați de tip timer sau chiar senzori.

Pentru finalizarea sistemului nu mai rămâne decât conectarea ansamblului de comandă (placă de dezvoltare + shield) la sirena luminoasă. Dispozitivul de sirenă luminoasă poate fi cumpărat la un preț modic din magazinele de jucării. Acesta se poate porni / opri cu ajutorul unui întrerupător ce controlează alimentarea componentele electronice interne.

5

Prin desfacerea carcaseri se deconectează acest întrerupător și se conectează la shield-ul sistemului.

6

Firele deconectate se vor conecta după cum urmează: firul care vine de la compartimentul cu baterii de va conecta în pinul conectorului cu șurub al shield-ului COM, pinul care pleacă spre componentele electronice ale sirenei luminoase se va conecta la pinul NO.

7

După efectuarea conexiunilor nu mai rămâne decât să vă bucurați de sistemul de comandă nou creat. Blynk the Siren!