How cold is the Blue?

În cadrul proiectului de față vom prezenta implementarea unui sistem de tip IoT (Internet of Things) ce utilizează serviciul cloud IBM BlueMixTM. Platforma Cloud IBM BlueMixTM pune la dispoziția utilizatorilor un serviciu IoT specializat și anume IBM Watson IoT Platform. Serviciul IBM BlueMixTM este un serviciu comercial dar care oferă posibilitatea de evaluare pentru o perioadă de 30 de zile sau, pentru studenții și profesorii din unele instituții de învățământ superior, accesul este gratuit.Sistemul prezentat în acest material va utiliza o componentă demonstrativă a serviciului IBM Watson IoT și nu necesită înregistrare (înregistrarea unui cont de evaluare).

Scopul sistemului este de a măsura temperatura și umiditatea ambientală și a trimite datele măsurate către serviciul IBM Watson IoT prin intermediul protocolului MQTT. Accesând platforma Quickstart IBM Watson IoT datele măsurate vor putea fi urmărite în timp real de oriunde din Internet.

Pentru implementare a fost aleasă o placă de dezvoltare Adafruit M0 WiFi ce combină puterea unui microcontroler ATSAMD21G18 ARM Cortex M0+ pe 32 de biți cu interconectivitatea dată de modulul WiFi ATWINC1500.

2

https://www.robofun.ro/feather-m0-wifi-atsamd21-atwinc1500

Pentru mai multe informații legate de utilizarea plăcii Adafruit M0 WiFi se poate consulta:

Adafruit Feather M0 WiFi with ATWINC1500 | Adafruit Learning System

https://learn.adafruit.com/adafruit-feather-m0-wifi-atwinc1500

Pentru măsurarea temperaturii și umidității ambientale vom utiliza un senzor digital SHT11 ce oferă o precizie ridicată și este foarte ușor de utilizat în combinație cu orice placă din familia Arduino.

3

https://www.robofun.ro/senzori/vreme/senzor-temperatura-umiditate-sht11

Schema de interconectare dintre cele două componente este următoarea (VCC senzor – 3V placă de dezvoltare, GND – GND, DAT senzor – pin 11 placă de dezvoltare, SCK – pin 10 placă de dezvoltare):

4

Programul va utiliza următoarele biblioteci software externe mediului Arduino IDE:

Adafruit WINC1500 – pentru comunicația cu modulul WiFi

https://github.com/adafruit/Adafruit_WINC1500

Arduino MQTT – pentru implementarea protocolului MQTT

https://github.com/256dpi/arduino-mqtt

SHT1x Temperature / Humidity Sensor Library for Arduino

https://github.com/practicalarduino/SHT1x

#include <SPI.h>

#include <Adafruit_WINC1500.h>

#include <MQTTClient.h>

#define WINC_CS   8

#define WINC_IRQ  7

#define WINC_RST  4

#define WINC_EN   2

Adafruit_WINC1500 WiFi(WINC_CS, WINC_IRQ, WINC_RST);

Adafruit_WINC1500Client net;

MQTTClient client;

#include <SHT1x.h>

#define dataPin  10

#define clockPin 11

SHT1x sht1x(dataPin, clockPin);

În cadrul programului trebuie completate variabilele ssid și pass pentru ca sistemul să se poată conecta la o rețea WiFi pentru acces Internet.

char ssid[] = “………………“;    

char pass[] = “………………“; 

În cadrul secțiunii setup() se vor inițializa obiectele de comunicație: serială, modul WiFi, protocol MQTT (inclusiv conectarea la platforma Quickstart IBM Watson IoT – adresă quickstart.messaging.internetofthings.ibmcloud.com port 1883). Identificarea dispozitivului IoT în cadrul platfomei se va face pe baza unui identificator unic format din 12 caractere (se recomandă folosirea adresei MAC a plăcii) – trebuie personalizat în program în apelul funcției: client.connect(“…:XXXXXXXXXXXX”).

5

