home castoo
chapitre electronique
Electronique

Carte "chinoise" 4 relais
ESP8266-12 Wifi

Mai 2024

Découverte de la carte (Esp-8266-12F 4 relais) que l'on trouve
sur le site AliExpress pour quelques euros.

Intérêt du montage:

Construire une carte pour des besoins spécifiques, c'est bien mais long, nos amis chinois ont créé une petite carte avec une alim (secteur 220 volt ou 7 à 30v ou 5v), un Esp-8266, donc le wifi donc possibilité d'une commande par internet depuis une page web, quatre relais pour seulement quelques euros, du coup, il devient difficile pour l'amateur de faire plus compact et moins cher ! C'est une bonne base pour de nombreux montages et pour un prix imbattable !!!

Les étapes de la découverte

Carte chine esp8266 4 relais


Une carte de 9 sur 9 cm.

Le circuit imprimé est bien fait, la partie alim 220v est bien séparée afin de l'isoler du reste du circuit.
L'alimentation peut être de 3 sortes.
Les sortie des relais sont également bien indépendantes au niveau du PCB.
Les borniers sont bien documentés et de qualité très correctes pour le prix,
Les bornes de picots ne sont pas fournies mais rien de bien grave.
Un petit bouton de reset est même présent sur la carte.

Carte esp 4 relais


Carte 4 relais rs232 usb
L'adaptateur USB <=> TTL.
Pour programmer la carte un petit adaptateur USB / TTL est nécessaire. On en trouve facilement pour 2 ou 3 euros. Le branchement est on ne peut plus simple 3 fils la masse un fil d'émission et un de réception. Relier l'émission de la carte sur la réception de l'adaptateur. L'interface arduino reconnait très facilement ce type d'adaptateur si problème de drivers je donne quelques astuce dans le chapitre informatique -> astuces en vrac...
L'adaptateur n'est bien sur uniquement nécessaire qu'au moment de la programmation du module, ensuite vous l'enlevez du montage.
Pour la programmation de la carte, il faut également positionner le strap IO0 vers masse sur la carte. En mode exécution le strap doit être enlevé.

Carte 4 relais interface série



L'adaptateur USB <=> TTL.
Normalement 3 fils suffisent, masse, rx et tx, c'est bien comme ça que j'ai réussi à programmer la carte lors de mon premier test.
Puis plus moyen, je suis resté bloqué deux jours, j'ai tout soupçonné, la vitesse de prog, le positionnement des fils IO0 et autres, j'ai fait de multiples recherches sur internet pour comprendre pourquoi j'étais bloqué RIEN de RIEN !


Par désespoir, j'ai décidé de changer le processeur esp8266 (j'ai cassé deux pistes dans l'opération, d'ou les petits fils que l'on voit sur certaines photos.) Mais même problème ! J'ai recommandé une 2eme carte, même problème !!!!


En relisant les quelques lignes de doc sur le site AliExpress du vendeur, il était mentionné que le 5 volts de l'adaptateur USB<->Série doit être raccordé sur la carte (Ceci me semble étonnant, sachant que mes premiers essais ont fonctionné sans cette connexion.)

Je met donc cependant le fil 5 volts en place et VICTOIRE CA MARCHE.

Je vous conseille donc d'installer le fil du 5 volts !

