Badtunnetermometer del 1 – termometern

Fram- och baksida på själva termometern. Den vita ledningen är kopplad till I/O pin 2. Alltihopa monteras i en liten plastbox som jag gör lufttät med hjälp av silikon.

Ett projekt för er som gillar IoT, Arduino och gillar att löda/programmera. Byggbeskrivningen är indelad i fyra sektioner:

  1. Själva termometern som sitter i badtunnan
  2. Display som visar aktuell temperatur
  3. Installation av en Raspberry Pi med tilläggen Telegraf och Influx
  4. 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
  • Temperature Sensor – WP (DS18B20)

Jag brukar köpa delarna hos Electrokit (https://www.electrokit.com/), 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.

tempsensor.ino

// Code by G. Axelsson, 2020. Updated 2025
 
#include "ESP8266WiFi.h"
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "credentials.h"

OneWire oneWire(SENSOR_PIN);
DallasTemperature sensors(&oneWire);
WiFiClientSecure client;
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, MQTT_PORT, FLESPI_TOKEN, "");

static const char *fingerprint PROGMEM = FLESPI_CERT_FINGERPRINT;

Adafruit_MQTT_Publish data  = Adafruit_MQTT_Publish(&mqtt, MQTT_FEEDNAME);

void setup() {
  sensors.begin();
  //Serial.begin(9600);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  delay(2000);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  client.setFingerprint(fingerprint);
  //Serial.println("Connected");
  //Serial.print("IP: ");
  //Serial.println(WiFi.localIP());
}

void loop() {
  MQTT_connect();
  sensors.requestTemperatures();
  data.publish(sensors.getTempCByIndex(0));
  //Serial.print("Temp badtunna: ");
  //Serial.println(sensors.getTempCByIndex(0));
  delay(30000);
}

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);
  }
}

Credentials.h

#define WLAN_SSID		"Name_of_wifi"
#define WLAN_PASS               "password"
#define SENSOR_PIN              2
#define MQTT_SERVER	        "mqtt.flespi.io"
#define MQTT_PORT               8883
#define FLESPI_CERT_FINGERPRINT "07 BE D1 90 95 5F 91 7A AC D6 7C 18 35 68 59 19 0F 19 E7 ED"
#define MQTT_USERNAME           "zZkV5dETFeiaWGbWrmQ  Insert your own token  bgwJCaxHPA59vffMqNnA"
#define FLESPI_TOKEN            "FlespiToken zZkV5dETFeiaWGbWrmQ  Insert your own token  bgwJCaxHPA59vffMqNnA"
#define MQTT_FEEDNAME           "/feeds/badtunna"

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! Aktivera de utkommenterade raderna i koden och starta seriemonitorn för att se så att avläsningen av sensorn fungerar.

Seriemonitorn visar att avläsningen fungerar.

En kommentar gällande “FLESPI_CERT_FINGERPRINT”. Nuvarande certifikat hos www.flespi.io är giltigt t o m 31 mars 2026. Någon gång dagarna innan så kommer certet att bytas ut och därmed behöver en ny SHA1-hash genereras. Din termometer behöver lita på certet. För att skapa en ny SHA1-hash så gjorde jag så att jag laddade ner certet på en linuxmaskin jag har och körde kommandot:

openssl x509 -in flespi -outform DEF | sha1sum
07bed190955f917aacd67c18356859190f19e7ed  -

Jag formatterade raden till uppercase och lade in mellanslag. Det bästa vore kanske att lägga in rotcertet och det mellanliggande certet så kommer enheten att lita på alla kommande certifikat. Utrymme för förbättringar.

Leave a Reply

Your email address will not be published. Required fields are marked *