Meteostanice s Wemos D1 mini

19.10.2020

 

Dostal jsem za úkol vytvořit modul, který bude monitorovat dvě teploty - vnější, vnitřní, a vlhkost vzduchu. Zařízení bude umístěné v prostoru , kde je sice WiFi signál, ale není tam možnost připojení k elektrické síti.

Rozhodl jsem se tedy, že použiji ESP modul Wemos D1 mini, jako externí čidlo teploty oblíbený DS18B20, a jako vnitřní čidlo senzor Si7021. Napájené to bude z 18650 LiIon článku přes Wemos LiIon Shield, který umí článek i nabíjet. Napětí článku bude kontrolované Analogovým vstupem procesoru, a data budou ukládána na server Thingspeak.

Hotový modul mi vyšel takto :-) Dole modul Wemos D1 mini, uprostřed Wemos LiIon battery shield, a nahoře kousek bastldesky na které je odporový dělič pro monitoring baterie, konektor pro připojení externího DS18B20 na kabelu, Senzor Si7021 na "štaflích" a propojka DeepSleep.

Jednotlivé desky:


Schéma zapojení:

 

DS18B20 je připojený na D3 (GPIO0), je použito tzv. "Fantomové napájení", použity jsou jenom 2 vodiče

Si7021 - SDA na pinu D2, SCL na D1

Odporový dělič R2 a R3 přizpůsobuje napětí článku 4.2V na hodnoty které používá Wemos. Ten pracuje s napětím 3.3V, takže odporama byl poměr upraven tak, aby výstupní napětí odpovídalo této hodnotě. Hodnoty odporů si můžete upravit podle toho, co zrovna máte v ve skladových zásobách :-) naměřená hodnota se potom upraví softwarově.

Baterie ve schématu je jenom orientační, aby bylo vidět, jak to zapojit. Článek 18650 jsem v programu Fritzing nenašel. Já s tím programem vůbec neumím, jsem rád, že jsem sesmolil alespoň takové schéma :-( Článek 18650 - já jsem použil 2 články paralelně, které jsem vykuchal ze starého akupacku notebooku. Oba články dohromaty mají změřenou kapacitu 3650mAh, a jsou zapojené konektorem do shieldu. Ze shieldu jsem ještě vytáhnul jeden (černý) drát z + pólu a zapojil ho konektorem do bastldesky:

Jak vidíte, bastldeska není nic složitého. Senzor Si7021 jsem umístil na prodlužovací "štafle" z jednoduchého důvodu. Abych mohl elektroniku zavřít do krabičky, a aby čidlo zůstalo mimo krabičku.

Nezapomeňte propojit D0 a RST. Já jsem tam dal propojku, aby bylo možné ji rozpojit. Propojení D0 a RST je nutné, aby se modul dokázal probudit z režimu DeepSleep (režim nízké spotřeby).

 

Program je napsaný klasicky v Arduino IDE:

/*
* Wemos D1 mini
* Si7021
* D0 - RST
* D1 - SCL
* D2 - SDA
* D3 - DS18B20 (GPIO0)
* Baterie na A0, odpory 47k a 20k
*
* LOLIN(WEMOS) D1 R2 & mini
* 4MB (FS:2MB OTA:1019KB)
* http://xanadu.khnet.info
*/


#include <OneWire.h>
#include "Adafruit_Si7021.h"
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>

#define ONE_WIRE_BUS 0
// DS18B20 na D3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds18b20(&oneWire);
Adafruit_Si7021 si7021 = Adafruit_Si7021();

const int sleepTimeS = 300;
// Doba uspani v sekundach:

const char* server = "api.thingspeak.com";
//api.thingspeak.com
String apiKey = "write API key";
//doplnit API write key
const char* MY_SSID = "SSID";
// SSID vaseho AP
const char* MY_PWD = "heslo";
//heslo k vasemu AP

int retries = 0;
float tempds, tempsi, hum, batt;
int pocet = 1;
float konst = 0.00450;
// konstanta napeti baterie (viz popis)

void setup() {
Serial.begin(9600);
si7021.begin();
ds18b20.begin();
Serial.print("Start");

// propojit D0 a RST kvuli deep sleep
pinMode(D0, WAKEUP_PULLUP);

connectWifi();
// pripoj se k WiFi
delay(500);

}

void loop() {
ds18b20.requestTemperatures();
tempds = ds18b20.getTempCByIndex(0);
// nacti teplotu DS18B20
tempsi = si7021.readTemperature();
// nacti teplotu Si7021
hum = si7021.readHumidity();
// nacti vlhkost Si7021
Serial.print("Temp. DS: ");
Serial.println(tempds, 2);
Serial.print("Temp. Si: ");
Serial.println(tempsi, 2);
Serial.print("Humidity: ");
Serial.println(hum, 2);
// nacti napeti baterie
int nVoltageRaw = analogRead(A0);
float fVoltage = (float)nVoltageRaw * konst;
batt = fVoltage;
Serial.print("Napeti: ");
Serial.println(batt);
Serial.println();

sendTeperatureTS(tempds, tempsi, hum, batt);
//odesli data na Thingspeak

// Deep Sleep
Serial.println("ESP8266 in sleep mode");
Serial.printf("Sleep for %d seconds\n\n", sleepTimeS);
ESP.deepSleep((sleepTimeS * 1000000), WAKE_RF_DEFAULT);

}

void connectWifi()
{
// zkusi se 10x po vterine pripojit k WiFi, pokud se to nepovede, kasle na to.
Serial.println("");
Serial.print("Connecting to ");
Serial.println(MY_SSID);
WiFi.persistent(false);
WiFi.begin(MY_SSID, MY_PWD);
while ((WiFi.status() != WL_CONNECTED) && (retries < 10)) {
retries++;
delay(1000);
Serial.print(".");
}
if (WiFi.status() == 3) {
Serial.println("");
Serial.print("Connected to AP: ");
Serial.println(MY_SSID);
Serial.print("Signal: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("");
}
else {
Serial.println("");
Serial.println("NOT connected to AP: ");
Serial.println(MY_SSID);
Serial.println("");
}
}
//end connect

void sendTeperatureTS(float tempds, float tempsi, float hum, float batt)
{
WiFiClient client;

if (client.connect(server, 80)) {
Serial.println("Thingspeak connected ");

String postStr = apiKey;
postStr += "&field1=";
postStr += String(tempsi);
postStr += "&field2=";
postStr += String(hum);
postStr += "&field3=";
postStr += String(batt);
postStr += "&field4=";
postStr += String(tempds);
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);
delay(1000);
}
else {
Serial.println("Thingspeak NOT connected");
}
//end if

client.stop();
}
//end send
 

Do programu je třeba doplnit jméno vašeho AP, kam se bude zařízení připojovat (SSID) a heslo. Potom je třeba doplnit Write API key pro ukládání dat na Thingspeak.

Další hodnotu, kterou musíte nastavit je konstanta napětí baterie. Vzhledem k tomu, že nepoužíváme nijak přesné odpory, bude se naměřená hodnota od skutečného napětí baterie lišit. Je proto NUTNÉ  k napájecímu článku připojit voltmetr, a metodou pokus/omyl doladit tuto konstantu, aby nám Wemos dával stejné hodnoty jako máme na voltmetru. Průběh napětí v celém rozsahu napájení je celkem lineární, takže nemusíme kalibraci provádět při několika hodnotách. Stačí nastavit při jednom napětí, a bude nám to sedět.

Program je ke stažení zde: wemosd1_web.ino

Použité knihovny jsou standardní, ty dokáže Arduimo IDE nalézt na webu samo.

 

Změřil jsem proud, který je odebírán PŘÍMO z napájecího článku, když je Wemos D1 v DeepSleep módu, a vychází mi nějakých 0,67mA. Dalo by se dostat asi ještě níž, ale to jsem už neřešil. Uvidím, jak dlouho to na články s kapacitou 3650mAh pojede. To můžete sledovat online na stránce s grafy :-)

