L'ESP8266-Module Wifi

L'esp8266 est un microcontroleur qui intègre le wifi, ce qui n'est pas négligeable. De plus son processeur tourne à 80Mhz et sa mémoire flash vas jusqu'a 4MB.

Le wifi autonome ou pour nano ordinateur, c'est l'occasion de pratiquer du LUA.
Le LUA est un langage qui prend peu de place mémoire et permet d'être installé sur ces petites bêtes
Différents modèles d'ESP8266
ModèleESP-01ESP-12E NodeMCUWemos D1 Mini
Image
GPIOs4 (including TX and RX)1111
ADC Pins111
Flash Memory1MB (upgraded version)4MB4MB
USB to Serial ConverterX
Taille24.75mm x 14.5mm48.55mm x 25.6mm34.2mm x 25.6mm
ESP-01 Enfin, seule la broche GPIO2 reste en tant que broche à utiliser pour les entrées/sorties à usage général, et même cela dans des conditions spécifiques.

Programmer l'ESP-01

La série d'actions que vous devez faire pour programmer la puce est la suivante :
Ne pas effectuer ces actions dans l'ordre indiqué ci-dessus créera très probablement un court-circuit, provoquant la gravure d'au moins une broche ou de votre ESP-01 ou de votre programmeur. Vous avez été prévenu - encore une fois !!!

Cas d'utilisation : Utilisation des broches TXD et RXD comme broches I2C

Bien que les broches TXD et RXD soient principalement utilisées comme interface série, ce sont également des broches d'E/S à usage général qui peuvent être programmées pour fonctionner comme telles.
TXD est également appelé GPIO1 et RXD GPIO3. Nous devons bien sûr accepter le fait que sans interface série, il nous manquera un moyen de communiquer avec notre logiciel et le principal outil de débogage de notre code.
Par conséquent, nous devons être extrêmement prudents et concevoir d'autres façons d'opérer à l'aveugle. Mais c'est un sujet énorme et hors de la portée de cet article.

En termes de logiciel, afin de forcer les broches TXD/GPIO1 et RXD/GPIO3 à fonctionner comme des broches I2C fonctionnant respectivement comme SDA et SCL, nous devons définir dans notre code :
    Wire.begin(1, 3); //Wire.begin(sda_pin, scl_pin).

Programmation

Les mesures suivantes ont été réalisées avec une carte ESP01 dont la LED power a été retirée.

Alimentation Mode éveillé Mode veille
Broche VCC en 3.3V 76 mA en fonctionnement standard (avec des pics allant jusqu'a 150mA lors de la connexion au wifi d'une durée allant de 2 secondes à 8 secondes). 18µA

Avec la LED rouge, la consommation est de 340µA en mode veille.

Mise en sommeil et réveil logiciel

Sur l'ESP01 ou l'ESP01s, la broche GPIO16 du microcontrôleur ESP8266 n'a pas été câblée de manière à ce qu'elle soit accessible à l'utilisateur.
De ce fait, il est impossible d'utiliser le réveil logiciel car ce dernier ne fonctionne que si nous pouvons connecter entre eux GPIO16 et RST.

Différents modes de veille et consommation
ItemModem-sleepLight-sleepDeep-sleep
Wi-FiOFFOFFOFF
System clockONOFFOFF
RTCONONON
CPUONPendingOFF
Substrate current15 mA0.4 mA~20 µA
Average current DTIM = 116,2 mA1,8 mA-
Average current DTIM = 315,4 mA0,9 mA-
Average current DTIM = 1015,2 mA0,55 mA-

Modem-Sleep

Le mode Modem-Sleep est utilisé dans les applications qui nécessitent le fonctionnement du processeur, comme dans les applications PWM ou I2S.
Il est conforme à la norme 802.11 (U-APSD). Le modem Wi-Fi est arrêté tout en maintenant une connexion Wi-Fi sans transmission de données pour optimiser la consommation d’énergie.
Trois modes sont disponibles, DTIM1 à 3. DTIM (Delivery Traffic Indication Message). Par exemple dans le mode DTIM3, le modem est mis en sommeil durant 300 ms puis activé durant 3 ms. Avec ce mode, la consommation est de 15 mA.

Light-Sleep (sommeil léger)

En plus de la suspension du modem WiFI, le CPU est mis en attente et réactivé si nécessaire.

Deep-Sleep (sommeil profond)

C’est le seul mode le plus simple à mettre en oeuvre et le plus économe en énergie pour des projets qui fonctionnent sur batterie. Seul le RTC (Real-Time Clock) qui est une horloge interne capable de réveiller le microcontrôleur après un temps donné.
On active le mode Deep-sleep en reliant la broche RST à la broche D0, celle-ci n’est donc plus disponible pour un autre usage, il n’est plus possible de téléverser un programme, il faudra déconnecter la broche RST avant de pouvoir téléverser un programme.
Sur certains modules, la broche D0 peut être identifiée par GPIO16.
En reliant les broches D0 et RST, il n’est plus possible de téléverser un programme. Quelque soit votre environnement de développement (IDE Arduino, PlatformIO, ESP Tools), il faudra déconnecter la broche RST avant de pouvoir téléverser un programme.

