Badtemperatur till Internet
Version 3.0Syfte:
Förse badsugna i Kåseberga med aktuell temperatur i vattnet via Internet.
Teknisk lösning:
Med hjälp av solcellsdriven termometer skicka temperaturen via radiolänk till mitt hus 200 meter bort och sen vidare ut på webbplatsen hoppaiplurret.se
Nyhet 2024! Version 4 Numera köra jag LoRa vilket funkar utmärkt. Kontakta mig om ni vill få tillgång till GitHub-projektet.
Version 2 körde jag med en esp8266 via wifi, men då denna
enhet drar relativt mycket ström och hade lite för dålig
räckvidd har jag i år en ny teknisk lösning med en Arduino
och HC-12 radiolänk. Jag är inte helt till freds med hur mycket kräm även denna lösning drar, men under sommarhalvåret är det i alla fall inga problem att hålla prylarna vid liv med en liten solpanel. Det gamla bygget finns dokumenterat här
Så här är själva sändaren kopplad:
Mottagaren ser ut så här:
Här är en komplett lista över komponenter till bygget:
1st Arduino Mini Pro 3.3v 8 MHz https://www.aliexpress.com/item/Thinary-Pro-Mini-168-Mini-3-3V-8M-ATMEGA168-ATMEGA168P-AU-3-3V-8MHz-for-Arduino/32865761346.html
2 st HC-12 radiosändare
https://www.banggood.com/Geekcreit-HC-12-433MHz-SI4438-Wireless-Serial-Module-Wireless-Transceiver-Transmission-Serial-Communication-Data-Board-Remote-1000M-p-973522.html
1 st DS18B20 temperatursensor med lång sladd
https://www.aliexpress.com/item/Waterproof-DS18B20-stainless-steel-encapsulated-temperature-sensor-4M-Cable/32661438772.html
1 st solpanel
https://www.aliexpress.com/item/Solar-Panel-5V-6V-12V-Mini-Solar-System-DIY-For-Battery-Cell-Phone-Chargers-Portable-Solar/32823762479.html
1 st uppladdningsbart batteri
https://www.banggood.com/1Pcs-Elfeland-18650-3000mAh-3_7V-Rechargeable-Li-ion-Battery-p-1482554.html
1 st batteriladdare för Lipo
https://www.aliexpress.com/item/32986135934.html
1 st vattentät låda
https://www.aliexpress.com/item/SONOFF-IP66-Junction-Box-Waterproof-Cover-Case-Water-Resistant-for-SONOFF-Basic-RF-TH16-TH10-POW/32856717327.html
1 st prototyp pcb
https://www.aliexpress.com/item/2pcs-lot-DIY-2-5x6-4-2-5-6-4CM-Prototype-Paper-PCB-Universal-Experiment-Matrix/32998839659.html
1 st basic kit Breadboard, kablar och motstånd
https://www.aliexpress.com/item/Electronic-Fun-Kit-Bundle-with-Breadboard-Cable-Resistor-Capacitor-LED-Potentiometer-Free-Shipping/32818715185.html
1 st FTDI USB to TTL 3.3V 5.5V Serial Adapter
https://www.aliexpress.com/item/FT232RL-FT232-USB-TO-TTL-5V-3-3V-Download-Cable-To-Serial-Adapter-Module-For-USB/32634246159.html
1 st Wemos D1 Mini
https://www.aliexpress.com/item/32631693796.html
1 st Extern antennkabel
https://www.aliexpress.com/item/Mini-PCI-U-FL-to-SMA-Female-Connector-Antenna-WiFi-1-13-Pigtail-Cable-IPX-to/32807394006.html
1 st Extern antenn
https://www.aliexpress.com/item/1pcs-5dbi-433Mhz-GSM-Antenna-SMA-Male-Connector-Straight-with-Magnetic-base-for-Ham-Radio-Signal/32830177545.html
Jag har velat bygga strömsnålt och låter den lilla Arduino
Pron gå ner i vila i två timmar mellan varje uppdatering, då
den alltså vaknar till liv och sänder över tempen med hjälp
av HC-12an. HC-12an drar dock en del ström konstant och se till att köra "de snålaste" inställningarna som du ställer via AT-kommandon om du inte behöver skicka över stora avstånd. Jag har gjort Arduinon mer strömsnål genom att
plocka bort en onödig LED på kortet. Spänningsregulatorn har
jag kvar. Kolla här hur man tar bort LEDen
https://www.youtube.com/watch?v=7qujkC72dYs
Mottagaren i huset som tar emot temperaturen består av en
Wemos D1 mini (esp8266), ytterligare en HC-12 long range
radiomottagare, en extern antenn (beroende på avstånd till
havet) , en miniusb-kabel och lite kablar och övrigt jox.
Köp HC-12 enheterna parvis och se till att inte köpa kopor
då dessa visat sig vara defekta. Länken via banggood
levererar i skrivande stund rätt grejer. Programmera
HC-12orna så de får bättre räckvidd. Detta görs genom att ge
AT-kommandon via ett seriellt interface. Man kommer in i
programmeringsläget genom att koppla en FTDI USB-adapter
till HC12an och sätter SET->GROUND förutom de vanliga TX,
RX, 5V och ground. Du kan programmera via serial monitorn i
arduinoprogramvaran eller via ett separat win32 program som
finns en googling
bort. Jag kör följande inställningar: AT+FU4 AT+C100 (FU4 är
long range med 1200 baud och c100 är kanal 100). Värt att
notera är dock att denna inställning drar en hel del ström.
Smartare att köra FU2 om det funkar med den räckvidd du har
mellan sändare och mottagare.
Ladda ner manualen
till HC-12 för att lära er mer om dessa enheter.
Då jag vill få plats med hela sändaren i den vattentäta
lådan kör jag den lilla medföljande antennen med sändaren.
Löd den på plats i det avsedda hålet.
(Jag har haft en del strul med räckvidd och ett alternativ
till medföljande antenn är att löda fast en 17.2 cm lång
kabel, med plasten kvar, istället för att använda den som
följer med)
På mottagarsidan har jag dock en större antenn för att få
bättre räckvidd. Tänk på att du får bäst resultat om
antennerna är riktade åt samma håll. I mitt fall betydde det
att den externa antennen i huset är placerad vågrätt då det
var enklast att få in den lilla antennen i lådan så att den
pekar vågrätt. Jag har ca: 200 meter från sändare och
mottagare och det funkar fint nu när allt är intrimmat.
Denna arduinokod körs på Arduino Pro 3.3v som är
transceivern:
//HC-12 Transceiver. Temp en gång varannan timme
// Rapporterar även batteristatus
#include <LowPower.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); // RX, TX
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int dsPower = 10;
int dsGround = 9;
int temptx;
int radioPower = 5;
int radioGround = 6;
int analogPin = A0;
int val = 0; // variable to store the value read
void setup() {
//Serial.begin(9600); //För felsökning till serial
monitorn
mySerial.begin(1200);
pinMode(dsPower, OUTPUT);
pinMode(dsGround, OUTPUT);
pinMode(radioPower, OUTPUT);
pinMode(radioGround, OUTPUT);
digitalWrite(dsGround, LOW);
digitalWrite(radioGround, LOW);
digitalWrite(dsPower, HIGH);
analogReference(INTERNAL);
}
void sleepTwoHours()
{
for (int i = 0; i < 900; i++) {
LowPower.powerDown(SLEEP_8S,
ADC_OFF, BOD_OFF);
}}
void loop(){
digitalWrite(radioPower, LOW);
sleepTwoHours();
digitalWrite(radioPower, HIGH);
sensors.begin();
delay(1000);
sensors.requestTemperatures(); // Send the command
to get temperatures
float tempF =
DallasTemperature::toFahrenheit(sensors.getTempCByIndex(0));
float tempC = sensors.getTempCByIndex(0);
val = analogRead(analogPin); // read the
input pin
float volts = (analogRead(A0) * 4.16)/902; //4.16 =
Volt för fullladdat batteri. Ändra för ditt batteri
delay(100);
temptx = tempF+0.5;
// Serial.println(tempF);
// Serial.println(temptx);
if (mySerial.available());
{
mySerial.println(tempC);
mySerial.println(volts);
// Serial.println(volts); //För
felsökning till serial monitorn
// Serial.println(tempC); //För
felsökning till serial monitorn
//mySerial.write("\n");
//Serial.println(sensors.getTempCByIndex(0));
}
delay(50);
}
Denna kod körs på Wemos D1 minin som tar emot temperaturen.
Du behöver lägga till stöd för ESP8266 i Arduino IDE först
och därefter installera version 2.5. Här finns en guide för
hur man gör.
https://randomnerdtutorials.com/how-to-install-esp8266-board-arduino-ide/
(Jag fick nedgradera till version 2.5 av
https://github.com/esp8266/Arduino i Boardmanagern för
att få min kod att funka. Oklart varför. )
Mata in ditt wifi-nätverk och lösenord, samt url och katalog
till din server dit du vill skicka datat:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5,4 ); //RX, TX
const char* ssid = "wifinätverk";
const char* password = "xxx";
void setup () {
Serial.begin(115200);
mySerial.begin(1200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print("Connecting..");
}
}
void loop() {
static String previousTemp = "0";
if(mySerial.available() > 0){//Read from HC-12 and send to serial monitor
String currentTemp = mySerial.readString();
// only send update if temp has changed
if (currentTemp != previousTemp){
postTemp(currentTemp);
previousTemp = currentTemp;
}
}
delay(2000);
}
void postTemp(String temp) {
String tempfix = temp;
tempfix.replace("\r\n","&volt=");
String taborttecken = tempfix;
taborttecken.remove(16); //Strippar en radbrytning och extra tecken som strular till det
if (WiFi.status() == WL_CONNECTED) { //Check WiFi connection status
Serial.println("http://www.DINWEBBPLATS.se/hemligkatalog/index.php?temp=" + taborttecken); //Kolla hur strängen ser ut i serial monitorn
HTTPClient http; //Declare an object of class HTTPClient
http.begin("http://www.DINWEBBPLATS.se/hemligkatalog/index.php?temp=" + taborttecken);
int httpCode = http.GET(); //Send the request
if (httpCode > 0) { //Check the returning code
String payload = http.getString(); //Get the request response payload
Serial.println(payload); //Print the response payload
}
http.end(); //Close connection
}
delay(20); //Send a request every 30 seconds
}
På webbservern dit du ska skicka din data har jag en php-fil som heter index.php i min hemliga katalog som ser ut så här. Du behöver förmodligen slå på
register_globals = on
i php.ini för att tillåta att skicka GET med data till
servern. Jag sparar temperaturdata, volt på batteriet samt
datum i en mysql-databas som jag därefter kan bearbeta
vidare och presentera på webbplatsen. Hur man gör det är
webbserverpill så det orkar jag inte förklara här.<?php
if ($_SERVER["REQUEST_METHOD"] == "GET") {//Check it is
comming from a form
//mysql credentials
$mysql_host = "localhost";
$mysql_username = "xxx";
$mysql_password = "xxx";
$mysql_database = "xxx";
$temperatur = $_GET['temp'];
$volt = $_GET['volt'];
$date = date("Y-m-d H:i:s");
$mysqli = new mysqli($mysql_host,
$mysql_username, $mysql_password, $mysql_database);
//Output any connection error
if ($mysqli->connect_error) {
die('Error : ('.
$mysqli->connect_errno .') '.
$mysqli->connect_error);
}
$statement =
$mysqli->prepare("INSERT INTO users_data (date, volt,
temperatur) VALUES(?,?,?)"); //prepare sql insert query
//bind parameters for markers, where (s
= string, i = integer, d = double, b = blob)
$statement->bind_param('sss', $date,
$volt, $temperatur);
if($statement->execute()){
print "Temperatur: " . $temperatur . "
grader";
}else{
print
$mysqli->error; //show mysql error if any
}
}
?>
Några saker att tänka på
När ni labbar och bygger ihop konstruktionen så är det smart att kommentera bort koden som gör at sändaren går ner i vila i två timmar mellan uppdateringarna.
Typ så här:
// void loop(){
// digitalWrite(radioPower, LOW);
// sleepTwoHours();
Om det strular med datamottagningen, kontrollera så ni kopplat RX->TX portarna rätt. RX på arduinon skall alltå vara TX på HC-12an överallt.
Bonusbygge
Jag gjorde även en fristående variant för er som har vattnet så nära att ni kan koppla upp er direkt på wifi med en Wemos D1 Pro mini. Om så är fallet slipper man ju länken med HC-12
Här är koden:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define DS18B20
4
//DS18B20 is connected to GPIO Pin 2
const char* ssid = "xxx";
const char* pass = "xxx";
const char* server = "www.hoppaiplurret.se";
const int analogInPin = A0;
int outputValue = 0;
float temp;
OneWire ourWire(DS18B20);
DallasTemperature sensor(&ourWire);
WiFiClient client;
void setup()
{
Serial.begin(115200);
delay(1000);
sensor.begin();
WiFi.begin(ssid, pass);
while (WiFi.status() !=
WL_CONNECTED)
{
delay(200);
}
}
void loop()
{
sensor.requestTemperatures();
//float volts =
(analogRead(analogInPin));
float volts =
(analogRead(analogInPin) * 3.2)/1023;
float tempen =
sensor.getTempCByIndex(0);
String temp(tempen);
String extratecken =
String("&volt=");
String data = tempen +
extratecken + volts;
HTTPClient http; //Declare an object of class
HTTPClient
http.begin("http://www.hoppaiplurret.se/katalog/fil.php?temp="
+ data);
int httpCode =
http.GET();
if (httpCode > 0) {
String payload = http.getString();
//Serial.println(payload);
}
http.end();
delay(30);
ESP.deepSleep(7.2e9); //30 sek = 30e6
}Bygg en webbsida
Jag utgick från koden som används på vecka.nu Finns att hämta här: https://github.com/veckanu/webFör grafer och historik kör jag Googles chart api mot min MySql-databas. https:/https://developers.google.com/chart/