Jak potom vypadají výstupy na Thinkspeak z tohoto zařízení se můžete podívat ZDE. Jenom bych chtěl upozornit, že grafy i budíky jsou na této stránce ze dvou těchto zařízení. Jedno je umístěné v kanceláři, a druhé, to, které je zde popsané mimo kancelář.

Celkem to funguje bez problému. Já jsem v tom mém zařízení použil ještě jednu funkci, abych nemusel sledovat, kdy mi dojde baterka. Pokud napětí klesne pod 3V, tak mi zařízení pošle na mobil SMS, že je třeba nabít baterii. Pro toto upozornění ale používám placenou SMS bránu, takže jsem tuto část z publikovaného programu vymazal.

 

Ještě odkazy na jednotlivé komponenty:
Wemos D1 mini - $2.26
Wemos Battery Shield - $1.4
Si7021 - $2.99
DS18B20 - $0.56
Celkem $7.21 (nějakých 166.21Kč při platbě Revolut kartou)

 


Doplněno 18.11.2020

Bohužel, něco se úplně nepovedlo, jak je vidět z grafu napájení. Napájecí články, které byly vykuchané ze starého akupacku notebooku, a i když měly na nabíječce změřenou kapacitu 3650mAh, tak to nějak nedaly :-( 
Vydržely napájet meteostanici necelý měsíc. Od cca napětí 3.55V šla kapacita ryche dolů, a došlo k celkovému vypnutí meteostanice. 

Graf baterie 1

Nyní jsem použil pro druhý pokus nové články od firmy Liito-kala.com s kapacitou 2x3000mAh (změřeno asi 5700mAh), takže uvidíme, jak bude vypadat křivka s těmito články.


 

Nakupujete moduly pro Arduino na eBay, nebo Aliexpress

Existuje zde portál, který vám za tyto nákupy vrátí až 5% zpět přes tzv. CashBack

Jak to funguje: hlavně VÁS to nic nestojí. Stačí se zaregistrovat na tipli.cz Když potom chcete něco nakoupit na eBay, Aliexpress atd, tak se přihlásíte na Tipli.cz, a odtud teprve přejdete na obchod, ve kterém chcete nakupovat. Tam nakoupíte za NORMÁLNÍ cenu. Server Tipli.cz tanto nákup zaregistruje, a na váš účet vám pošle provizi až 10% z částky, za kterou jste nakoupil. To je vše. Zkusil jsem to, protože jsem si říkal, že nemám co ztratit, a ono to opravdu funguje :-) Nakupovat přes Tipli.cz můžete jak v zahraničních, tak v našich obchodech (MALL, Kasa, Baťa, atd.)


Dříve jsem používal portál Plnápeněženka.cz. Sice jsem od nich dostal zpět skoro 3000 Kč, ale v poslední době jsem začal zjišťovat, že některé částky, hlavně ty vyšší se mi na Plnoupeněženku nezaregistrovaly. Nechci je obviňovat, že to dělají schválně, ale vypadá to tak. Navíc server Tipli.cz vrací vyšší částky z nákupu.

 


 


 

 


Pokud budete chtít s něčím poradit, napište mi na email dole.





Na hlavní stránku