Carte 4 relais interface série Coté carte :
Il faut (c'est quand même plus pratique) souder une petite rangée de 6 picots.
La carte est vraiment bien faite, tous les fils nécessaires à la programmation de la carte sont regroupés ici, à l'extrême gauche de la carte, à coté du processeur.
On retrouve donc
le fameux 5 volts,
le TX (à raccorder sur le RX de l'adaptateur USB),
le RX (à recorder sur le TX de l'adaptateur USB),
Je vous conseille donc d'installer le fil de masse de l'USB sur le picot Gnd le plus du bout.
Il faut ensuite cour-circuité les deux picots Gnd et IO0 qui sont cote à cote pour la programmation !

Carte 4 relais mode programmation



Voilà

Pour la programmation de l'esp ça donne ça !

Le strap entre IO0 et Gnd est positionné.

Carte 4 relais mode execution



Voilà

Pour l'exécution du programme sur l'esp ça donne ça !

Le strap entre IO0 et Gnd est supprimé, tous les autres fils Gnd, Tx, Rx et le 5v ne sont plus utilisés et peuvent également être débranché.

Carte 4 relais remplacement esp Mes deux cartes !
On voit bien sur la 1er les deux straps que j'ai été obligé de mettre en place pour reconnecter les pistes que j'ai détruite lors du désoudage. En réalité j'ai découpé un peu trop profondément à la Dremel l'ancien esp (un peu agacé de ne pas comprendre pourquoi ça ne fonctionnait plus !). Par expérience pour le remplacement d'un composant de ce type, il vaut mieux le détruire plutôt que d'insister avec le fer à souder.

Je vous propose un petit programme pour exploiter cette carte.

Cette carte est proposée avec de 1 à 8 relais sur AliExpress, mon programme doit fonctionner avec peu d'adaptation à tous les modèles.
J'ai prévu dans le source une adresse IP fixe (192.168.1.95) pour le montage ceci permet de toujours joindre la carte à la même adresse, il est cependant facile de revenir au mode dhscp en supprimant les 4 lignes dans le setup.

Deux façons de commander les relais :

Carte 4 relais cnx avec nom relai Connexion à la carte sur une page HTML en commande directe.
On indique directement dans la barre d'adresse le relai et l'état que l'on souhaite (ceci peut servir pour piloter la carte avec un autre programme).
PS: Attention sur la photo c'est pas la bonne adresse ! c'est pas '94' mais '95'.


Ici on indique pas de relai sur la ligne d'adresse : http://192.168.1.95

Carte 4 relais cnx page html







Connexion à la carte sur une page HTML avec des boutons pour commander les relais.
En cliquant sur 10 vous passez le relai 1 à 0 et sur le bouton 11 le relai 1 passe à 1 (même chose pour les autres boutons).

Carte 4 relais cnx page html







Connexion à la carte sur une page HTML avec des boutons pour commander les relais.
Ici les deux relais (le 2 et le 3) sont à ON.



Le code (simpliste) que je vous propose, il permet de commander les relais depuis une interface internet ou depuis les boutons.


/*
Gestion des relais d'une carte chinoise à base d'ESP8266-12.
Création 1er version Jean Michel Castille avril 2024 / https://castoo.fr

En cas de compilation avec l'IDE Arduino il faut changer le nom "main.cpp" en "truc.ino"
	et installer le fichier dans un rep "truc"

Ce source est un logiciel libre;
Vous pouvez la redistribuer et ou le modifier.
Ce source est distribué dans l'espoir qu'il sera utile,
mais SANS AUCUNE GARANTIE, sans même la garantie implicite de
QUALITÉ MARCHANDE ou ADÉQUATION À UN USAGE PARTICULIER. 

Pour utiliser ce programme modifier le SSID et le mot de passe de la box lignes 15 et 16
Connectez vous sur l'adresse IP inscrite dans le code du setup (192.168.1.95) dans cet bexemple.

Vous pouvez changer l'état d'un relais en utilisant les boutons de commande de la page principale 
'10' passage à l'état 0 du relai 1
'11' passage à l'état 1 du relai 1
...
ou passer un ordre en ligne de commande http://192.168.1.95/r1_on
ou http://192.168.1.95/r1_off
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

struct Tableau_Relai {
	uint8_t num;
	uint8_t io;
	bool etat;
} ;

Tableau_Relai t_rel[] = {{1,16,false},{2,14,false},{3,12,false},{4,13,false}};

#define ssid "xxxxxxxxxxxxxxxxxxxxxx" // SSID de la box
#define password "yyyyyyyyyyyyyyyyyy" // Pass de la box

ESP8266WebServer server(80); // Port IP par defaut du serveur HTML
String const v_css_body = "body { background-color: grey; font-family: Sans-Serif; Color: orange; text-align: center;}";
String const v_css_lien = "a.btn { text-decoration: none; padding: 10px; font-family: arial; font-size: 1em; color: #FFFFFF; background-color: #b2a2c7; border-radius: 24px;-webkit-border-radius: 24px; -moz-border-radius: 24px; border: 4px solid #ffffff; box-shadow: 3px 3px 8px #444444; -webkit-box-shadow: 3px 3px 8px #444444; -moz-box-shadow: 3px 3px 8px #444444; }";
String const v_css_lien_vol = "a.btn:hover { padding: 10px; color: #ffff00; background-color: #5f497a; border: 4px solid #fbd5b5; box-shadow: 1px 1px 4px #777777; -webkit-box-shadow: 1px 1px 4px #777777; -moz-box-shadow: 1px 1px 4px #777777; }";
unsigned long temps_inter_h; // Mesure du temps entre deux mesure du serveur heure
struct tm * timeinfo;

// -----------------------------------------------------------------------------------------------------------------------------------
String aff_etat_rel(){
	String page = "<!DOCTYPE html><html dir='ltr' lang='fr'><head><meta http-equiv='content-type' content='text/html; charset=UTF-8'>";
	page += "<style> " + v_css_body + v_css_lien + v_css_lien_vol + " </style>";
	page += "<title>mémoire RTC</title>";
	page += "<style> body { background-color: grey; font-family: Sans-Serif; Color: orange; }</style>";
	page += "</head><body><div align='center'><h1>Gestion relais</h1>";
	page += " Nous sommes le " + String(timeinfo->tm_mday) + "/" + String(timeinfo->tm_mon + 1) + "/" +  String(timeinfo->tm_year + 1900);
	page += " il est " + String(timeinfo->tm_hour) + " H " + String(timeinfo->tm_min) + " <br/>";
	page += "<h3>ETAT DES RELAIS</h3>";
	page += "<form action='/' method='POST'>";
	page += "<ul>";
	page += "<li>Relais 1 : <INPUT type='submit' name='REL' value='11'> <INPUT type='submit' name='REL' value='10'> ";
	page += (t_rel[0].etat)?"ON":"OFF"; page += "</li>";
	page += "<li>Relais 2 : <INPUT type='submit' name='REL' value='21'> <INPUT type='submit' name='REL' value='20'> ";
	page += (t_rel[1].etat)?"ON":"OFF"; page += "</li>";
	page += "<li>Relais 3 : <INPUT type='submit' name='REL' value='31'> <INPUT type='submit' name='REL' value='30'> ";
	page += (t_rel[2].etat)?"ON":"OFF"; page += "</li>";
	page += "<li>Relais 4 : <INPUT type='submit' name='REL' value='41'> <INPUT type='submit' name='REL' value='40'> ";
	page += (t_rel[3].etat)?"ON":"OFF"; page += "</li>";
	page += "</ul><br><p align='center'><a class='btn' href='/' target='_self'>Actualiser</a> ";
	page += " <a class='btn' href='https://www.castoo.fr' target='_blank'>Visiter le site https://www.castoo.fr</a></p>";
	page += "</body></html>";
	return page;
}

// -----------------------------------------------------------------------------------------------------------------------------------
void lance_page() {
	String val_arg;
	val_arg = server.arg("REL");
	switch (val_arg.toInt())
	{
	case 10:
		{ digitalWrite(t_rel[0].io, LOW);    t_rel[0].etat = false; server.send(200, "text/html", aff_etat_rel()); };
	break;
	case 11:
		{ digitalWrite(t_rel[0].io, HIGH);   t_rel[0].etat = true; server.send(200, "text/html", aff_etat_rel()); }; 
	break;
	case 20:
		{ digitalWrite(t_rel[1].io, LOW);    t_rel[1].etat = false; server.send(200, "text/html", aff_etat_rel()); };
	break;
	case 21:
		{ digitalWrite(t_rel[1].io, HIGH);   t_rel[1].etat = true; server.send(200, "text/html", aff_etat_rel()); }; 
	break;
	case 30:
		{ digitalWrite(t_rel[2].io, LOW);    t_rel[2].etat = false; server.send(200, "text/html", aff_etat_rel()); };
	break;
	case 31:
		{ digitalWrite(t_rel[2].io, HIGH);   t_rel[2].etat = true; server.send(200, "text/html", aff_etat_rel()); }; 
	break;
	case 40:
		{ digitalWrite(t_rel[3].io, LOW);   t_rel[3].etat = false; server.send(200, "text/html", aff_etat_rel()); }; 
	break;
	case 41:
		{ digitalWrite(t_rel[3].io, HIGH);   t_rel[3].etat = true; server.send(200, "text/html", aff_etat_rel()); }; 
	break;
	default:
	server.send(200, "text/html", aff_etat_rel());
	break;
	}
}

// -----------------------------------------------------------------------------------------------------------------------------------
void setup() {
	pinMode(t_rel[0].io, OUTPUT);
	pinMode(t_rel[1].io, OUTPUT); 
	pinMode(t_rel[2].io, OUTPUT); 
	pinMode(t_rel[3].io, OUTPUT); 
	IPAddress ip(192, 168, 1, 95); // Declaration adr IP fixe
	IPAddress dns(192,168,1,1);
	IPAddress gateway(192,168,1,1);
	IPAddress subnet(255, 255, 255, 0);
	WiFi.mode(WIFI_STA);
	WiFi.config(ip, gateway, subnet, dns);
	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_CONNECTED) {
	delay ( 100 );
	}
	configTime(0, 0 , "pool.ntp.org", "time.nis.gov");
	setenv("TZ", "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", 1);
	while (time(nullptr) < 1000000000ul) {
	delay(100);
	}
	time_t now = time(nullptr);
	timeinfo = localtime (&now);
	char buffer [80];
	strftime (buffer,80,"Local time: %H:%M.",timeinfo);
	time(&now);
	temps_inter_h = millis();
	server.on ( "/", lance_page );
	server.on("/r1_off", [](){ digitalWrite(t_rel[0].io, LOW);    t_rel[0].etat = false; server.send(200, "text/html", aff_etat_rel()); });
	server.on("/r1_on",  [](){ digitalWrite(t_rel[0].io, HIGH);   t_rel[0].etat = true; server.send(200, "text/html", aff_etat_rel()); }); 
	server.on("/r2_off", [](){ digitalWrite(t_rel[1].io, LOW);    t_rel[1].etat = false; server.send(200, "text/html", aff_etat_rel()); });
	server.on("/r2_on",  [](){ digitalWrite(t_rel[1].io, HIGH);   t_rel[1].etat = true; server.send(200, "text/html", aff_etat_rel()); }); 
	server.on("/r3_off", [](){ digitalWrite(t_rel[2].io, LOW);    t_rel[2].etat = false; server.send(200, "text/html", aff_etat_rel()); });
	server.on("/r3_on",  [](){ digitalWrite(t_rel[2].io, HIGH);   t_rel[2].etat = true; server.send(200, "text/html", aff_etat_rel()); }); 
	server.on("/r4_off", [](){ digitalWrite(t_rel[3].io, LOW);    t_rel[3].etat = false; server.send(200, "text/html", aff_etat_rel()); });
	server.on("/r4_on",  [](){ digitalWrite(t_rel[3].io, HIGH);   t_rel[3].etat = true; server.send(200, "text/html", aff_etat_rel()); }); 
	server.begin();
}

// -----------------------------------------------------------------------------------------------------------------------------------
void loop() {
	server.handleClient();
	if((millis() - temps_inter_h) >= 60000){ // on ne lance une interrogation serveur horaire qu'une fois toutes les minutes
	time_t now = time(nullptr);
	timeinfo = localtime (&now);
	temps_inter_h += 60000;
	}
	delay(100);
}
	




J'espere que cette petite présentation vous aura donné l'envie de tester cette petite carte bien pratique et pas cher.
Le relai a un pouvoir de coupure de 10A sous 250volts alors cela permet d'imaginer de nombreuses utilisations même si il ne faut pas prendre trop de risque 5 ampères c'est déjà super ! En tout cas le circuit imprimé est même découpé pour éviter les ponts que pourrait provoquer une forte intensité !


accueil electronique

Bricolage Robotique Informatique Peinture Voyage
Téléc. portail Le robot "mécano" Astuces informatique Henri Bertrou Auvergne
Bat. Iphone 6S Le robot "solaire" Réseau couche app. Jean-Michel Castille Floride
Robot piscine Servo et IR" Réseau Les couches New York
Xiaomi M365 Le robot "thymio" Réseaux Outils L'Ouest américain
Mac Mini Le robot "Rovio" Unités grandeur inf. L'Ile Maurice
Putty SSH Windows L'Italie / Venise
Bases Raspberry Tunisie
Termius IPhone/IPad Grece
Le vieux ZX 81
...
Navigation La Rochelle CNC / Imp3D Electronique Programmation
Rencontre dauphins Les Minimes Construction CNC Alim. TPL 5110 Doc. programme
Analyse NMEA 0183 Le Vieux port CNC du commerce Carte ESP8266 Indent programme
graph. NMEA 0183 L'Ile de Ré Martyr CNC ESP8266 1 relai Prog. objet
Analyse trames AIS A visiter Réa. imp. 3D ESP8266 Alarme Prog. procédurale
Analyse AIS TCP-IP Cura impression 3D ESP8266 MQTT
Sortie en ketch Plateau CR10 ESP8266 Temp.
Echange GPS C80 Anémomètre.
HP Sun-Odyssey CNC / 3D en vrac MCP9808 Librairie
LCD yanmar Saisie Oled
Testeur nmea esp1 i2c