TinyWebServer BlinkLed - ampliare i comandi e attivare 6 o + led

pablos71:
ciao
Non sei il primo che fa questa domanda, non hai cercato bene :slight_smile:

google "tinywebserver multiple led"

comunque qui hai un post che risponde alla tua domanda, ma se come dici non sei pratico di programmazione, hai scelto la cosa piu' difficile che c'era Arduino Forum

ciao

ecco, lo immaginavo, eppure ho cercato un bel po!
Comunque non sembra difficile, pensa che la libreria l'avevo gia modificata e non mi dava errore, l'ho confrontata ed è identica, con la differenza che io ci avevo messo 6 led. Spero di riuscire a modificare anche i file main.js e index.htm. Domani mi metto a lavoro.
Grazie per l'aiuto

BaBBuino:
Cerca il post Domo-BaBBuino

Ho fatto quello che chiedi, senza usare la libreria TinyWebServer, ma usando la libreria ufficiale dell'Ethernet Shield.

Dammi un pò di tempo che pulisco il codice e lo posto.

Questo è quello che puoi pilotare:

Delle luci in PWM con accensione e spegnimento Soft (ma magari non tiinteressa)
Simulazione pulsanti a camme di On/Off
Acquisizione temperatura in gradi Celsius
Acquisizione umidità in % relativa
Acquisizione LUMINOSITà IN LUX

Adesso sto vedendo di implementare degli slider simil-analogici, e il tutto tramite Web Browser

Questo mi sembra molto interessante, se posti il codice te ne sarò grato.

pablos71:
Babbuino, non hai capito, lui vuol fare questo con 6 leds

Arduino Tiny Web Server - BlinkLED project - YouTube

si, in effetti è questo che vorrei fare, ma anche il progetto di Babbuino mi sembra molto più semplice e funzionale. Se nascono altre idee io le provo tutte, Arduino mi sta entrando nel sangue, ho già acquistato la guida ufficiale di Banzi e gli sto dando un occhiata.
Grazie

pablos71:
Babbuino, non hai capito, lui vuol fare questo con 6 leds

Arduino Tiny Web Server - BlinkLED project - YouTube

E secondo te con lo scheletro del mio non accende 6 Led? Ne accende 600 in 10 maniere diverse. In più può governare diversi sensori (nonchè imparare a farlo) ed eventualmente variare la luminosità di detti led.

Ti pare non congruo a quanto ha chiesto? XD

no non è congruo, perchè a tutt'oggi non hai capito qual'è la differenza tra il tuo e il tiny che possiede un socket :slight_smile:
questo non significa che non va bene, sono 2 cose diverse.

Ma secondo te il punto cruciale della questione sono i socket? :roll_eyes:

Bhe, ho approfondito il link che mi ha postato pablos e mi sa che non riuscirò ad andare avanti, non è nelle mie capacità, per ora.
Comunque sia, sono andato a vedere il progetto di Babbuino e devo dire che lo trovo veramente interessante.
Babbuino, appena puoi posta il progetto.
Grazie

Non so cosa dirti .... possiamo litigare come 2 findanzatini fino all'alba se vuoi ahahahahhahahaha :smiley: :smiley: :smiley:

Ducker:
Bhe, ho approfondito il link che mi ha postato pablos e mi sa che non riuscirò ad andare avanti, non è nelle mie capacità, per ora.
Comunque sia, sono andato a vedere il progetto di Babbuino e devo dire che lo trovo veramente interessante.
Babbuino, appena puoi posta il progetto.
Grazie

Ripassa domani sera o dopodomani sera. Mi serve un'oretta di tempo per renderlo presentabile e con un pò di commenti.

Intanto cerca di capire le modalità di infilare una pagina HTML dentro l'Arduino attraverso la direttiva PROGMEM, oppure tramite una struttura sequenziale di semplici client.println().

Nel mio caso è una soluzione ibrida. Sono partito dalla PROGMEM e sono finito con il dover utilizzare anche pezzi con client.println()

BaBBuino:

Ducker:
Bhe, ho approfondito il link che mi ha postato pablos e mi sa che non riuscirò ad andare avanti, non è nelle mie capacità, per ora.
Comunque sia, sono andato a vedere il progetto di Babbuino e devo dire che lo trovo veramente interessante.
Babbuino, appena puoi posta il progetto.
Grazie

