WiFi teploměr s bateriovým napájením

calendar_month19.1.2019

Jádrem je známý WiFi čip ESP8266 s integrovaným TCP/IP stackem. Z připojeného senzoru DHT22 přečte každých 5 minut teplotu a vlhkost, změří napětí na baterii, poté se připojí k WiFi a data pošle patřičnému php scriptu na serveru.

Mezi měřeními zůstává čip ve stavu hlubokého spánku, tzv. deep sleep, ve kterém odebírá minimální proud, cca 7μA. Napájen třemi 2600mAh NiMH články velikosti AA vydrží fungovat více než měsíc.

Napájení

Jmenovité napětí baterie je 3 x 1,2V = 3,6V.  To odpovídá maximálnímu katalogovému napájecímu napětí čipu ESP8266. Na plně nabité baterii jsem naměřil ještě o něco víc - bezmála 4V. Z toho důvodu je do zapojení zařazena schottkyho dioda D1, na které vzniká při typickém odběru úbytek napětí cca 0,4V. Napětí nabité baterie tak sníží na požadovanou hodnotu 4 - 0,4V = 3,6V.

Naopak za vybitý lze NiMH článek považovat při poklesu napětí pod 1,1V, to jsou 3,3V na baterii. Dle katalogu přestává ESP pracovat pod 3V, praxí je ale mnohokrát ověřeno, že ještě při 2,8V funguje spolehlivě. Dioda D1 tak nebrání plnému využití kapacity baterie, protože i při jejím minimálním napětí 3,3V je na ESP stále 3,3 - 0,4 = 2,9V, při kterých je schopno fungovat. Ostatní součástky si poradí s celým uvažovaným rozsahem napájecího napětí 2,9V - 3,6V.

Zapojení


Pro správnou funkci ESP jsou stěžejní logické úrovně na GPIO0, GPIO2 a GPIO15 v okamžiku jeho startu. Na základě toho čip naběhne do jednoho z následujících režimů:

Logické úrovně určují rezistory R3 (GPIO0), R5 (GPIO2) a R6 (GPIO15). Standardně běží čip v režimu Boot sketch, ve kterém je zpracováván náš program. Tlačítkem SW2 ho lze přepnout do režimu Uart Bootloader pro programování.

Teplotu a vlhkost vzduchu snímá DHT22, ke kterému je přiřazen ještě pull-up odpor R9. R10 krotí proud LED diodou D2. Ta je jediným signalizačním prvkem, který nepřetržitě bliká během připojování k WiFi, třikrát rychle blikne při připojení a dvakrát po odeslání dat. V OTA režimu pak svítí nepřetržitě.

Vestavěný A/D převodník je využit k měření napětí na baterii. To je sníženo odporovým děličem R7 a R8, protože maximální přípustné napětí na vstupu ADC činí 1V. Přesná hodnota napětí je potom softwarově dopočítána.

Rezistor R1 drží vstup RESET spolehlivě v log1. Restartovat zařízení je možné tlačítkem SW1. Jak již bylo zmíněno v úvodu, čip je uváděn do stavu hlubokého spánku. Z něho se probudí impulzem od přetečeného čítače na pinu GPIO16 propojeného s RESETem přes R4.

Provedení

Projekt v programu KiCAD si zde můžete stáhnout.

Součástky jsou osazeny na oboustrannou DPS. První desku jsem vyrobil ruční cestou, další plánuji zadat do výroby venku.

osazená DPS (1.strana)
osazená DPS (2. strana)

Teploměr je vestavěn do plastové krabičky, ze které vyčnívá pouze snímač a LED. V novějších verzích jsou ještě na čelní straně zpřístupněna obě tlačítka.

Programování

První nahrání software musí proběhnout přes připojený programátor (převodník). Do programovacího režimu nastartujeme ESP podržením tlačítka SW2 při připojení napájení. Po probliknutí LED na ESP je možné tlačítko uvolnit a začít s přenosem.

Případné další verze programu je již možné nahrávat přes OTA, tedy bez připojování programátoru. Režim OTA se aktivuje stiskem tlačítka RESET a pak podržením tlačítka PROG až do rozsvícení LED. Poté je již možné vyhledat v Arduino IDE port "id_201".

Program ESP

Program pro ESP si můžete stáhnout zde. Citlivé údaje jsem nahradil hvězdičkami. Z komentů by mělo být jasné, o co se v programu snažím.

PHP script

Údaje z teploměru jsou GET metodou předávány PHP scriptu na serveru, kde jsou ukládány do databáze. Jednoduchý script může vypadat třeba takto:

// nejprve naplnime promenne daty predanymi pres GET
$signal = ($_GET['s']);
$ip = ($_GET['ip']);
$teplota = ($_GET['t']);
$vlhkost = ($_GET['v']);
$napeti = ($_GET['n']);

// zapiseme si aktualni cas
$cas = time();

// zajistime validitu teploty a vlhkosti
if($teplota == "nan")
{
	$teplota = "0";
}

if($vlhkost == "nan")
{
	$vlhkost = "0";
}

// zadame udaje pro pristup k databazi
$server = "localhost";
$user = "********";
$pass = "********";
$db = "********";
		  
// pripojime se k databazi
$mysqli = mysqli_connect($server, $user, $pass, $db);

// pokud se podarilo pripojit k databazi, data ulozime do tabulky
if ($mysqli)
{
	$sql = "INSERT INTO teplomer_202 (CAS,IP,SIGN,TEPLOTA,VLHKOST,NAPETI) VALUES (".$cas.",".$ip.",".$signal.",".$teplota.",".$vlhkost.",".$napeti.")";
	$doSql = $mysqli->query($sql);
			
	// zkontrolujeme, zda probehl zapis a dame zpetnou vazbu
	if($doSql)
	{
		echo 'data zpracovana v poradku';
	}
	else
	{
		echo 'nepodarilo se zapsat do databaze';
	}
}
else
{
	echo "nelze otevrit databazi";
}
		

Děkuji za přečtení. Pokud máte jakékoliv dotazy, nápady či připomínky, neváhejte mi napsat email.