Buon pomeriggio a tutti, sono un nuovo utente e non so come muovermi sul forum, avrei necessita di un vostro aiuto per sistemare un codice, mi sfugge qualche cosa che non riesco ad individuare. Potete aiutarmi se posto il codice?
Buongiorno,
prima di tutto, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ...
... poi, ho separato il tuo post messo in un altro thread ed ho creato un nuovo thread per il tuo problema. DOPO che avrai fatto quanto sopra indicato, spiegaci quale è il problema che incontri e con quale scheda così ... vedremo se va bene un thread separato o ci possiamo collegare ad un qualche cosa di esistente. Grazie.
Guglielmo
Presentazione fatta. Sto utilizzando un ESP8260 wifi per realizzare un dispositivo che disalimenti e rialimenti il mio router 4G nel caso in cui non risponda a più ping verso un server, ho preso spunto da un progetto trovato in rete. Il codice funziona in parte, pinga il server, se per 5 volte fallisce il ping, manda alto lo stato di un pin eccita il rele e toglie alimentazione, dopo pochi secondi dovrebbe mandare basso lo stesso pin e diseccitare il rele, facendo ripartire il ciclo di ping, ed è proprio questo non fa. Non rimanda basso lo stato del pin e quindi il router resterebbe spento.
Metti qui il codice che stai utilizzando e vediamo (mi raccomando, come da regolamento, il codice, una volta inserito va TUTTO selezionato e va premuta l'icona </> nella barra degli strumenti per contrassegnarlo, appunto come codice. Inoltre, affinché sia ben leggibile, esso deve essere correttamente "indentato" ... questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'interno del IDE) ...
Guglielmo
il codice:
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
const char* WIFI_SSID = "XXXX"; // Your SSID
const char* WIFI_PWD = "XXXX"; // Your WiFi Password
const char* Remote_Host = "8.8.8.8"; // Ping www.google.com
#define RELAY D0
#define LED1 D1
#define LED2 D2
#define LED3 D3
#define LED4 D5
#define LED5 D7
int random_n = 1;
int ctr_main = 1;
int fail_count = 0; // Increments if ping fails
int reset_timer = 90;
void setup() {
Serial.begin(115200);
delay(10);
/** Define the pin modes **/
pinMode(RELAY, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
/** We start by connecting to a WiFi network **/
WiFi.begin(WIFI_SSID, WIFI_PWD);
Serial.println(); Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
};
Serial.println(); Serial.print("My IP : "); Serial.println(WiFi.localIP());
};
void loop() {
/** Successful Pings **/
if ( pingTest() && (fail_count < 5) ) { // If a successful ping is received
fail_count = 0; // Reset the fail count
digitalWrite(LED2, LOW); digitalWrite(LED4, LOW); // Turn off all red LEDs
random_n = random(1, 4); // Generate a random number
switch(random_n){ // Pick a patter to display
case 1: pattern_blue1(); break;
case 2: pattern_blue2(); break;
case 3: pattern_blue3(); break;
};
} else { // If ping test fails - increment the fail_count
fail_count++;
if ( fail_count < 5 ){
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
digitalWrite(LED2, HIGH); digitalWrite(LED4, LOW);
delay(200);
digitalWrite(LED2, LOW); digitalWrite(LED4, HIGH);
delay(200);
digitalWrite(LED2, HIGH); digitalWrite(LED4, HIGH);
};
};
/** Ping Completely Failed **/
if ( fail_count >= 5 ) { // Reset the router when more than 5 ping fails
if ( ctr_main <= reset_timer ) { pattern_red( ctr_main ); ctr_main++; };
if ( ctr_main > reset_timer ) { ctr_main = 1; fail_count = 0; };
};
};
/** Function that performs the ping test **/
bool pingTest(){
Serial.print("Pinging host : "); Serial.println(Remote_Host);
if(Ping.ping(Remote_Host, 2)) { // Ping the remote host with two ping requests
Serial.println("Success!!");
return true;
} else {
Serial.println("Error :(");
return false;
};
};
/** Function that is called in an event of loss of ping **/
int pattern_red( int ctr ){
// Disconnect the circuit for few seconds
if ( ctr == 1 ) { digitalWrite(RELAY, HIGH); };
if ( ctr == 10 ) { digitalWrite(RELAY, LOW); };
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
digitalWrite(LED2, LOW); digitalWrite(LED4, LOW);
delay(400);
digitalWrite(LED2, HIGH); digitalWrite(LED4, HIGH);
};
/** Blue Patterns **/
void pattern_blue1(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED5, HIGH);
if ( i == 5 ) break;
delay(400);
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
delay(400);
i++;
} while( true );
};
void pattern_blue2(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED5, HIGH);
delay(400);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
if ( i == 5 ) break;
delay(400);
i++;
} while( true );
};
void pattern_blue3(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, HIGH);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
if ( i == 5 ) break;
delay(200);
i++;
} while( true );
};
Nessuno del forum sa darmi qualche suggerimento?
Ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo DOPO almeno 48 ore dall'ultimo post. Grazie.
Guglielmo
Ma lo sketch è tuo o è copiaincollato da qualche parte?
Perché è tutto pieno di parentesi graffe chiuse con un ; cosa che non ha alcun senso.
Comunque a parte questo, lo sketch fa quel che deve correttamente.
Il relè che stai usando è adatto per essere pilotato con un esp8266, che ti ricordo funziona con livello di tensione 3.3V???
Prova ad alimentare la scheda relè con i 5V separati se la tua board lo consente (in caso positivo c'è un jumper Jd-Vcc)
Prendo in prestito un'immagine che riciccia spesso nel forum, modificata per l'occasione.
Intanto grazie per la risposta. Il modulo relè è alimentato con 5vcc come indicato da te nello schema postato.
Il relè viene utilizzato come NC, quando
Il ping fallisce manda il pin D0 alto, ed eccita il relè. Dopo quel pin dovrebbe andare basso ma ciò non avviene e tutto si firme li.
Io ho provato il tuo codice togliendo i ; inutili e aggiungendo un Serial.println("high") e un Serial.print("low") al posto del relè per praticità.
Quando disattivo il traffico dati allo smartphone usato come AP, viene stampato correttamente high sul monitor seriale e dopo un po' viene stampato anche low (circa 10 secondi).
Riesci a postarlo con le tue correzioni, cosi lo provo, ovviamente se il regolamento lo consente. Sono alle prime armi e non vorrei sbagliarmi.
Io lo stato del D0 per essere certo l’ho letto con un tester e rimane alto.
Ho ricablato il relé su D4 che sulla board Wemos D1 mini corrisponde al LED built-in il quale è attivo basso proprio come i relè che stai usando (sul livello HIGH il led si spegne).
#include <ESP8266WiFi.h>
#include <ESP8266Ping.h>
const char* WIFI_SSID = "xxxxxxx"; // Your SSID
const char* WIFI_PWD = "xxxxxxx"; // Your WiFi Password
const char* Remote_Host = "8.8.8.8"; // Ping www.google.com
#define RELAY D4
#define LED1 D1
#define LED2 D2
#define LED3 D3
#define LED4 D5
#define LED5 D7
int random_n = 1;
int ctr_main = 1;
int fail_count = 0; // Increments if ping fails
int reset_timer = 90;
void setup() {
Serial.begin(115200);
delay(10);
/** Define the pin modes **/
pinMode(RELAY, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
/** We start by connecting to a WiFi network **/
WiFi.begin(WIFI_SSID, WIFI_PWD);
Serial.println(); Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(); Serial.print("My IP : "); Serial.println(WiFi.localIP());
}
void loop() {
/** Successful Pings **/
if ( pingTest() && (fail_count < 5) ) { // If a successful ping is received
fail_count = 0; // Reset the fail count
digitalWrite(LED2, LOW); digitalWrite(LED4, LOW); // Turn off all red LEDs
random_n = random(1, 4); // Generate a random number
switch(random_n){ // Pick a patter to display
case 1: pattern_blue1(); break;
case 2: pattern_blue2(); break;
case 3: pattern_blue3(); break;
};
} else { // If ping test fails - increment the fail_count
fail_count++;
if ( fail_count < 5 ){
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
digitalWrite(LED2, HIGH); digitalWrite(LED4, LOW);
delay(200);
digitalWrite(LED2, LOW); digitalWrite(LED4, HIGH);
delay(200);
digitalWrite(LED2, HIGH); digitalWrite(LED4, HIGH);
}
}
/** Ping Completely Failed **/
if ( fail_count >= 5 ) { // Reset the router when more than 5 ping fails
if ( ctr_main <= reset_timer ) { pattern_red( ctr_main ); ctr_main++; }
if ( ctr_main > reset_timer ) { ctr_main = 1; fail_count = 0; }
}
}
/** Function that performs the ping test **/
bool pingTest(){
Serial.print("Pinging host : "); Serial.println(Remote_Host);
if(Ping.ping(Remote_Host, 2)) { // Ping the remote host with two ping requests
Serial.println("Success!!");
return true;
} else {
Serial.println("Error :(");
return false;
}
}
/** Function that is called in an event of loss of ping **/
void pattern_red( int ctr ){
// Disconnect the circuit for few seconds
if ( ctr == 1 ) { digitalWrite(RELAY, HIGH); Serial.println("RELAY HIGH");}
if ( ctr == 10 ) { digitalWrite(RELAY, LOW); Serial.println("RELAY LOW"); }
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
digitalWrite(LED2, LOW); digitalWrite(LED4, LOW);
delay(400);
digitalWrite(LED2, HIGH); digitalWrite(LED4, HIGH);
}
/** Blue Patterns **/
void pattern_blue1(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED5, HIGH);
if ( i == 5 ) break;
delay(400);
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
delay(400);
i++;
} while( true );
}
void pattern_blue2(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED5, HIGH);
delay(400);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
if ( i == 5 ) break;
delay(400);
i++;
} while( true );
}
void pattern_blue3(){
int i = 0;
do{
digitalWrite(LED1, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED5, LOW);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, LOW); digitalWrite(LED5, HIGH);
delay(200);
digitalWrite(LED1, LOW); digitalWrite(LED3, HIGH); digitalWrite(LED5, LOW);
if ( i == 5 ) break;
delay(200);
i++;
} while( true );
}
Grazie mille, il problema era aver messo per il pilotaggio del relè il pin D0, con il D4 funziona tutto.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.