Go Down

Topic: Webbino - Server web "dinamico" per Arduino (Read 70869 times) previous topic - next topic

nero773

>SukkoPera Ho letto il tutorial, devo dire che è molto dettagliato. Penso che sia molto utile, soprattutto per un principiante (come me), consultarlo nel momento in cui si incontrano problemi o mentre si testano gli esempi per capire il funzionamento della libreria.
Sinceramente alcune cose non mi sono ancora chiare, ma per un qualsiasi informatico/programmatore saranno sicuramente dalle banalità è normale, capire come funziona la programmazione non è una passeggiata.
Se posso chiedo dei chiarimenti, nel momento in cui si ha una scheda senza SD (p.e. ESP32), e si vuole caricare il programma nell'ESP32 stesso, il codice seguente va omesso ?
Code: [Select]
Serial.print (F("Initializing SD card..."));
if (!sdStorage.begin (SD_SS)) {
Serial.println (F(" failed"));
while (42)
;
}
webserver.addStorage (sdStorage);
Serial.println (F(" done"));


La funzione Page Function limita ad 1 i pulsanti/tasti che possono essere messi in una pagina? Se si dovesse avere la necessità di mettere più pulsanti?

Spero di esserti stato utile. Buona serata

SukkoPera

#451
Jan 11, 2021, 11:19 pm Last Edit: Jan 11, 2021, 11:25 pm by SukkoPera
Grazie per avergli dato un'occhiata. Se pensi che ci sia qualcosa che posso rendere più chiaro, dimmi pure.

Se sei su una scheda senza SD, perché prendi del codice dall'esempio SDOnly? :) Parti da SimpleServer.

Quanto alla Page Function, non limita niente, sei libero di fare tutto quello che vuoi nella funzione, e dunque gesitre tutti i pulsanti che vuoi.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nero773

Quote
Se pensi che ci sia qualcosa che posso rendere più chiaro, dimmi pure.
Forse è proprio la parte della page function che non riesco ad afferrare. Quello che ho capito, da profano quale sono, è che la richiesta di apertura di quella pagina causa l'accensione del LED:
Code: [Select]
http://10.0.0.1/index.html?state=on

Invece (presumo che) il seguente codice si occupa di inviare al browser tutti gli stati delle variabili associate ad animazioni sulla pagina interessata, solo quando questa viene richiesta. 
Code: [Select]
HttpStatusCode 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);
}
}

return HTTP_OK;
}


Conseguentemente, cosa scatena la lettura dello stato di eventuali pulsanti barre o selettori?

gpb01

Conseguentemente, cosa scatena la lettura dello stato di eventuali pulsanti barre o selettori?
Nulla, tu devi preparare la tua pagina inserendo praticamente un "form" che, quando premi il tasto "send" viene inviato.
Nel "form" HTML puoi avere campi di testo, bottoni, ecc. ecc. tu riempi il tutto e poi invvi con un bottone "send" (o simile).

Però questo NON è webbino, queste sono le basi di come funziona HTML ed il metodo GET ... magari è meglio che approfondisci questi argomenti ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

Esatto, e la funzione ledToggle(), essendo la Page Function associata a index.html, viene chiamata quando il browser richiede tale pagina e si occupa di processare quel che l'utente ha inserito nel form e accende/spegne il led di conseguenza.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nero773

>SukkoPera ho visto nel tuo esempio LedControl della vecchia versione della libreria Webbino che la pagina html ha un unico form. La pagina che ho creato io per il mio utilizzo ha diversi form, ognuno assegnato ad un tasto e altri form nei quali cambia il colore di fondo in funzione di una variabile su ESP32. In sostanza ho dei pulsanti che comandano dei led, quando il led è acceso mi colora di giallo lo sfondo della cella dove è presente il tasto che altrimenti sarebbe grigia. Per il funzionamento di Webbino, è meglio avere un form che contiene tutti i pulsanti/animazioni o va bene come l'ho creato io?
E' un pò la stessa cosa che mi ha spiegato Guglielmo nel precedente post. Sembra che Webbino sia strutturato diversamente da come me lo aspettavo e non sia adatto a fare quello che vorrei farci.

