Ho provato a leggere guide sul deepsleep, a collegare D0 con RST ma non riesco a capire il problema.
Qualcuno riesce ad aiutarmi?
EDIT: per chi se lo chiedesse la variabile "SPENTO" non viene utilizzata in quanto pensavo fosse quello il problema e ho provato a cambiare da ESP.deepsleep(SPENTO); a ESP.deepSleep(40000000); ma non è cambiato niente.
Buongiorno e benvenuto nella sezione Italiana del forum,
cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazioneNELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto.
P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...
Mi era sfuggito che dovevo presentarmi! Comunque presentazione fatta!
Quanto al punto 15 ho letto e per quanto riguarda i miei progetti al momento non utilizzano correnti pericolose ma in ogni caso comprendo che è imprescindibile la sicurezza e quindi ovviamente mi assumo la responsabilità di quello che faccio.
Invece di resettarsi e svegliarsi dal deepsleep si blocca e rimane completamente inerte al punto che se da arduino IDE tento di caricare un nuovo sketch mi dice che lo vede collegato ma non riesce a dialogare.
Ho provato anche ad attendere molto oltre il tempo di deepsleep e niente, non si risveglia fino a che non disalimento o premo manualmente reset.
Se può essere utile ho estratto anche queste info:
Informazioni sul firmware:
21:04:29.552 -> Versione SDK: 2.2.2-dev(38a443e)
21:04:29.552 -> Chip ID: 9656400
21:04:29.552 -> Free heap: 49096 bytes
Per spiegare meglio il mio intento sarebbe che attualmente fa un deepsleep breve al solo scopo di effettuare debug ma l'idea sarebbe che poi quando comanderà effettivamente l'irrigazione vada in deepsleep a lungo per risparmiare energia e che quando si sveglia di fatto ripeta il ciclo iniziale come se venisse acceso in quel momento.
Schematizzando:
Power on--> ATTIVATO per 15 minuti --> SPENTO per 23 ore e 45 minuti --> RIPETI
Attenzione a non fare confusione perché il pin da collegare è il GPIO16, che nelle schede più comuni viene chiamato D0 (tipo nelle NodeMCU ad esempio), ma non è la stessa cosa di GPIO0 che invece è il pin che va tenuto basso per iniziare l'upload del flash.
Ti confermo che il mio ESP8266 è identico a quello che hai allegato e che ho collegato D0 a RST.
L'unica cosa che non ho capito è se una volta collegato D0 con RST devo includere nello sketch un comando per D0 dopo il deepsleep o è automatico in ogni caso con il collegamento D0-RST e lo sketch che ho allegato sopra da quella stringa e poi rimane "bloccato".
L'immagine del retro è al contrario ma si dovrebbe capire. In ogni caso il cavello è collegato al primo pin dall'alto D0 e al terzo pin dal basso del lato opposto RST
Devi impostare il GPIO0 di boot come ingresso ed abilitare il pullup, altrimenti rimane in uno stato indefinito e lo sketch non riparte.
Un altro errore è la scelta del tipo di variabile per ACCESO e SPENTO: un tipo int non può contenere un numero pari a 40*1000000, devi usare almeno un long meglio se unsigned.
Altro consiglio: visto che il wake dal deepsleep è di fatto un reset, la funzione loop() è inutile e per avere maggior chiarezza sul funzionamento dello sketch, ti conviene fare tutto nel setup() lasciando loop vuoto.
#include <ESP8266WiFi.h>
#include "ThingSpeak.h"
const char* ssid = "xxxxxx"; // your network SSID (name)
const char* password = "xxxxxxx"; // your network password
WiFiClient client;
unsigned long myChannelNumber = 2;
const char* myWriteAPIKey = "xxxxxxxxxxx";
const unsigned ACCESO = 20*1000; //900*1000; //accende per 15 minuti
const unsigned SPENTO = 40*1000000; //86100*1000; //spegne per 23 ore e 45 minut
void setup() {
pinMode(0, INPUT_PULLUP);
Serial.begin(115200); //Initialize serial
Serial.println("\n\nIniziamo!");
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client); // Initialize ThingSpeak
pinMode(13, OUTPUT);
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Attempting to connect");
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(ssid, password);
delay(5000);
}
Serial.println("\nConnected.");
}
digitalWrite(13, HIGH);
ThingSpeak.setField(1, 1);
Serial.println("ATTIVATO");
int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println("Channel update successful.");
} else {
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
delay(ACCESO);
digitalWrite(13, LOW);
ThingSpeak.setField(1, 0);
Serial.println("SPENTO");
x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
if (x == 200) {
Serial.println("Channel update successful.");
} else {
Serial.println("Problem updating channel. HTTP error code " + String(x));
}
ESP.deepSleep(SPENTO);
}
void loop() {
}
Modificato come da te suggerito ma niente... stesso identico comportamento di prima.
Tra l'altro non capisco nemmeno come mai nel monitor non mi appare "Serial.println("\n\nIniziamo!");" o meglio Iniziamo! ma parte direttamente da "Connected." forse ci vuole un delay in inizializzazione?
Ho provato anche a monitorare D0 col multimetro ed inizialmente sta a 3.2v circa e quando appare la scritta incomprensibile del reset va a 0v però a quel punto invece di resettare realmente si blocca e non esegue più nulla.
EDIT: Mi auto rispondo... subito dopo serial.begin ci vuole un delay(6000) altrimenti prima che il monitor funzioni è già andato avanti
Perdonami ma ti elenco alcune domande che magari sono idiote ma spero mi sopporterai:
Nel codice che mi hai suggerito mi dici:
pinMode(0, INPUT_PULLUP);
Perché non mettere
pinMode(16, WAKE_PULLUP);
A occhio essendo il GPIO16 anche se si chiama D0 pensavo che nel codice si dovesse seguire la numerazione GPIO ma mi sbaglio?
Inoltre ho trovato molte persone che discutono in vari topic tra chi usa INPUT_PULLUP e WAKE_PULLUP ma nessuno spiega esattamente perché l'uno o l'altro.
Grazie.
EDIT: Per risolvere eventuali dubbi ho cambiato libreria usando la nodeMCU 1.0 ESP-12E che supporta i nomi come stampati sulla scheda ma anche mettendo:
pinMode(D0, INPUT_PULLUP);
Sempre stesso errore... si arriva al risveglio, frase incomprensibile e freeze. Se premo il bottoncino di reset sulla board riparte come nulla fosse.
Hai provato lo sketch semplice semplice che ti ho allegato?
Se quello funziona (e premetto che a me funziona) puoi escludere problemi hardware.
Il problema del GPIO0 non ha nulla a che fare con il reset: se il GPIO0 rimane sullo stato LOW il microcontrollore non esegue il boot.
Il GPIO16 (D0) invece è il pin che esegue il reset al risveglio dal deepsleep (è un'uscita che invia un'impulso LOW da connettere al pin RST per far ripartire il micro).
Normalmente quando fai l'upload, ci pensa l'adattatore USB/TTL a fare il necessario per far ripartire il microcontrollore, ma sul reset dovuto al wakeup questa cosa evidentemente non succede (non me lo aspettavo nemmeno io, ma guardando l'esempio incluso nel core l'ho dedotto).
Per quanto riguarda la funzione pinMode() accetta INPUT, OUTPUT, INPUT_PULLUP e INPUP_PULLDOWN.
WAKE_PULLUP non ho idea di cosa sia e se/come è definito.
Leggi con attenzione il riquadro "MATTERS NEEDING ATTENTION"
Però quello che mi sembra strano leggendo anche l'immagine che hai scritto è che, usando il tuo sketch se misuro D0 con GND è per tutto il tempo a 3.2v e stesso cosa se misuro RST con GND sempre a 3.2v quindi sembrerebbe che D0 non va in "LOW" e quindi alla fine del deepsleep non resetta.
Allora controlla le connessioni, magari il jumper wire non fa bene contatto o qualche cretinata simile?
Questo è il mio con cui ho provato lo sketch. Si tratta di un Wemos perché non ho un NodeMCU al momento, ma il microcontrollore è lo stesso quindi non cambia nulla.
Ho messo il multimetro in continuità e me la trova tra D0 e RST, scollegando il jumper invece la continuità sparisce.
Quello che invece secondo me è anomalo è, correggimi se sbaglio, che D0 finito il deepsleep dovrebbe passare da 3.2v a 0v e invece rimane fisso a 3.2v sia col jumper che togliendo il jumper.
EDIT: mi correggo... se il jumper è collegato D0 rimane fisso a 3.2v; se il jumper NON è collegato alla fine del deepsleep va a 0v. Mi viene quindi da pensare che quando va LOW non riesca ad andare sufficientemente giù e RST lo tenga HIGH?
Con il multimetro non vedi molto perché l'impulso di reset dura pochi millisecondi.
Dovresti usare un oscilloscopio o al massimo un logic analyzer (ne esistono di economicissimi tipo questo di cui ti consiglio l'acquisto, magari insieme al kit di puntalini)
Ad ogni modo, a questo punto il problema è probabilmente hardware. Come dicevo prima, il Lolin ed il NodeMCU hanno lo stesso MCU vero, però alcune piccole differenze nel resto ci sono che a questo punto credo abbiano a che fare con il malfunzionamento che riscontri.
nRST è il pin di reset della MCU, in teoria se ci fosse sulla scheda R10 da 0 Ohm, il ponticello nemmeno servirebbe. Il problema è capire se il tuo clone risponde allo schema originale.
Il Wemos invece ha il pin RST connesso direttamente allo switch senza resistenza in serie ed il GPIO16 è lasciato disconnesso (quindi il ponticello è necessario).
Non so se ti può essere utile ma l'ho comprato QUI
Online ho trovato che altre persone che hanno avuto un problema simile hanno risolto con un transistor: in pratica collegando la base del transistor a GPIO16, il collettore a RST e il resistore di base a VCC.
Sinceramente mi rompe un po' fare tutto sto casino semplicemente per resettare. Mi sa che alla fine questo microcontrollore lo metto da parte e ne compro uno Wemos.