Sensors.requestTemperatures()-pag 3-rallenta molto il ciclo in wifi... perché?

si esatto, entrambi funzionano con IDE 22

ok, era un problema di loop.... forse ho risolto con due bei void ciclo1() e vois ciclowifi()

:slight_smile:

(il vostro aiuto comunque è stato fondamentale.... vi ricordo che studio legge, non informatica)

si devo dire che con l'espediente del void effettivamente ora funziona tutto però sembra molto rallentato nella comunicazione su web... ci mette parecchio a caricare le 2 righe html di "hallo Worl".

Inoltre ho notato che aggiungendo una riga alla pagina html e più precisamente un WiServer.write(((sensors.getTempCByIndex(0)))) praticamente non si connette nemmeno...

Qui penso si tratti proprio di ottimizzare il programma perché si inchioda da qualche parte...

E qui come si fa?!

Devi capire quale blocco di codice si mangia tutto quel tempo.
Io scommetto che un pò di colpa è della libreria DallasTemperature, del ds18b20 e di come le usi. :slight_smile:
Prova a far girare lo sketch senza però leggere la temperatura, dagli un numero fisso al posto della temperatura letta e vedi se i tempi migliorano.

..inoltre considera di ottimizzare il codice, inizia effettuando qualche verifica sull'utilizzo della memoria..

Grazie delle dritte... giocando ancora un po' con lo sketch sono arrivato a questo situazione: è tutto funzionante, il display mostra le info richieste ed il wifi crea la pagina web che viene tuttavia caricata in ben 8/10 secondi.

l'unica cosa che non sono ancora riuscito a fare è far mostrare su web una delle 3 temperature... questa è la parte di sketch relativa alla creazione della pagina:

// This is our page serving function that generates web pages
boolean sendMyPage(char* URL) {
  
  
    // Check if the requested URL matches "/"
    if (strcmp(URL, "/") == 0) {
        // Use WiServer's print and println functions to write out the page content
        sensors.requestTemperatures();
        WiServer.print("<html>");
        WiServer.print("Ciao!

");
        WiServer.print("Temperatura=");
        WiServer.write(((sensors.getTempCByIndex(1))));
        WiServer.print("°C");
        WiServer.print("</html>");
        
        // URL was recognized
        return true;
    }
    // URL not found
    return false;
}

penso sia sbagliata, mi confermate? devo forse inserire un sensors.requestTemperatures();?

anche io avevo pensato di ottimizzare il codice però non ho idea di come si possa fare.... per caso sapete se sul forum c'è un post riassuntivo o una guida che posso seguire? ho provato a dare un occhiata sul web stamattina ma non ho trovato un granché...

Ciao,
qui un paio di link con qualche tips:

mi ero salvato dei link al riguardo, appena li ritrovo li posto.

questa è bella... se inserisco la batteria all'rtc non riesco più a raggiungere l'ip di arduino... :0

o meglio, muore proprio il wifi.... si connette ma non rende la pagina web... ragazzi, il wifi è una cosa impossibile rispetto al programma

Sotto Google Code Archive - Long-term storage for Google Code Project Hosting.
trovate anche la libreria aggiornata per la wifi shield compatibile con Arduino IDE 1.0

La descrizione della shield su open-electronics.org
http://www.open-electronics.org/arduino-wifi-shield/

non riesco a farlo funzionare, mannaggia... mi sorge spontanea la domanda: ma Arduino è in grado di eseguire un programma e contemporaneamente eseguire servizi internet (che può essere la pagina web)??

se va avanti così mi comprerò un altro arduino solo per i servizi wifi cavoli....

Se intendi web server si:

Questa è una lampada RGB il cui colore può essere scelto da una pagina web. La connessione della lampada alla rete è wifi.

ciao a tutti di nuovo,

ho trovato uno dei problemi: se nella scrittura della pagina web richiedo ad arduino di stampare una temperatura, il tempo di attesa per visualizzare la pagina html è infinitamente più lungo; come posso risolvere?

questo è un esempio semplice che rende l'idea:

#include <WiServer.h>

#define WIRELESS_MODE_INFRA    1 
#define WIRELESS_MODE_ADHOC    2
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 8

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Wireless configuration parameters —————————————- 
unsigned char local_ip[] = {192,168,1,120};    // IP address of WiShield 
unsigned char gateway_ip[] = {192,168,1,1};    // router or gateway IP address 
unsigned char subnet_mask[] = {255,255,255,0};    // subnet mask for the local network 
const prog_char ssid[] PROGMEM = {"Cisco Home 2,4 gHz"};        // max 32 bytes

unsigned char security_type = 3;    // 0 – open; 1 – WEP; 2 – WPA; 3 – WPA2

// WPA/WPA2 passphrase 
const prog_char security_passphrase[] PROGMEM = {"xxx"};    // max 64 characters

// WEP 128-bit keys 
// sample HEX keys 
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,	// Key 0
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	// Key 1
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	// Key 2
				  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	// Key 3
				};

