Controllo Faretti led da remoto con NodeMCU Lua

Ciao, è da un po che non scrivevo qui. Dovrei accendere un faretto led 12VDC da remoto, e ho deciso di utilizzare arduino con un esp8266 (Non voglio usare la ethernet shield perchè sono lontano dal router e non ho voglia di mettere cavi). Ho visto molti video interessanti, 1 2 3 4 ,ma tutti erano sulla ethernet shield, ora mi chiedo il codice che si usa per ethernet shield, magari con qualche modifica potrebbe andare su un arduino con collegato un esp8266.

Grazie :slight_smile:

Ho trovato uno sketch per sonoff, tranquillamente adattabile per il mio caso, solo che non capisco alcuni punti.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;

// Replace with your network credentials
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

ESP8266WebServer server(80);

String webPage = "";

int gpio13Led = 13;
int gpio12Relay = 12;

void setup(void){
  webPage += "<h1>SONOFF Web Server</h1><p><a href=\"on\"><button>ON</button></a>&nbsp;<a href=\"off\"><button>OFF</button></a></p>";  
  // preparing GPIOs
  pinMode(gpio13Led, OUTPUT);
  digitalWrite(gpio13Led, HIGH);
  
  pinMode(gpio12Relay, OUTPUT);
  digitalWrite(gpio12Relay, HIGH);
 
  Serial.begin(115200); 
  delay(5000);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
  
  server.on("/", [](){
    server.send(200, "text/html", webPage);
  });
  server.on("/on", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio13Led, LOW);
    digitalWrite(gpio12Relay, HIGH);
    delay(1000);
  });
  server.on("/off", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio13Led, HIGH);
    digitalWrite(gpio12Relay, LOW);
    delay(1000); 
  });
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop(void){
  server.handleClient();
}
  1. Cosè mdns?
  2. Perchè fa quel