Ripassa domani sera o dopodomani sera. Mi serve un'oretta di tempo per renderlo presentabile e con un pò di commenti.

Intanto cerca di capire le modalità di infilare una pagina HTML dentro l'Arduino attraverso la direttiva PROGMEM, oppure tramite una struttura sequenziale di semplici client.println().

Nel mio caso è una soluzione ibrida. Sono partito dalla PROGMEM e sono finito con il dover utilizzare anche pezzi con client.println()

Eccomi, allora, vediamo se ho studiato correttamente!
Babbuino, se ho ben capito la direttiva PROGMEM scrive direttamente nella flash di arduino, nel nostro caso le nostre paginette che visualizzeremo dal nostro client che possa essere un pc o altro, mentre i client.println() servono per scrivere sul browser del client quello che viene comandato dal codice client.print()?
Scusatemi se faccio un po di confusione, ma inizio ora e vi vengono tanti dubbi, quindi se scrivo cretinate correggetemi senza pietà! hehehehe

Grazie

Ducker:
Eccomi, allora, vediamo se ho studiato correttamente!
Babbuino, se ho ben capito la direttiva PROGMEM scrive direttamente nella flash di arduino, nel nostro caso le nostre paginette che visualizzeremo dal nostro client che possa essere un pc o altro, mentre i client.println() servono per scrivere sul browser del client quello che viene comandato dal codice client.print()?
Scusatemi se faccio un po di confusione, ma inizio ora e vi vengono tanti dubbi, quindi se scrivo cretinate correggetemi senza pietà! hehehehe

Grazie

Ciao,

un'alternativa è quella di lasciare la pagina web su un PC (o altro dispositivo) locale e caricare dall'Arduino solo i dati per animare la pagina grafica.

Saluti,
Dario.

Si, in effetti è molto più semplice installare un webserver su pc, in questo sono anche molto pratico, ma a questo punto arduino non ha più senso perché potrei comandare in remoto tutto tramite pc con altri accessori aggiuntivi hardware e software.
La comodità di Arduino, secondo me, è proprio quella che un piccolissimo hardware riesce a fare ciò che altrimenti sarebbe possibile solo con un pc, e forse fa anche molto di più, visto che non ne conosco tutte le capacità.
Ti ringrazio comunque

P.S.
riprendo correggendomi rispetto a quello che ho scritto in precedenza, che forse altro metodo che veseo mi fa notare, potrebbe essere quello di installare e sfruttare un webserver con un modem abilitato, visto che quest'ultimo comunque deve servire per lo scopo.
Veseo illuminaci

E' proprio quello in vantaggio: l'essere un Web Server autonomo, indipendente da tutto.

Lo apri te, un tuo amico, un cinese, un negro delle isole Andamane a 9.000 Km di distanza, con un iPad, Android, iPhone, PC, MAC, Solaris, Unix, Alpha, Windows 95, WinCE o anche da una TV che abbia un Web Browser!

BaBBuino:
E' proprio quello in vantaggio: l'essere un Web Server autonomo, indipendente da tutto.

Lo apri te, un tuo amico, un cinese, un negro delle isole Andamane a 9.000 Km di distanza, con un iPad, Android, iPhone, PC, MAC, Solaris, Unix, Alpha, Windows 95, WinCE o anche da una TV che abbia un Web Browser!

Buon giorno Babbuino.
...si ne sono sempre piu convinto è una invenzione veramente straordinaria.

Ducker:
Si, in effetti è molto più semplice installare un webserver su pc, in questo sono anche molto pratico, ma a questo punto arduino non ha più senso perché potrei comandare in remoto tutto tramite pc con altri accessori aggiuntivi hardware e software.
La comodità di Arduino, secondo me, è proprio quella che un piccolissimo hardware riesce a fare ciò che altrimenti sarebbe possibile solo con un pc, e forse fa anche molto di più, visto che non ne conosco tutte le capacità.
Ti ringrazio comunque

Non intendevo installare un webserver su un PC, il webserver resta arduino. Semplicemente la pagina può essere caricata in locale da un browser, scambiando con il webserver arduino solo i comandi HTTP per aggiornarne il contenuto.