// setup the wireless mode 
// infrastructure – connect to AP 
// adhoc – connect to another WiFi device 
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len; 
unsigned char security_passphrase_len; 
// End of wireless configuration parameters —————————————-


// This is our page serving function that generates web pages 
boolean sendMyPage(char* URL) { 
    
        WiServer.print("<html>"); 
        WiServer.print("

Temperatura: ");
        WiServer.print(sensors.getTempCByIndex(0));
        WiServer.print("</html>"); 
        // URL was recognized 
        return true; 
    //} 
    // URL not found 
    return false; 
}


void setup() { 
  
  WiServer.init(sendMyPage); 
  sensors.begin();
}

void loop(){

  sensors.requestTemperatures();
  WiServer.server_task(); 
  // delay(10); 
   
}

Tieni presente che la libreria wifi invia 200 byte alla volta.
Pertanto se ad esempio la pagina è di 700 byte invia 200 + 200 + 200 + 100 byte... Quindi può servire un po' di tempo.
La tua pagina è comunque molto piccola, quindi dovrebbe caricarla molto più velocemente.

ma quindi non c'è soluzione? io pensavo che occorresse usare un altro comando rispetto al " (sensors.getTempCByIndex(0)); " oppure prendere un altro accorgimento di modo che invece di richiedere la temperatura ai sensori, questi la forniscano diciamo ogni 5 secondi e che il valore venga mantenuto in memoria. cosicché, poi sul web, venisse pubblicato questo ultimo dato "statico" anziché avanzare richiesta, aspettare la risposta dal sensore e poi scrivere sulla pagina...

ho calcolato i tempi di risposta da quando premo invio a quando si apre la pagina web: 14 secondi.... decisamente troppi

Nooooo troppo lento.
C'è qualcosa che non va.
Prova a mandare fuori un valore fisso.
Remmando la lettura del sensore
e anche il codice sensors.requestTemperatures();

se gli metto un valore fisso la resa della pagina è istantanea...

cosa vuol dire "remmare"?

Remmare (si forse un po' italianizzato...) :roll_eyes: Volevo dire "commentare"
Se è più veloce allora fagli leggere la temperature nel loop e mettilo in una variabile che riporti quando viene chiamata la pagina.
Altrimenti lui deve caricare la pagina.... aspettare che il sensore gli restituisca la temperatura... caricare il resto della pagina...

void loop(){

  sensors.requestTemperatures();
  WiServer.server_task(); 
  temp= sensors.getTempCByIndex(0);
   
}
boolean sendMyPage(char* URL) { 
    
        WiServer.print("<html>"); 
        WiServer.print("

Temperatura: ");
        WiServer.print(temp);
        WiServer.print("</html>"); 
        // URL was recognized 
        return true; 
    //} 
    // URL not found 
    return false; 
}