>Guglielmo so che devo studiare, faccio il possibile nel (poco) tempo libero che ho. Occorre avere pazienza.

SukkoPera

#456
Jan 12, 2021, 05:13 pm Last Edit: Jan 12, 2021, 05:14 pm by SukkoPera
Webbino è strutturato per chiamare una tua funzione. Nella tua funzione, ribadisco, sei libero di fare quel che ti pare e piace, anche gestire i dati provenienti da form diversi, devi solo organizzarti per farlo. Mi vengono in mente due modi:
1. Ogni form ha come action una pagina diversa, quindi a quel punto nella PF associata a tale pagina avrai sempre e solo da processare i dati di quel singolo form. Brutto perché devi avere un sacco di pagine.

2. Ogni form ha un campo hidden con lo stesso nome e valore diverso, tipo:
Code: [Select]
<input type="hidden" id="form_id" value="form1" />

Un altro:
Code: [Select]
<input type="hidden" id="form_id" value="form2" />

E così via. A questo punto nella PF puoi facilmente capire quale form è stato cliccato:
Code: [Select]
char *form_id = request.get_parameter (F("form_id"));
if (strcmp_P (form_id, PSTR ("form1")) == 0) {
  // Inviato il form1
} else if (strcmp_P (form_id, PSTR ("form2")) == 0) {
  // Inviato il form2
} // ...


Spero di aver reso l'idea.

"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

gpb01

... e comunque, basta chiamare i vari campi dei form con identificativi univoci e te ne freghi da quale form arriva, sai comunque l'elemento e il contenuto.

Guglielmo
Search is Your friend ... or I am Your enemy !

nero773