Flasher votre ESP dans un premier temps Lien vers le site avec les programmes et les fichiers binaires contenant de quoi flasher.

Module ESP8266-ESP201
Je vous conseil d'acheter un module type : PL2303 USB To RS232 TTL Module de conversion automatique 5V 3.3V sortie
En effet le module ne supporte pas une tension de 5V, il est nécessaire d'avoir une tension d'alimentation et de signal série en 3.3V
Vérifier votre brochage, tous les ESP8266-ESP201 ne sont pas exactement identiques.
Lien Avec un Tuto pour flasher votre ESP.
Piloter un relai
Module ESP8266-ESP201 avec relai
En effet pour piloter un relai, un transistor est nécessaire. La partie serveur HTML pour le pilotage du relai.
Un serveur HTML
	-- perso_html V2
	-- pour android
	wifi.setmode(wifi.STATION);
	wifi.sta.config("Livebox###","########################");
	tmr.delay(1000000); -- 1 appuis 1s sur le boutton
	print(wifi.sta.getip());
	print("Serveur prêt")
	-- liste des ports  et GPIO
	--  4 GPIO2/102
	--  2 GPIO4/104
	--  1 GPIO5/105
	--  6 GPIO12/1012
	--  7 GPIO13/1013
	--  5 GPIO14/1014
	-- commande ?pin=N4 appuis sur 4
	
	leds={4,"Lampes Entrée/102",2,"Lampes Jardin/104",1,"Eteindre tout/105",6,"GPIO12/1012",7,"GPIO13/1013",5,"GPIO14/1014"}
	
	for i=1,table.getn(leds),2 do
		gpio.mode(leds[i], gpio.OUTPUT)
	end
	
	srv=net.createServer(net.TCP)
	srv:listen(80,function(conn)
		conn:on("receive", function(client,request)
			local buf = "";
			local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
			if(method == nil)then
				_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
			end
			local _GET = {}
			if (vars ~= nil)then
				for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
					_GET[k] = v;
					-- print(v);
				end
			end
			local _on,_off = "",""
			x=_GET.pin;
			if x then
				if(string.sub(x,1,1)=="N")then
					gpio.write(tonumber(string.sub(x,2)), gpio.HIGH);
					tmr.delay(1000000); -- 1 appuis 1s sur le boutton
					gpio.write(tonumber(string.sub(x,2)), gpio.LOW);                
				elseif(x == "OFF")then
					-- procedure a realiser
					gpio.write(1, gpio.HIGH);
					tmr.delay(1000000); -- 1 appuis 1s sur le boutton
					gpio.write(1, gpio.LOW); -- 105
					-- srv:close();
				end
			end
			client:send(buf);
			client:close();
			collectgarbage();
		end)
	end)
					
Récupération température avec DS18B20
-- ds18b20 one wire example for NODEMCU (Integer firmware only)
-- NODEMCU TEAM
-- LICENCE: http://opensource.org/licenses/MIT
-- Vowstar 
	
	pin = 3 -- GPIO0 broche 100.
	ow.setup(pin)
	count = 0
	repeat
		count = count + 1
		addr = ow.reset_search(pin)
		addr = ow.search(pin)
		tmr.wdclr()
	until((addr ~= nil) or (count > 100))
	if (addr == nil) then
		print("No more addresses.")
	else
		print(addr:byte(1,8))
		crc = ow.crc8(string.sub(addr,1,7))
		if (crc == addr:byte(8)) then
			if ((addr:byte(1) == 0x10) or (addr:byte(1) == 0x28)) then
				print("Device is a DS18S20 family device.")
				repeat
					ow.reset(pin)
					ow.select(pin, addr)
					ow.write(pin, 0x44, 1)
					tmr.delay(1000000)
					present = ow.reset(pin)
					ow.select(pin, addr)
					ow.write(pin,0xBE,1)
					print("P="..present)  
					data = nil
					data = string.char(ow.read(pin))
					for i = 1, 8 do
						data = data .. string.char(ow.read(pin))
					end
					print(data:byte(1,9))
					crc = ow.crc8(string.sub(data,1,8))
					print("CRC="..crc)
					if (crc == data:byte(9)) then
						t = (data:byte(1) + data:byte(2) * 256)
					
					-- handle negative temperatures
					if (t > 0x7fff) then
						t = t - 0x10000
					end
	
					if (addr:byte(1) == 0x28) then
						t = t * 625  -- DS18B20, 4 fractional bits
					else
						t = t * 5000 -- DS18S20, 1 fractional bit
					end
	
					local sign = ""
					if (t < 0) then
						sign = "-"
						t = -1 * t
					end
					
					-- Separate integral and decimal portions, for integer firmware only
					local t1 = string.format("%d", t / 10000)
					local t2 = string.format("%04u", t % 10000)
					local temp = sign .. t1 .. "." .. t2
					print("Temperature= " .. temp .. " Celsius")
					end                   
					tmr.wdclr()
				until false
			else
				print("Device family is not recognized.")
			end
		else
			print("CRC is not valid!")
		end
	end
	


Le branchement ne tiens pas compte de la programmation ou il faut être en mode FLASH