Se usi TinyWebServer effettui due operazioni:

  • Caricare la pagina HTML statica,
  • Utilizzi delle chiamate AJAX al webserver (arduino) per animare la pagina statica.

Puoi saltare il primo passo, avendo la pagina direttamente sul PC.

TinyWebServer memorizza la pagina in una memoria flash, ma la libreria è comunque pesante.

Saluti,
Dario.

veseo:

Ducker:
Si, in effetti è molto più semplice installare un webserver su pc, in questo sono anche molto pratico, ma a questo punto arduino non ha più senso perché potrei comandare in remoto tutto tramite pc con altri accessori aggiuntivi hardware e software.
La comodità di Arduino, secondo me, è proprio quella che un piccolissimo hardware riesce a fare ciò che altrimenti sarebbe possibile solo con un pc, e forse fa anche molto di più, visto che non ne conosco tutte le capacità.
Ti ringrazio comunque

Non intendevo installare un webserver su un PC, il webserver resta arduino. Semplicemente la pagina può essere caricata in locale da un browser, scambiando con il webserver arduino solo i comandi HTTP per aggiornarne il contenuto.

Se usi TinyWebServer effettui due operazioni:

  • Caricare la pagina HTML statica,
  • Utilizzi delle chiamate AJAX al webserver (arduino) per animare la pagina statica.

Puoi saltare il primo passo, avendo la pagina direttamente sul PC.

TinyWebServer memorizza la pagina in una memoria flash, ma la libreria è comunque pesante.

Saluti,
Dario.

Scusami Dario, ma TinyWebServer non carica le pagine HTML poste nella micro sd sulla shield?

Si, scritto così non è chiaro, non facevo riferimento alla memoria flash dell'AVR ma a quella della SD.

Saluti,
Dario.

Per Duker: dopo cena provo a pulire il codice e a postartelo.

BaBBuino:
Per Duker: dopo cena provo a pulire il codice e a postartelo.

Ok, se riesci sono qui
Grazie

Vai, ci provo ora. Torna tra un quarto d'ora...

Questa è una versione intermedia. Ci metto 200 anni a ripulirlo tutto. Guardalo bene e chiedimi di volta in volta cosa non capisci.

#include <LED.h>
#include <SPI.h>
//#include <WString.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>

//--------Sensore Digitale Temperatura e Umidità


#define DHT11_PIN 4      // ADC0

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
    delayMicroseconds(30);
    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish
    }
    return result;
}
//--------Fine Sensore T&H


