Internet of Things #3

Dette er ikke en noob-guide. Hvis du ikke er bekendt med Arduino, vil jeg foreslå du begynder et andet sted. Fx her.

Mål
Projektets mål var, at lægge data ud på en offentlig og lettilgængelig webside. Hvorfor netop disse eller andre data skal på nettet, og hvordan jeg involverer eleverne, må komme senere.

Tjenesten Thingspeak, er designet til at lægge målinger på nettet og opdatere dem live fx i forbindelse med internet of things.

Jeg har brugt:
* Wemos D1, som er en Arduino-klon (mikro-computer) med WIFI-antenne, som giver forbindelse til nettet, og som koster ca. 20 kr. Wemos D1 er måske ikke den bedste platform (NodeMCU er måske bedre), men et godt sted for mig at begynde, da den er forholdvis enkel.
* 3 ledninger
* DHT11 sensor, som kan måle temperatur og luftfugtighed.
* Et breadboard (fumlebræt, ikke strengt nødvendigt)
Alle dele købt hos AliExpress.com

Samles i kredsløb:
dht11
Wemos D1 – DHT11
5V – VCC
GND – GND
digital pin 1 – pin 2 fra venstre, når sensoren holdes med forsiden mod dig.

Kodning og opsætning:
Wemos D1 skal programmeres via en computer fra Arduino IDE, som kan downloades.
Programmet skal have et plugin for at genkende Wemos D1. Her kan du bl.a. se hvordan man henter og installerer det. Jeg mener at der samtidig installeres et ESP8266WiFi.h bibliotek. Hvis ikke, skal det også hentes og installeres.

Boarded, som du vælger i Arduino IDE, skal være “Wemos D1 R2 & mini”. Upload speed: 115200.
Koden ses nedenfor. Husk at skrive navnet på dit netværk (case-sensitive) og kodeordet til netværket.

For at DHT11 sensoren skal virke, skal du formentligt hente og installere et “DHT.h” bibliotek til Arduino IDE. Se evt. her hvordan.

thingspeak oprettes en profil (gratis) og derefter en kanal. Kanalen har en kode (Writing API), som også skal ind i koden nedenfor.

Kopier koden nedenfor ind i Arduino IDE og upload den til Wemos D1. Afbryd evt. forbindelsen til computeren derefter. Tilslut en anden strømkilde fx en 9V adapter, computeren er ikke længere nødvendig for Wemos D1.
wp_20161006_001

I thingspeak.com oprettes to felter, da thingspeak jvf. koden nedenfor, modtager to data (temperatur og luftfugtighed). Hvordan thingspeak lige oversætter den streng den får tilsendt til disse to felter, ved jeg ikke. Det er en af konsekvenserne ved at bruge en “smart” tjeneste. En anden er, at det er sk… nemt.

Derefter kan leges med hvordan data skal afbildes. Afbildningerne kan integreres i hjemmesider fx et sharepoint website, som en iframe.
data
(statisk billede her, da jeg skal bruge min Wemos til et andet projekt)

Hvad nu?
Senere prøve andre sensorer. CO2- eller støjmåler i klassen. En klimastation til vores vandrende pinde. Finde ud af hvordan eleverne kommer med. Måske bliver jeg teknisk set begrænset af at Wemos D1 kun har en analog port (A0).

Thingspeak er en MEGET enkel måde at komme i gang med IoT. Tjenesten virker ikke til at være så god til, at fjernstyre ting fx motorer i kredsløbet, men mægtig fint til at afbilde data live.

 

#include <DHT.h>
#include <ESP8266WiFi.h>
 
// replace with your channel’s thingspeak API key and your SSID and password
String apiKey = "KODE FRA THINGSPEAK HJEMMESIDEN";
const char* ssid = "NAVNET PÅ DIT NETVÆRK";
const char* password = "KODEN TIL DIT NETVÆRK";
const char* server = "api.thingspeak.com";
 
#define DHTPIN 1
#define DHTTYPE DHT11 
 
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client;
 
void setup() 
{
Serial.begin(9600);
Serial.println("begyndelse");
delay(10);
dht.begin();
Serial.println("dth begin");
 delay(2000);
WiFi.begin(ssid, password);
Serial.println("WIFI begin");
delay(1000); 
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
 
WiFi.begin(ssid, password);
 
while (WiFi.status() != WL_CONNECTED) 
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
 
}
 
void loop() 
{
// float h = 50;
// float t = 20; 
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) 
{
Serial.println("Failed to read from DHT sensor!");
//return;
}

 Serial.print(h);
 Serial.println(t);
  
if (client.connect(server,80)) {
String postStr = apiKey;
postStr +="&field1=";
postStr += String(t);
postStr +="&field2=";
postStr += String(h);
postStr += "\r\n\r\n";
 
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
 
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celsius Humidity: ");
Serial.print(h);
Serial.println("Sending data to Thingspeak");
}
client.stop();
 
Serial.println("Waiting 20 secs");
// thingspeak needs at least a 15 sec delay between updates
// 20 seconds to be safe
delay(20000);
}
Dette indlæg blev udgivet i Arduino. Bogmærk permalinket.