Questo è il disegno di soluzione che vogliamo prototipare:
Per prima cosa occorre effettuare l'accesso alla piattaforma CLOUD di IBM collegandosi all'indirizzo:
http://console.ng.bluemix.net/
Dopo è sufficente andare nel catalogo e fare una ricerca per "Internet Of Things Platform"
Selezionare il servizio evidenziato e procedere alla configurazione.
Per configurare il servizio, basta andare nella propria dashboard e lanciare la console di gestione:
Dalla console di gestione bisogna effettuare le seguenti operazioni:
1) Censire la board type ( solo nel caso non fosse stato fatto prima )
2) Aggiungere un device e memorizzare le credenziali che vengono rilasciate:
e' possibile tralasciare i metadata device usati per configurazioni più complesse:
Viene chiesto di inserire un token di sicurezza per la connessione, nel caso il sistema ne genererà uno automaticamente
Vengono quindi presentare le azioni che verranno intraprese:
E quindi verranno rilasciate le credenziali da configurare nel codice ESP
Attenzione:
Salvare le informazioni rilasciate poichè non saranno più visualizzabili.
Prima di passare al codice ESP, verificare dal pannello sicurezza
Di non aver impostato una connessione basata su TLS che al momento non abbiamo configurato:
Nel caso riportare il "security level" a TLS optional.
Di seguito viene riportato il codice da caricare nell'ESP.
Il seguente codice effettua le seguenti operazioni:
- Inizializza il modulo e le periferiche ( LCD 1602 e DHT 1)
- Si connette alla WiFi specificata
- Si connette alla piattaforma Cloud di IBM
- Legge la temperatura e umidità ogni 5 secondi e la invia ai sistemi remoti oltre a visualizzarla sul display
- Libreria Liquid Crystal I2C per ESP8266
- PubSubClient per gestire la piattaforma MqTT IBM
- Arduino JSON
- DHT Library tipo DHTesp
Codice per ESP:
Scarica da qui il codice
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h> // https://github.com/knolleary/pubsubclient/releases/tag/v2.3
#include <ArduinoJson.h> // https://github.com/bblanchon/ArduinoJson/releases/tag/v5.0.7
#include "DHTesp.h"
DHTesp dht;
LiquidCrystal_I2C lcd(0x27, 16, 2);
//CONFIG
const char* ssid = "Mobile";
const char* password = "alfafrancesco";
#define ORG "jmm8s7"
#define DEVICE_TYPE "ESP8266"
#define DEVICE_ID "demo0001"
#define TOKEN "LiiNwGkI5vz(Sb1aLh"
//WATSON IBM
char server[] = ORG ".messaging.internetofthings.ibmcloud.com";
char authMethod[] = "use-token-auth";
char token[] = TOKEN;
char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
const char publishTopic[] = "iot-2/evt/status/fmt/json";
const char responseTopic[] = "iotdm-1/response";
const char manageTopic[] = "iotdevice-1/mgmt/manage";
const char updateTopic[] = "iotdm-1/device/update";
const char rebootTopic[] = "iotdm-1/mgmt/initiate/device/reboot";
void callback(char* topic, byte* payload, unsigned int payloadLength);
//STATI
const int INIT = 0;
const int INIT_MESSAGGIO = 5;
const int START = 10;
const int CHECK_WIFI = 20;
const int CHECK_MQTT = 30;
const int APP_PRINT_TEMP = 40;
int STATE;
//VAR
long t1,t2;
boolean wifi_connected=false;
boolean mqtt_connected=false;
WiFiClient wifiClient;
PubSubClient client(server, 1883, callback, wifiClient);
//------------------
void callback(char* topic, byte* payload, unsigned int payloadLength) {
Serial.print("callback invoked for topic: "); Serial.println(topic);
}
void setup() {
Serial.begin(115200);
//
Serial.println("Init LCD");
lcd.begin(D1,D2);
Serial.println("Init DHT");
dht.setup(D4);
lcd.backlight();
lcd.print("Hello World!");
delay(1000);
STATE=INIT;
}
void loop() {
switch(STATE){
case INIT:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Module is");
lcd.setCursor(0,1);
lcd.print("starting");
t1=millis();
STATE=INIT_MESSAGGIO;
break;
case INIT_MESSAGGIO:
if(millis()-t1 > 2000){
wifi_connected=false;
Serial.println("Set WiFi");
Serial.print("Connecting to "); Serial.print(ssid);
WiFi.begin(ssid, password);
STATE=START;
}
break;
case START:
STATE=CHECK_WIFI;
break;
case CHECK_WIFI:
if(!wifi_connected && WiFi.status() == WL_CONNECTED) {
wifi_connected=true;
Serial.print("nWiFi connected, IP address: "); Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WiFi Connected");
lcd.setCursor(0,1);
lcd.print(WiFi.localIP());
t1=millis();
}
STATE=CHECK_MQTT;
break;
case CHECK_MQTT:
if( wifi_connected && !mqtt_connected && millis() - t1 > 1000){
if (!!!client.connected()) {
Serial.print("Reconnecting MQTT client to "); Serial.println(server);
if(client.connect(clientId, authMethod, token)) {
mqtt_connected=true;
t1=millis();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("MqTT Connected");
}else{
if(millis() - t1 > 5000)t1=millis();
}
}
}
STATE=APP_PRINT_TEMP;
break;
case APP_PRINT_TEMP:
if(wifi_connected && mqtt_connected && millis()-t1 > 5000){
Serial.print("Read DHT sensor");
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEMPERATURE");
lcd.setCursor(0,1);
lcd.print("T="+String(temperature,1)+" H="+String(humidity,1)+"%");
t1=millis();
Serial.println("Send Data to Cloud");
String payload = "{\"temperature\": "+String(temperature,1)+", \"humidity\": "+String(humidity,1)+"}";
if (client.publish(publishTopic, (char*) payload.c_str())) {
Serial.println("Publish OK");
lcd.setCursor(13,0);
lcd.print("OK");
} else {
Serial.println("Publish FAILED");
lcd.setCursor(13,0);
lcd.print("**");
}
}
STATE=START;
break;
default:
STATE=INIT;
break;
}
}
Terminato il codice da inserire nel modulo ESP, si può pensare di sviluppare una piccola APP per vedere i dati che arrivano nei sistemi remoti.
Sempre dalla console di IBM Cloud, dal catalogo, effetturare provisioning di un'applicazione tipo NODERED che ci servirà per gestire i dati raccolti:
Ci verranno chieste delle informazioni per configurare l'applicazione
Essenzialmente è sufficente inserire:
1) Nome dell'applicazione
2) Indirizzo WEB al quale richiameremo l'applicazione
Dopo aver confermato la creazione, dal proprio dashboard di applicazioni sarà possibile accedere all'applicazione
Per prima cosa aggiungere la connessione al servizio di ricezione dati dai device:
Poi cliccando il link "VISIT APP URL" si potrà accedere al tool di programmazione dei flussi NodeRed.
Codice per NODERED:
Accedi al seguente link per scaricare il codice da caricare in nodered
Dopo aver caricato il codice in NodeRed si presenterà la seguente dashboard:
Dopo aver caricato i flussi in nodered, sarà possibile vedere i dati che cominciano ad arrivare dal device:
Good Lucky
No comments:
Post a Comment