void setup() {

  #ifdef WINC_EN

    pinMode(WINC_EN,OUTPUT);

    digitalWrite(WINC_EN,HIGH);

  #endif

  Serial.begin(9600);

  while (!Serial) { ; }

  if (WiFi.status() == WL_NO_SHIELD) {

    Serial.println(“WiFi shield not present”);

    while (true);  }

  WiFi.begin(ssid, pass);

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

    delay(500);

    Serial.print(“.”);  }

   Serial.println();

  Serial.println(“WiFi connected.”);

  IPAddress ip = WiFi.localIP();

  Serial.print(“IP address: “);

  Serial.println(ip);

  byte mac[6];

  WiFi.macAddress(mac);

  Serial.print(“MAC address: “);

  for (int i=0; i<6; i++) {

     if (mac[i]<16) Serial.print(“0”);  

     Serial.print(mac[i], HEX);

     if (i!=5) Serial.print(“:”);  }

  Serial.println();

  client.begin(“quickstart.messaging.internetofthings.ibmcloud.com”, 1883, net);

  Serial.print(“Connecting to BlueMix”);

  while (!client.connect(“d:quickstart:sht11:XXXXXXXXXXXX“)) {

    Serial.print(“.”);

    delay(1000);  }

  Serial.println();

  Serial.println(“Connected to BlueMix.”);

}

În cadrul secțiunii loop() se vor citi valorile pentru temperatura și umiditatea furnizate de senzorul SHT11 și se vor trimite (publica) către serviciul Quickstart IBM Watson IoT. Publicarea se va face o dată la 10 secunde. Procedura messageReceived() este necesară pentru a respecta caracterul bidirecțional de comunicație a protocolului MQTT.

unsigned long lastMillis = 0;

void loop() {

  client.loop();

  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(“%”);

  if(millis() – lastMillis > 10000) {

    if(!client.connected()) {

            Serial.print(“Connecting to BlueMix”);

            while (!client.connect(“d:quickstart:sht11:XXXXXXXXXXXX“)) {

              Serial.print(“.”);

              delay(1000);  }

            Serial.println();

            Serial.println(“Connected to BlueMix.”);   }

    lastMillis = millis();

    client.publish(“iot-2/evt/status/fmt/json”,  “{\”d\”:{\”myName\”: \”SHT11 sensor\”,\”Temperature\”: \”” + String(temp_c, 2) + “\”,\”Humidity\”: \”” + String(humidity, 2) + “\”}}”);  }

  delay(10000);

}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {

  Serial.print(“incoming: “);

  Serial.print(topic);

  Serial.print(” – “);

  Serial.print(payload);

  Serial.println();

}

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.6.12, Adafruit SAMD Boards 1.0.13, Adafruit_WINC1500 0.6.0, MQTT 1.10.1 și SHT1x Sep 20, 2011.

După punerea în funcțiune a sistemului ne vom conecta la serviciul Quickstart IBM Watson IoT utilizând adresa:

https://quickstart.internetofthings.ibmcloud.com/#/device/ XXX..XXXX /sensor/

unde XXXXXXXXXXXX este identificatorul unic definit în program.

6

Platforma ne permite să vizualizăm în timp real datele transmise de dispozitivul nostru. Atenție!!! Serviciul nu stochează datele trimise – este un serviciu demonstrativ ce ne permite doar urmărirea valorilor.

Pentru implemetarea utilizării serviciului Quickstart IBM Watson IoT se pot parcurge și următoarele proiecte:

Internet of Things: Publishing to IBM Bluemix Node-RED with an Arduino Yun

http://www.zombieprototypes.com/?p=92

Arduino IoT Send Sensor Data to IBM Bluemix

http://wiznetmuseum.com/portfolio-items/arduino-iot-send-sensor-data-to-ibm-bluemix-2/

Build a cloud-ready temperature sensor with the Arduino Uno and the IBM Watson IoT Platform

http://www.ibm.com/developerworks/cloud/library/cl-bluemix-arduino-iot1/