server.on ("/" [](){.....
  1. Come fa a capire chè nella pagina server io premo sul pulsante on oppure off, ci sono tutti quei pezzi di
server.on

che non capisco… Presumo però che quando premo su on interviene quel

server.on("/on"....

e quando premo off interviene

server.on("/off"....

Grazie :slight_smile:

up

mDNS è un servizio zero-configuration che serve per risolvere i nomi in rete locale. Un esempio è il servizio Bonjour di Apple.
Serve per richiamare un indirizzo IP tramite un nome invece dell'indirizzo. Ad esempio "arduino.local" usato dallo YUN.
L'altro codice invece richiama semplicemente una funzione allo scatenarsi di un evento come ad esempio l'attachInterrupt di Arduino.
Lì invece di mettere il richiamo alla funzione hanno direttamente inserito il codice da eseguire. Un passaggio in meno ma che complica la lettura.

Ok grazie PaoloP, ma questo codice è per sonoff, dei modulini con un esp8266 e un relay, ed io dovrei adattare questo codice ad arduino, non so se devo cambiare alcune librerie o alcune parti di codice, perchè a vederlo così secondo me gira anche su arduino... C'è qualcosa che devo cambiare? :slight_smile:
Grazie :slight_smile:

No, non gira su Arduino, ma direttamente sull'ESP8266.

Il problema è farlo girare su arduino... Vediamo un pò in giro che trovo...

Ernesto, la risposta è sempre la stessa, invece di andare in giro a scopiazzare cose che non c'entrano nulla, fatte per MCU diverse, STUDIA quanto è QUI e, già con gli esempi forniti da SukkoPera, risolvi il problema !

Guglielmo

Non avevo considerato webbino, in quanto in quanto diceva compatibile con esp8266 ma non specificava il modello che serve a me ovvero ESP01... Non so se può andare bene.
Per intenderci esp01 è questo

...Leggendo sulla pagina di webbino dice chiaramente:

La libreria è attualmente in fase di beta, e sarà presto rilasciata come stabile. Nel frattempo eventuali test, suggerimenti e richieste sono i benvenuti :). Anche le critiche sono benvenute, purché costruttive. Per tutto ciò, e per qualsiasi domanda potete usare questo thread.

...Se è in fase di beta non mi serve, vorrei avere una cosa stabile e non con bug perchè è in beta...

... sempre di ESP8266 si tratta, montato su varie schede ... ma sempre quello è e ... la libraria è sicuramente mooooolto più stabile di qualsiasi cosa possa scrivere tu (... personalmente, con le ulime modifiche che SukkoPera ha fatto, mai avuto problemi).

Guglielmo

Ok vedro webbino, spero non mi si accendano i faretti a caso... :stuck_out_tongue: :grin: :grin: ...

E' per scherzare...

Ok trovato il codice esempio LedControl

#include <Webbino.h>

// Instantiate the WebServer
WebServer webserver;

// Instantiate the network interface defined in the Webbino headers
#if defined (WEBBINO_USE_ENC28J60)
	#include <WebbinoInterfaces/ENC28J60.h>
	NetworkInterfaceENC28J60 netint;
#elif defined (WEBBINO_USE_WIZ5100) || defined (WEBBINO_USE_WIZ5500)
	#include <WebbinoInterfaces/WIZ5x00.h>
	NetworkInterfaceWIZ5x00 netint;
#elif defined (WEBBINO_USE_ESP8266)
	#include <WebbinoInterfaces/AllWiFi.h>

	#include <SoftwareSerial.h>
	SoftwareSerial swSerial (6, 7);

	// Wi-Fi parameters
	#define WIFI_SSID        "ssid"
	#define WIFI_PASSWORD    "password"

	NetworkInterfaceWiFi netint;
#elif defined (WEBBINO_USE_WIFI) || defined (WEBBINO_USE_WIFI101) || \
	  defined (WEBBINO_USE_ESP8266_STANDALONE)
	#include <WebbinoInterfaces/AllWiFi.h>

	// Wi-Fi parameters
	#define WIFI_SSID        "ssid"
	#define WIFI_PASSWORD    "password"

	NetworkInterfaceWiFi netint;
#elif defined (WEBBINO_USE_DIGIFI)
	#include <WebbinoInterfaces/DigiFi.h>
	NetworkInterfaceDigiFi netint;
#endif

// Pin to control, make sure this makes sense (i.e.: Use D0 on NodeMCU)!
const byte ledPin = 7;

// Logic level turns the led on: on NodeMCU and with most relays, this should
// be LOW
const byte LED_ACTIVE_LEVEL = HIGH;

// Pin state (True -> ON)
boolean ledState = false;


/******************************************************************************
 * PAGE FUNCTIONS                                                             *
 ******************************************************************************/

void ledToggle (HTTPRequestParser& request) {
	char *param;

	param = request.get_parameter (F("state"));
	if (strlen (param) > 0) {
		if (strcmp_P (param, PSTR ("on")) == 0) {
			ledState = true;
			digitalWrite (ledPin, LED_ACTIVE_LEVEL);
		} else {
			ledState = false;
			digitalWrite (ledPin, !LED_ACTIVE_LEVEL);
		}
	}
}


/******************************************************************************
 * DEFINITION OF PAGES                                                        *
 ******************************************************************************/

#include "html.h"

const Page page01 PROGMEM = {index_html_name, index_html, ledToggle};

const Page* const pages[] PROGMEM = {
	&page01,
	NULL
};


/******************************************************************************
 * DEFINITION OF TAGS                                                         *
 ******************************************************************************/

#define REP_BUFFER_LEN 32
char replaceBuffer[REP_BUFFER_LEN];
PString pBuffer (replaceBuffer, REP_BUFFER_LEN);

PString& evaluate_onoff_checked (void *data) {
	boolean st = reinterpret_cast<int> (data);
	if (ledState == st) {
		pBuffer.print ("checked");
	}

	return pBuffer;
}

PString& evaluate_webbino_version (void *data __attribute__ ((unused))) {
	pBuffer.print (WEBBINO_VERSION);

	return pBuffer;
}


EasyReplacementTag (tagStateOnChecked, ST_ON_CHK, evaluate_onoff_checked, true);
EasyReplacementTag (tagStateOffChecked, ST_OFF_CHK, evaluate_onoff_checked, false);
EasyReplacementTag (tagWebbinoVer, WEBBINO_VER, evaluate_webbino_version);

EasyReplacementTagArray tags[] PROGMEM = {
	&tagStateOnChecked,
	&tagStateOffChecked,
	&tagWebbinoVer,
	NULL
};


/******************************************************************************
 * MAIN STUFF                                                                 *
 ******************************************************************************/

void setup () {
	Serial.begin (9600);
	while (!Serial)
		;

	Serial.println (F("Webbino " WEBBINO_VERSION));

	Serial.println (F("Trying to get an IP address through DHCP"));
#if defined (WEBBINO_USE_ENC28J60) || defined (WEBBINO_USE_WIZ5100) || defined (WEBBINO_USE_WIZ5500)
	byte mac[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
	bool ok = netint.begin (mac);
#elif defined (WEBBINO_USE_ESP8266)
	swSerial.begin (9600);
	bool ok = netint.begin (swSerial, WIFI_SSID, WIFI_PASSWORD);
#elif defined (WEBBINO_USE_WIFI) || defined (WEBBINO_USE_WIFI101) || \
	  defined (WEBBINO_USE_ESP8266_STANDALONE)
	bool ok = netint.begin (WIFI_SSID, WIFI_PASSWORD);
#elif defined (WEBBINO_USE_DIGIFI)
	bool ok = netint.begin ();
#endif

	if (!ok) {
		Serial.println (F("Failed to get configuration from DHCP"));
		while (42)
			;
	} else {
		Serial.println (F("DHCP configuration done:"));
		Serial.print (F("- IP: "));
		Serial.println (netint.getIP ());
		Serial.print (F("- Netmask: "));
		Serial.println (netint.getNetmask ());
		Serial.print (F("- Default Gateway: "));
		Serial.println (netint.getGateway ());

		webserver.begin (netint, pages, tags);
	}

	// Prepare pin
	digitalWrite (ledPin, !LED_ACTIVE_LEVEL);		// Off
	pinMode (ledPin, OUTPUT);
}

void loop () {
	webserver.loop ();
}

In aggiuntiva c’è una scheda html.h che metto anche qui sotto (Il sito non me lo fa mettere, ho superato i 9000 caratteri)

Ecco qui la scheda html.h

const char index_html_name[] PROGMEM = "/index.html";

const char index_html[] PROGMEM = {
 0x3c,  0x68,  0x74,  0x6d,  0x6c,  0x3e,  0x3c,  0x62,  
 0x6f,  0x64,  0x79,  0x3e,  0x3c,  0x68,  0x32,  0x3e,  
 0x57,  0x65,  0x62,  0x62,  0x69,  0x6e,  0x6f,  0x20,  
 0x23,  0x57,  0x45,  0x42,  0x42,  0x49,  0x4e,  0x4f,  
 0x5f,  0x56,  0x45,  0x52,  0x23,  0x3c,  0x2f,  0x68,  
 0x32,  0x3e,  0x3c,  0x68,  0x33,  0x3e,  0x3c,  0x61,  
 0x20,  0x68,  0x72,  0x65,  0x66,  0x3d,  0x22,  0x68,  
 0x74,  0x74,  0x70,  0x73,  0x3a,  0x2f,  0x2f,  0x67,  
 0x69,  0x74,  0x68,  0x75,  0x62,  0x2e,  0x63,  0x6f,  
 0x6d,  0x2f,  0x53,  0x75,  0x6b,  0x6b,  0x6f,  0x50,  
 0x65,  0x72,  0x61,  0x2f,  0x57,  0x65,  0x62,  0x62,  
 0x69,  0x6e,  0x6f,  0x22,  0x3e,  0x68,  0x74,  0x74,  
 0x70,  0x73,  0x3a,  0x2f,  0x2f,  0x67,  0x69,  0x74,  
 0x68,  0x75,  0x62,  0x2e,  0x63,  0x6f,  0x6d,  0x2f,  
 0x53,  0x75,  0x6b,  0x6b,  0x6f,  0x50,  0x65,  0x72,  
 0x61,  0x2f,  0x57,  0x65,  0x62,  0x62,  0x69,  0x6e,  
 0x6f,  0x3c,  0x2f,  0x61,  0x3e,  0x3c,  0x2f,  0x68,  
 0x33,  0x3e,  0x3c,  0x68,  0x33,  0x3e,  0x43,  0x6f,  
 0x70,  0x79,  0x72,  0x69,  0x67,  0x68,  0x74,  0x20,  
 0x28,  0x43,  0x29,  0x20,  0x32,  0x30,  0x31,  0x32,  
 0x2d,  0x32,  0x30,  0x31,  0x36,  0x20,  0x42,  0x79,  
 0x20,  0x3c,  0x61,  0x20,  0x68,  0x72,  0x65,  0x66,  
 0x3d,  0x22,  0x6d,  0x61,  0x69,  0x6c,  0x74,  0x6f,  
 0x3a,  0x73,  0x6f,  0x66,  0x74,  0x77,  0x61,  0x72,  
 0x65,  0x40,  0x73,  0x75,  0x6b,  0x6b,  0x6f,  0x6c,  
 0x6f,  0x67,  0x79,  0x2e,  0x6e,  0x65,  0x74,  0x22,  
 0x3e,  0x53,  0x75,  0x6b,  0x6b,  0x6f,  0x50,  0x65,  
 0x72,  0x61,  0x3c,  0x2f,  0x61,  0x3e,  0x3c,  0x2f,  
 0x68,  0x33,  0x3e,  0x3c,  0x68,  0x34,  0x3e,  0x54,  
 0x68,  0x69,  0x73,  0x20,  0x70,  0x72,  0x6f,  0x67,  
 0x72,  0x61,  0x6d,  0x20,  0x63,  0x6f,  0x6d,  0x65,  
 0x73,  0x20,  0x77,  0x69,  0x74,  0x68,  0x20,  0x41,  
 0x42,  0x53,  0x4f,  0x4c,  0x55,  0x54,  0x45,  0x4c,  
 0x59,  0x20,  0x4e,  0x4f,  0x20,  0x57,  0x41,  0x52,  
 0x52,  0x41,  0x4e,  0x54,  0x59,  0x2e,  0x20,  0x54,  
 0x68,  0x69,  0x73,  0x20,  0x69,  0x73,  0x20,  0x66,  
 0x72,  0x65,  0x65,  0x20,  0x73,  0x6f,  0x66,  0x74,  
 0x77,  0x61,  0x72,  0x65,  0x2c,  0x20,  0x61,  0x6e,  
 0x64,  0x20,  0x79,  0x6f,  0x75,  0x20,  0x61,  0x72,  
 0x65,  0x20,  0x77,  0x65,  0x6c,  0x63,  0x6f,  0x6d,  
 0x65,  0x20,  0x74,  0x6f,  0x20,  0x72,  0x65,  0x64,  
 0x69,  0x73,  0x74,  0x72,  0x69,  0x62,  0x75,  0x74,  
 0x65,  0x20,  0x69,  0x74,  0x20,  0x75,  0x6e,  0x64,  
 0x65,  0x72,  0x20,  0x63,  0x65,  0x72,  0x74,  0x61,  
 0x69,  0x6e,  0x20,  0x63,  0x6f,  0x6e,  0x64,  0x69,  
 0x74,  0x69,  0x6f,  0x6e,  0x73,  0x3b,  0x20,  0x3c,  
 0x61,  0x20,  0x68,  0x72,  0x65,  0x66,  0x3d,  0x22,  
 0x68,  0x74,  0x74,  0x70,  0x3a,  0x2f,  0x2f,  0x77,  
 0x77,  0x77,  0x2e,  0x67,  0x6e,  0x75,  0x2e,  0x6f,  
 0x72,  0x67,  0x2f,  0x6c,  0x69,  0x63,  0x65,  0x6e,  
 0x73,  0x65,  0x73,  0x2f,  0x67,  0x70,  0x6c,  0x2d,  
 0x33,  0x2e,  0x30,  0x2e,  0x68,  0x74,  0x6d,  0x6c,  
 0x22,  0x3e,  0x63,  0x6c,  0x69,  0x63,  0x6b,  0x20,  
 0x68,  0x65,  0x72,  0x65,  0x3c,  0x2f,  0x61,  0x3e,  
 0x20,  0x66,  0x6f,  0x72,  0x20,  0x64,  0x65,  0x74,  
 0x61,  0x69,  0x6c,  0x73,  0x2e,  0x3c,  0x2f,  0x68,  
 0x34,  0x3e,  0x3c,  0x68,  0x72,  0x2f,  0x3e,  0x3c,  
 0x68,  0x32,  0x3e,  0x4c,  0x65,  0x64,  0x20,  0x43,  
 0x6f,  0x6e,  0x74,  0x72,  0x6f,  0x6c,  0x3c,  0x2f,  
 0x68,  0x32,  0x3e,  0x3c,  0x66,  0x6f,  0x72,  0x6d,  
 0x20,  0x6d,  0x65,  0x74,  0x68,  0x6f,  0x64,  0x3d,  
 0x22,  0x67,  0x65,  0x74,  0x22,  0x3e,  0x3c,  0x69,  
 0x6e,  0x70,  0x75,  0x74,  0x20,  0x74,  0x79,  0x70,  
 0x65,  0x3d,  0x22,  0x72,  0x61,  0x64,  0x69,  0x6f,  
 0x22,  0x20,  0x6e,  0x61,  0x6d,  0x65,  0x3d,  0x22,  
 0x73,  0x74,  0x61,  0x74,  0x65,  0x22,  0x20,  0x76,  
 0x61,  0x6c,  0x75,  0x65,  0x3d,  0x22,  0x6f,  0x6e,  
 0x22,  0x20,  0x23,  0x53,  0x54,  0x5f,  0x4f,  0x4e,  
 0x5f,  0x43,  0x48,  0x4b,  0x23,  0x2f,  0x3e,  0x4f,  
 0x4e,  0x3c,  0x62,  0x72,  0x20,  0x2f,  0x3e,  0x3c,  
 0x69,  0x6e,  0x70,  0x75,  0x74,  0x20,  0x74,  0x79,  
 0x70,  0x65,  0x3d,  0x22,  0x72,  0x61,  0x64,  0x69,  
 0x6f,  0x22,  0x20,  0x6e,  0x61,  0x6d,  0x65,  0x3d,  
 0x22,  0x73,  0x74,  0x61,  0x74,  0x65,  0x22,  0x20,  
 0x76,  0x61,  0x6c,  0x75,  0x65,  0x3d,  0x22,  0x6f,  
 0x66,  0x66,  0x22,  0x20,  0x23,  0x53,  0x54,  0x5f,  
 0x4f,  0x46,  0x46,  0x5f,  0x43,  0x48,  0x4b,  0x23,  
 0x2f,  0x3e,  0x4f,  0x46,  0x46,  0x3c,  0x62,  0x72,  
 0x20,  0x2f,  0x3e,  0x3c,  0x62,  0x72,  0x20,  0x2f,  
 0x3e,  0x3c,  0x69,  0x6e,  0x70,  0x75,  0x74,  0x20,  
 0x74,  0x79,  0x70,  0x65,  0x3d,  0x22,  0x73,  0x75,  
 0x62,  0x6d,  0x69,  0x74,  0x22,  0x20,  0x76,  0x61,  
 0x6c,  0x75,  0x65,  0x3d,  0x22,  0x53,  0x65,  0x74,  
 0x22,  0x20,  0x2f,  0x3e,  0x3c,  0x2f,  0x66,  0x6f,  
 0x72,  0x6d,  0x3e,  0x3c,  0x2f,  0x62,  0x6f,  0x64,  
 0x79,  0x3e,  0x3c,  0x2f,  0x68,  0x74,  0x6d,  0x6c,  
 0x3e,  0x00
};

// unsigned int index_html_len = 690;

... Ernesto ... STUDIA i documenti che accompagnano la lib ... quella è la pagina HTML che viene messa nella flash (...e che ti appare sul browser) ed è fatta con l'apposita utility in python !

Il thread della libreria te lo devi leggere e studiare TUTTO perché, nel tempo ci sono state correzioni, suggerimenti, nuove funzionalità, spiegazioni, ecc, ecc, e ... qui la "pappa fatta" NON te la da nessuno, quindi ... impiega bene il tempo studiando il tutto e, SOLO DOPO, poni le domande giuste nel thread della libreria.

Guglielmo

gpb01:
... Ernesto ... STUDIA i documenti che accompagnano la lib ... quella è la pagina HTML che viene messa nella flash (...e che ti appare sul browser) ed è fatta con l'apposita utility in python !

Il thread della libreria te lo devi leggere e studiare TUTTO perché, nel tempo ci sono state correzioni, suggerimenti, nuove funzionalità, spiegazioni, ecc, ecc, e ... qui la "pappa fatta" NON te la da nessuno, quindi ... impiega bene il tempo studiando il tutto e, SOLO DOPO, poni le domande giuste nel thread della libreria.

Guglielmo

Ancora non avevo scritto niente...

Scusate ma ora questa è una curiosità mia…
Da dove capite che questo codice non può girare su arduino?

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;

// Replace with your network credentials
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

ESP8266WebServer server(80);

String webPage = "";

int gpio13Led = 13;
int gpio12Relay = 12;

void setup(void){
  webPage += "<h1>SONOFF Web Server</h1><p><a href=\"on\"><button>ON</button></a>&nbsp;<a href=\"off\"><button>OFF</button></a></p>";  
  // preparing GPIOs
  pinMode(gpio13Led, OUTPUT);
  digitalWrite(gpio13Led, HIGH);
  
  pinMode(gpio12Relay, OUTPUT);
  digitalWrite(gpio12Relay, HIGH);
 
  Serial.begin(115200); 
  delay(5000);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
  
  server.on("/", [](){
    server.send(200, "text/html", webPage);
  });
  server.on("/on", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio13Led, LOW);
    digitalWrite(gpio12Relay, HIGH);
    delay(1000);
  });
  server.on("/off", [](){
    server.send(200, "text/html", webPage);
    digitalWrite(gpio13Led, HIGH);
    digitalWrite(gpio12Relay, LOW);
    delay(1000); 
  });
  server.begin();
  Serial.println("HTTP server started");
}
 
void loop(void){
  server.handleClient();
}

Dal fatto che le librerie incluse sono per ESP8266 e non per Arduino, inteso come scheda.

Ma infatti devo collegare arduino uno con un esp8266-esp01

... te lo ripeto... SONO PER ESP8266 e girano dentro l'ESP8266 stand-alone (es. NodeMCU)!

L'ESP8266 ha una sua MCU totalmente incompatibile con quella di Arduino, per cui, librerie scritte specificatamente per girare dentro ad esso, NON girano su una MCU AVR.

Guglielmo

Per rendere il tutto meno costoso ho deciso di utilizzare un nodemcu Lua ESP8266, che su aliexpress costa 2€ :slight_smile: . Il codice va bene quelli che ho postato io all'inizio.

Visto che i NodeMcu Lua, funzionano a 3,3V, dovrei prendere una scheda relay da quattro relay, in quanto i faretti sono 4 e fare qualche modifica al codice.

I relay funzionano a 5V però, naturalmente alimentazione esterna e optoisolati. Il mio dubbio ora è: NodeMcu Lua può comandare questi relay?