#458
Jan 12, 2021, 11:38 pm Last Edit: Jan 12, 2021, 11:41 pm by nero773
Buonasera,
mi piacerebbe essere certo della fattibilità di quello che ho in testa di fare, di seguito lo sketch (va adattato all'ESP32) col quale vorrei comandare diversi punti luce in casa (24VDC) tramite pulsanti fisici, questo sketch fa accendi spegni con un click, poi, solo da luce accesa tenendo premuto avvia il fade che si ferma al rilascio del pulsante.

Code: [Select]
int PINpb1 = 2;
int LED1 = 3;
bool StatoPB1 = LOW;
bool onClick1 = LOW;
bool StatoPB1old = LOW;
volatile int Step1 =0;
int lumin1 = 0;
int increm = 2;
unsigned long Tpress1 = 0;


void setup() {
  Serial.begin(9600);
  pinMode(PINpb1, INPUT);
  pinMode(LED1, OUTPUT);
}

void loop() {
  Serial.print ("Click=  ");
  Serial.print (onClick1);
  Serial.print ("/    Step1=  ");
  Serial.println (Step1);
  StatoPB1 = digitalRead (PINpb1);
  analogWrite(LED1, lumin1);
    
  switch (Step1){
    case 0: Spento1(); break;
    case 1: Acceso1(); break;
  }
  if ((StatoPB1 == HIGH) && (StatoPB1old == LOW)) {
    unsigned long tempoH = millis();
    StatoPB1old = StatoPB1;
    Tpress1 = tempoH;}
  
  else if ((StatoPB1 == LOW) && (StatoPB1old == HIGH)) {
   unsigned long tempoL = millis();
   StatoPB1old = StatoPB1;
   Serial.print ("Tempo on  ");
   Serial.println (tempoL - Tpress1);
   if ((tempoL - Tpress1) <= 2000) {
     onClick1 = HIGH;
     Serial.print ("/    onClick1=  ");
     Serial.println (onClick1);
     Tpress1 = tempoL;}
  }
}

void Spento1() {
  if (onClick1) {
    Step1 = 1;
    lumin1 = 200;
    onClick1 = LOW;
  }
}

void Acceso1() {
  if (onClick1) {
        Step1 = 0;
        lumin1 = 0;
        onClick1 = LOW;
   }  
  else if (StatoPB1 && (millis() - Tpress1 > 2000)) {
    Fade();  
   }
}      
void Fade() {
  bool fadePause;
  int t1 = 0;
  Serial.println ("/  FADING  ");
  if (StatoPB1) {
    
    if (!fadePause) {
      lumin1 = lumin1 + increm;
      if (lumin1 <= 0 || lumin1 >= 255) {
        increm = -increm;
        fadePause =1;
        t1 = millis();
      }
   }
  if (fadePause && (millis()-t1 > 50)) {
    fadePause = 0;
  }
}
}



Tramite Webbino vorrei mettere in parallelo ai pulsanti fisici quelli sul browser solo però con la funzione accendi/spegni (no fade).
Vorrei capire se ho scelto una strada praticabile (da me) o se è meglio usare Blink, probabilmente più alla mia portata (in tempi ragionevoli).
Ho allegato anche la pagina html (modificando l'estensione in txt per poterlo allegare) dove ho inserito alcuni pulsanti e sto tentando di capire come rendere dinamico il colore di fondo della cella attorno al pulsante in funzione delle variabili di stato dei led(GET) .
Se avete anche suggerimenti per semplificare il lavoro sono benaccetti

SukkoPera

A fare, si può fare sicuro, e non è nemmeno particolarmente difficile secondo me. Per cambiare il colore devi usare un Replacement Tag, ovviamente.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nero773

In sostanza dici di trattare la proprietà colore di sfondo come una variabile? Se led acceso = Yellow se spento = Grey ?

SukkoPera

#461
Jan 13, 2021, 12:29 am Last Edit: Jan 13, 2021, 12:31 am by SukkoPera
No, dico che nell'HTML come colore devi mettere tipo $COLORE$ e poi nella funzione collegata a tale tag ritorni il colore giusto.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

gpb01

#462
Jan 13, 2021, 04:50 pm Last Edit: Jan 16, 2021, 05:46 pm by gpb01
Giusto come "info" ... ho appena fatto qualche piccola modifica alla libreria per farla girare su ...
... Teensy 4.1, ARM Cortex-M7 a 600 MHz ... viaggia come un missile  ;D ;D ;D

Tanto per dare un'idea delle performances ...


Speriamo possa far parte di una futura release di Webbino ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

#463
Jan 16, 2021, 05:42 pm Last Edit: Jan 16, 2021, 05:43 pm by SukkoPera
Ieri sera ho pubblicato la versione 0.9.97 di Webbino, da intendersi come una Release Candidate per la 1.0, per cui se qualcuno volesse provarla e segnalare eventuali bug, gliene sarò grato. Ho anche lavorato ulteriormente sulla documentazione, che trovate sul Wiki e che corrisponde a tale versione della libreria.

Sono include anche le modifiche citate da gpb01 per il supporto alla Teensy 4.1.

Dovreste già trovarla nel LIbrary Manager.

A meno di "showstopper bug", tra qualche giorno rilascerò finalmente la 1.0.0 definitiva.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nero773

Buonasera,
complimenti SukkoPera per l'ottimo lavoro che spero di usare appena sarò riuscito a capire il meccanismo.
Se posso vorrei chiedere aiuto sulle prove che sto facendo e che non mi riescono. Vista la difficoltà a far funzionare la precedente pagina index da me creata, ho fatto un passo indietro, ho preso e modificato la pagina index dell'esempio LedControl così:
Code: [Select]
<html>

<head>

  <meta id="_moz_html_fragment">

</head>

<body>

<br>

<form method="post"><input name="SALA" value="on" type="button"><br>

</form>

<br>

Led Control

<form method="get"> <input name="state" value="off" $st_off_chk$=""

 type="radio">OFF<br>

  <br>

  <input value="Set" type="submit"></form>

</body>

</html>


Ho tolto il set di accensione led rimpiazzandolo con un tasto nuovo appoggiandomi sulla stessa TAG.
Il mio intento è quello di creare un tasto che, mentre è premuto, mette una variabile bool nello sketch ad HIGH, nel caso dell'esempio accende il led fintato che il pulsante è premuto, al rilascio del pulsante il led si spegne.
Non capisco dove sbaglio. Spero possiate aiutarmi.
Grazie

Go Up