//prog_char string_0[] PROGMEM = "<form><html><body><h2>Controllo Salotto</h2><font size= 4><form method=GET>";
//prog_char string_0[] PROGMEM = "<html><body><h2>Controllo Salotto</h2><font size= 4><form method=GET>";
prog_char string_0[] PROGMEM = "";
prog_char string_1[] PROGMEM = "<tr><td><input type=submit name=b1 value=Luce_1></td><td>";
prog_char string_2[] PROGMEM = "<tr><td><input type=submit name=b2 value=Luce_2></td><td>";
prog_char string_3[] PROGMEM = "<tr><td><input type=submit name=b3 value=Luce_3></td><td>";
prog_char string_4[] PROGMEM = "<tr><td><input type=submit name=b4 value=AUX></td><td>";
prog_char string_5[] PROGMEM = "<tr><td><input type=submit name=Up value=Alza&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp></td><td>";
//<tr><td><input type=submit name=Stop value=Stop&nbsp&nbsp&nbsp></td><td>";
prog_char string_6[] PROGMEM = "<tr><td><input type=submit name=Down value=Abbassa></td><td>";
prog_char string_7[] PROGMEM = "</form>";
//prog_char string_7[] PROGMEM = "</form>";
prog_char string_8[] PROGMEM = "<img src='data:image/gif;base64,R0lGODlhEAAQALMAABgDBKyqrHV2dZUCBOnf3X8CBPsCBCIhIvwWFPz9/L27vfbu7BUSE/kSFPwgILS1tCH5BAAAAAAALAAAAAAQABAAAwR5MEnJqp04sSO6eM/BZFwHnECgKMfEmEAjG6c6JhxgOEtCNAYaS2Pi+YDB1KMiiPUIjmCwAFAwY76odEAliJoNAkIa5AK8jIAOuTUvRA812TAwE944ha5cL1DxGgpqAH5+JwQaEwcrgwAMdzgZGysElW83GRobB5wZEQA7'/>";
//prog_char string_8[] PROGMEM = "<img src=data:image/gif;base64,R0lGODlhEAAQAKIAAAD/AACGAISGhMbHxv///wAAAAAAAAAAACwAAAAAEAAQAAADUEiq1b6QNEHFGC2W6srFyyY0QAk0V8GM5WJ6qlgA7ptuc20GME4TplKAJ/EBg4BhDIYUKosp5JAokWB2U6LKiilkM1XGpxPSeAYQcKRIhiQAADs= alt=Acceso ></td><td>";
prog_char string_9[] PROGMEM = "<img src=data:image/gif;base64,R0lGODlhEAAQAKIAAP////f398DAwICAgAAAAAAAAAAAAAAAACwAAAAAEAAQAAADTRiq1L4wtEGHEC2S6sjFyzY0H+aB0ngB7OcRqcoC5Tl5cymot9CWFAKgR9MFhy/dhYO8nD7MoQQDrYykU5O1wYIxXI6ZN3SaISPkTiQBADs= alt=Spento ></td><td>";
prog_char string_10[] PROGMEM = "";
//prog_char string_10[] PROGMEM = "</form></body></html>";
prog_char string_11[] PROGMEM = "";
//prog_char string_11[] PROGMEM = "<meta http-equiv=refresh content=5 >";
prog_char string_12[] PROGMEM = "";
prog_char string_13[] PROGMEM = "Sensore Finestra";

PROGMEM const char *string_table[] = // change "string_table" name to suit
{
string_0,
string_1,
string_2,
string_3,
string_4,
string_5,
string_6,
string_7,
string_8,
string_9,
string_10,
string_11,
string_12,
string_13,
};

char buffer[400]; // make sure this is large enough for the largest string it must hold

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 4 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

String inString = String(50);

Server server(8000);

LED led1 = LED(3);
LED led2 = LED(4);
LED led3 = LED(5);
LED led4 = LED(6);

LED led5 = LED(1);
LED led6 = LED(2);
//LED led7 = LED(8);
//LED led8 = LED(9);

String msg="";
//int tam=0;
int st1=9,st2=9,st3=9,st4=9,st5=9,st6=9;//,st7=9,st8=9;
//--------------------------------------------------
//int outPin = 9; // pin attuatore
//char link[]="http://www.giannifavilli.it"; //link
String readString; //string
boolean LEDON = false; // flag status attuatore
 
/*termistore
float temp; // variabile da calcolare
float tempPin = 2;   // pin analogico IN temperature sensor*/
int tempreg = 22; // temperatura di controllo in celsius
/*end termistore*/
 
/*fotoresistore*/
int light; // variabile da calcolare
int photoresistor = 3; // pin analogico IN fotoresistore
/*end fotoresistore*/

//-----------------------------------------------------
// Sensore Infrarossi
int SensoreIn = 7;
//int SensoreOut = 6;
int valSens;
boolean SensoreToggle=true;
//---------------------------------------
//Sensore Magnetico
int Finestra = 8;
int valFin;

void setup()
{
//----Sensore T&H
 DDRC |= _BV(DHT11_PIN);
 PORTC |= _BV(DHT11_PIN);
 
//-----Fine Sensore T&H
  
Serial.begin(9600);
Ethernet.begin(mac, ip,gateway,subnet);
server.begin();
Serial.println("Serial READY");
Serial.println("Ethernet READY");
Serial.println("Server READY");

  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
//---------------------
//pinMode(outPin, OUTPUT);
//pinMode(ledPinlux, OUTPUT);

pinMode(Finestra, INPUT);
pinMode(SensoreIn, INPUT);
//pinMode(SensoreOut, OUTPUT);

//---------------------
}

