Ett projekt för er som gillar IoT, Arduino och gillar att löda/programmera. Byggbeskrivningen är indelad i fyra sektioner:
- Själva termometern som sitter i badtunnan
- Display som visar aktuell temperatur
- Installation av en Raspberry Pi med tilläggen Telegraf och Influx
- Grafana – grafverktyget
Jag har 25 minuters bilresa till min sommarstuga där badtunnan finns och jag behöver kunna se aktuell temperatur i den; framför allt vintertid eftersom den inte får frysa. Badtunnans uppvärmning är både med el och ved. Samtidigt är det smidigt att kunna se temperaturen stiga medan man eldar. På så sätt är det ingen risk att man kliver ned i tunnan när den fortfarande är kall!
Jag har använt följande delar till själva temperaturenheten:
- Adafruit Feather HUZZAH ESP8266 WiFi, artikelnr ADA-2821
- Temperature Sensor – WP (DS18B20), artikelnr SEN-11050
Jag brukar köpa delarna hos Lawicel Shop (https://www.lawicel-shop.se), de har ett bra sortiment och snabb service.
Sensorn ska vara nedstucken i vattnet, den är vattentät. Feather Huzzah strömförsörjs med 5 volt, en vanlig mobilladdare tillsammans med en USB-till-mikroUSB kabel räcker gott. Tänk dock på att vanliga mobilladdare inte är gjorda för utomhusbruk.
Sensorn använder Onewire, det är alltså bara tre trådar att koppla till Huzzah. Röd (Vcc) går till 3.3v, svart till GND och vit (DQ) till I/O pin 2. I en del byggbeskrivningar förekommer ett s k pull-up motstånd på 4.7 kOhm, kopplat mellan Vcc och DQ. Jag behövde inget sådant, min sensor fungerade ändå. Om du får ett orimligt värde (-127 grader) så behövs antagligen motståndet.
I koden nedan så har jag namngett sensorn “badtunna”. För att få allt att fungera så är det några saker som behövs. Dels tillgång till ett trådlöst wifi som Feather Huzzah kan ansluta till och dels ett gratiskonto hos Flespi (https://flespi.io). Protokollet som används är MQTT och min sensor skickar aktuell temperatur en gång i minuten till Flespi. När du registrerat ditt konto så behöver du en token som du klistrar in i din kod.
// Code by G. Axelsson, 2020.
#include <ESP8266WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire oneWire(2); // The I/O pin I use.
DallasTemperature sensors(&oneWire);
WiFiClientSecure client;
Adafruit_MQTT_Client mqtt(&client, "mqtt.flespi.io", 8883, "FlespiToken HfgdxCT4mG **** Your FLESPI-Token goes here **** oZcr8YT8", "");
static const char *fingerprint PROGMEM = "6B 4B 7D 8B 78 EC D7 B7 DF 25 3E 96 9D 5F 1F 9D 3C B1 51 57";
Adafruit_MQTT_Publish badtunna = Adafruit_MQTT_Publish(&mqtt, "/feeds/badtunna");
void setup() {
sensors.begin();
WiFi.begin("SSID", "wifipasswordgoeshere"); // This needs to be adjusted.
delay(2000);
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setFingerprint(fingerprint);
}
void loop() {
MQTT_connect();
sensors.requestTemperatures();
badtunna.publish(sensors.getTempCByIndex(0));
delay(60000);
}
void MQTT_connect() {
int8_t ret;
if (mqtt.connected()) return;
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) {
mqtt.disconnect();
delay(5000);
retries--;
if (retries == 0) while (1);
}
}
Observera att jag har försökt göra koden så minimalistisk som möjlig; väldigt få kommentarer, ingen felhantering. En hel av koden har jag knyckt från de exempel som Arduino själva tillhandahåller. För att felsöka kod så rekommenderar jag att du använder “Serial.println” så att du vet att det är rätt data du publicerar (skickar iväg till Flespi), se kod längre ned på sidan. Om du vill kontrollera att data har mottagits av Flespi.io så kan du via din Raspberry Pi köra kommandot “mosquitto”, se nedan.
goran@ubuntu:~$ mosquitto_sub -h mqtt.flespi.io -p 1883 -u "rXCdqA2UH == Använd din egen token == v2aLNwDbQx" -d -t "/feeds/#"
Client mosqsub|8788-ubuntu sending CONNECT
Client mosqsub|8788-ubuntu received CONNACK
Client mosqsub|8788-ubuntu sending SUBSCRIBE (Mid: 1, Topic: /feeds/#, QoS: 0)
Client mosqsub|8788-ubuntu received SUBACK
Subscribed (mid: 1): 0
Client mosqsub|8788-ubuntu received PUBLISH (d0, q0, r0, m0, '/feeds/badtunna', ... (5 bytes))
15.50
Instruktion för att installera en MQTT broker på Raspberry Pi finns tillgänglig hos instructables.com.
Vänta tills någon text kommer fram, kan dröja upp till 60 sekunder. När sedan svaret kommer så framgår det (i mitt fall) att badtunnans temperatur är 15.5 grader.
Steg 1 är nu klart! Din termometer skickar temperaturen i badtunnan en gång i minuten via MQTT till en server på internet. Nu går vi till steg 2 och bygger en display som vi kan visa temperaturen på.
Felsökning? Skriv till serial.print! Koden nedan kan användas för felsökning. Starta seriemonitorn för att se så att avläsningen av sensorn fungerar.
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into digital pin 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
int deviceCount = 0;
float tempC;
void setup(void)
{
sensors.begin(); // Start up the library
Serial.begin(9600);
// Number of DS18B20 temp devices
deviceCount = 1;
}
void loop(void)
{
// Send command to all the sensors for temperature conversion
sensors.requestTemperatures();
Serial.print("Temp badtunna: ");
Serial.println(sensors.getTempCByIndex(0));
delay(1000);
}