Go Down

Topic: Sensors.requestTemperatures()-pag 3-rallenta molto il ciclo in wifi... perché? (Read 2298 times) previous topic - next topic

pitusso

Ciao,
qui un paio di link con qualche tips:
http://oskarwicha.blogspot.com/2011/08/source-code-optimization-tips-for-atmel.html
http://liudr.wordpress.com/2011/03/07/optimizing-your-program/

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

luca56

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

luca56

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

OpenElectronics

Sotto http://code.google.com/p/wifi-shield-oe/
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/

http://www.open-electronics.org

luca56

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....

OpenElectronics

Se intendi web server si:

http://www.open-electronics.org/arduino-wifi-rgb-lamp-ikea-dudero-modding/

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

http://www.open-electronics.org

luca56

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:

Code: [Select]

#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("<br><br>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);
   
}


OpenElectronics

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.

http://www.open-electronics.org

luca56

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...

luca56

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

OpenElectronics

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

http://www.open-electronics.org

luca56

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

cosa vuol dire "remmare"?

OpenElectronics

Remmare (si forse un po' italianizzato...)  :smiley-roll-blue:  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...

Code: [Select]
void loop(){

  sensors.requestTemperatures();
  WiServer.server_task();
  temp= sensors.getTempCByIndex(0);
   
}

Code: [Select]

boolean sendMyPage(char* URL) {
   
        WiServer.print("<html>");
        WiServer.print("<br><br>Temperatura: ");
        WiServer.print(temp);
        WiServer.print("</html>");
        // URL was recognized
        return true;
    //}
    // URL not found
    return false;
}

http://www.open-electronics.org


luca56

ho fatto altre prove... sostanzialmente è il sensors.requestTemperatures(); che mi rallenta il ciclo... 14 o 15 secondi per caricare la pagina web... se lo tolgo, invece, è istantanea... come posso risolvere? ho cercato negli sketch di chi ha costruito delle stazioni meteo ma non ho trovato granché...

Go Up