void loop()
{
  
//----Sensore T&H
  byte dht11_dat[5];
  byte dht11_in;
  byte i;// start condition
	 // 1. pull-down i/o pin from 18ms
  PORTC &= ~_BV(DHT11_PIN);
  delay(18);
  PORTC |= _BV(DHT11_PIN);
  delayMicroseconds(40);
  DDRC &= ~_BV(DHT11_PIN);
  delayMicroseconds(40);
  
  dht11_in = PINC & _BV(DHT11_PIN);
  if(dht11_in)
  {
 //   Serial.println("dht11 start condition 1 not met");
    DDRC |= _BV(DHT11_PIN);
    PORTC |= _BV(DHT11_PIN);

    return;
  }
  delayMicroseconds(80);
  dht11_in = PINC & _BV(DHT11_PIN);
  if(!dht11_in)
  {
//    Serial.println("dht11 start condition 2 not met");
    DDRC |= _BV(DHT11_PIN);
    PORTC |= _BV(DHT11_PIN);

    return;
  }
  
  delayMicroseconds(80);// now ready for data reception
  for (i=0; i<5; i++)
  {dht11_dat[i] = read_dht11_dat();}

  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);
//  byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
//  if(dht11_dat[4]!= dht11_check_sum)
//  {
//    Serial.println("DHT11 checksum error");
//  }
//  Serial.print("Current humdity = ");
//  Serial.print(dht11_dat[0], DEC);
//  Serial.print(".");
//  Serial.print(dht11_dat[1], DEC);
//  Serial.print("%  ");
//  Serial.print("temperature = ");
//  Serial.print(dht11_dat[2], DEC);
//  Serial.print(".");
//  Serial.print(dht11_dat[3], DEC);
//  Serial.println("C  ");
  
//----Fine Sensore T&H
  
//-------------------Sensore Magnetico Finestra e Infrarossi
  valFin = digitalRead(Finestra);
  valSens = digitalRead(SensoreIn);
  
   

  //--------------------------------
  /*inizio calcolo temperatura*/
  //temp = ((5 * analogRead(tempPin) * 100.0 ) / 1024); // Codice ottimizzato
 // temp = analogRead(tempPin);           //read the value from the sensor
//  temp = (5.0 * temp * 100.0)/1024;
 
  /*
  (grazie giulio400 e jumpjack)
  volt = ( analogRead(tempPin) * 5) / 1024; // calcolo il valore letto e lo trasformo in valore di tensione
  temp = (volt - 0.5) * 100; // conversione MCP9700A
  */
  /*fine calcolo temperatura*/
 
  /*inizio luce*/
  light = analogRead(photoresistor);
  light = constrain(light, 0, 1023); // limiti dei valori tra 0 e 100
  //light = map(light, 0, 150, 255, 0);
  /*fine luce*/
 
 //-------------------Interruttore presenza
if (SensoreToggle == true){
  if (valSens == HIGH){
  //digitalWrite(SensoreOut, HIGH);
  led1.on();
  if(led1.getState()) st1=8;
  else st1=9;
  }
  else {    
//  digitalWrite(SensoreOut, LOW);   
  led1.off(); 
  
  if(led1.getState()) st1=8;
  else st1=9;  
  } 
}  
//--------------------------Start Client
Client client = server.available();

int led=0;
if (client) {

// an http request ends with a blank line
boolean current_line_is_blank = true;
while (client.connected()) {

if (client.available()) {

char c = client.read();
// if we've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so we can send a reply
if (inString.length() < 50){
inString.concat(c);

}
if (c == '\n' && current_line_is_blank) {
  
/*-------------------------------
  Serial.print(readString);
        if(readString.indexOf("L=1") > 0) {// lettura del valore se il LED si deve accendere
          // il led sarà acceso
          digitalWrite(outPin, HIGH); // accendo il led
          LEDON = true;
          Serial.print("ON pin ");
          Serial.println(outPin);
          }
          else
          {
          //il led sarà spento
          digitalWrite(outPin, LOW); //sengo il led
          LEDON = false;
          Serial.print("OFF pin ");
          Serial.println(outPin); }
//-------------------------------------*/
  
/* if(inString.indexOf("b1")>0)
{

led1.toggle();
if(led1.getState()) st1=8;
else st1=9;
led=1;
 }*/

  
 // else {led1.on();}