Pages: 1 2 3 [4]   Go Down
Author Topic: Sensors.requestTemperatures()-pag 3-rallenta molto il ciclo in wifi... perché?  (Read 1919 times)
0 Members and 1 Guest are viewing this topic.
Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao

di default la requestForTemperatures() aspetta che la conversione sia ultimata... puoi provare a impostare:

setWaitForConversion(false);

in questo modo mandi il comando e la funzione torna subito... dovrai però assicurarti tu che la conversione sia andata a buon fine prima di leggere il valore.

più veloce invece ottenere l'indirizzo fisico del tuo sensore e mandare il comando solo a lui con:

requestTemperaturesByAddress(indirizzo);
Logged

lucadentella.it

Monza
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo è il massimo che sono riuscito a fare... nel codice qua sotto le ho provate tutte ma la migliore è questa....

niente float, nessun setWaitForConversion(false); (che tra l'altro non riconosceva mai e me lo segnava come errore); usando il "requestTemperaturesByAddress(indirizzo);" la situazione non cambia...

forse è proprio il tipo di sketch che ho scelto come base a non andare bene? ho usato un simpleserver dagli esempi della libreria wishield asynclabs.... ho anche provato con il websever ma non ho idea di come fargli stampare il valore della temperatura dato che la stringa di costruzione della webpage è unica e non riconosce i comandi wifi.print... (ma poi che differenza c'è tra simpleserver e webserver??)

il tempo che ci impega per caricare la pagina è di circa 23 secondi..... e vi ricordo che togliendo dal void loop il "sensors.requestTemperatures();" ed assegnando un valore fisso la resa della pagina web è immediata... smiley-mad smiley-mad smiley-mad smiley-mad smiley-mad smiley-mad

Code:
#include <WiServer.h>

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

#define ONE_WIRE_BUS 8
#define TEMPERATURE_PRECISION 12

DeviceAddress sonda1={0X28, 0XAC, 0XF6, 0XA7, 0X03, 0X00, 0X00, 0XCE};



// 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);


//float tempC = sensors.getTempC(sonda1);

// 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) {
  
   // if (strcmp(URL, "/") == 0) {
        // Use WiServer’s print and println functions to write out the page content
        WiServer.print("<html>");
        WiServer.print("<br><br>Temperatura: ");
        WiServer.print(sensors.getTempC(sonda1));
        WiServer.print("</html>");
        // URL was recognized
        return true;
    //}
    // URL not found
    return false;
}



void setup() {
  // Initialize WiServer and have it use the sendMyPage function to serve pages
  WiServer.init(sendMyPage);
  // Enable Serial output and ask WiServer to generate log messages (optional)
  //Serial.begin(57600);
  //WiServer.enableVerboseMode(true);
  sensors.begin();
  sensors.setResolution(sonda1, TEMPERATURE_PRECISION);
 
}

void loop(){

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

qualcuno mi aiuta a capire perché ci mette così tanto?
« Last Edit: February 25, 2012, 08:22:21 am by luca56 » Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i sensori di temperatura son molto lenti a fare la lettura, (anche 0.75 secondi a lettura), se poi magari la tua libreria fa una media di più letture....

ora, un browser non invia UNA SOLA richiesta get, ma varie, di base 2: una per la pagina e una per l'immagine gif che poi è il simbolinoche compare sul browser, + una richiesta per ogni immagine, etc..

Quindi tu dovrari rispondere con la pagina SOLO se la GET richiede la pagina, non le altre cose.

attento con setWaitForConversion(false); a NON mandare più di una richiesta per lettura di seguito.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Monza
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

(?)



e quindi?

dovrei fargliela leggere ogni tot secondi ed al contempo però registrare l'ultima lettura per renderla disponibile a web... come si fa però?

oppure dovrei tenermi le cose così ed aspettare ogni volta quei 20 secondi per caricare la pagina web?
« Last Edit: February 26, 2012, 05:06:45 am by luca56 » Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 589
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Luca... te l'hanno già chiesto in molti ma... come stai messo a RAM?
Il tuo progetto ha un sacco di elementi, quasi quanto il progetto che ho sviluppato io.
E durante lo sviluppo del mio codice, quando ho riscontrato comportamenti strani ed assolutamente privi di senso... il problema era la ram.

Per vedere la ram rimasta libera puoi usare FREERAM con la libreria sdfatutil oppure avr-size.
Per iniziare fatti un idea con avr-size
http://arduino.cc/forum/index.php/topic,77991.0.html
Poi ti consiglio di passare all'IDE 1.0 e programmare tutte le stringe lcd e web.client in progmem con F().

Altra cosa che mi sono persa:
che arduino hai?
che router hai?
Io uso una eth shiled per connettermi in client mode e le noie più grandi erano dovute al router smiley
« Last Edit: February 26, 2012, 05:45:21 am by DanielaES » Logged

Monza
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma a dir la verità il programma che ho fatto è caricato su un arduino, il wifi lo sto provando su un'altro su cui carico solo il programma che ho postato poco più sopra in questo post...  ergo: ha solo quello da fare ma è lento nel fornire la pagina web... non credo quindi si possa trattare di mancanza di ram...

utilizzo degli arduino uno con IDE 22
come router ho un Linksys E3000
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 170
http://www.open-electronics.org
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La soluzione che prevederei io sarebbe quella di fargli leggere nel loop la sonda di temperatura (che sonda usi? una DS18B20 comunque restituisce il valore nell'arco di qualche ms) magari ogni 5 secondi, che mi sembra un tempo più che accettabile per una variazione di temperatura. Ti metti il tuo bel valore in una variabile che verrà mostrata quando la pagina viene chiamata.
No?
Se guardi a pagina 4 di questo progetto trovi il codice per arduino e vedi come avevo fatto: http://www.open-electronics.org/web-thermostat-with-arduino/
E' un termostato web basato su arduino che però utilizza un wiznet al posto della ethernet shield, ma lo stesso puoi fare per il wifi.
Logged


Monza
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, grazie mille finalmente ci sono riuscito...

ora mi sai anche dire come faccio a definire una variabile che abbia come valore quello che legge dal sensors.getTempC(indirizzo);?

ho dichiarato una float ultimovalore = (sensors.getTempC(indirizzo));

ho provato ad inserire un Serial.print(ultimovalore); nel loop assieme alle stringhe del blinkwithoutdelay ma restituisce sempre il primo valore di temperatura letto... toccando la sonda con un dito, insomma, se la prima lettura aveva rilevato 22.24°C, il valore che mi restituisce è sempre 22.24°C





||||||||||||

ok, ho risolto da solo, bastava inserire la float non all'inizio dello sketch ma direttamente nel loop....
« Last Edit: February 27, 2012, 11:06:16 am by luca56 » Logged

TN (Italy)
Offline Offline
Newbie
*
Karma: 0
Posts: 36
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i sensori di temperatura son molto lenti a fare la lettura, (anche 0.75 secondi a lettura), se poi magari la tua libreria fa una media di più letture....
Sto usando anch'io un DS18B20 con la libreria dallastemperature. Il datasheet riporta che il tempo massimo per una lettura con risoluzione a 9 bit è 93.75 ms.  Nel mio caso sensors.requestTemperatures() impiega circa un secondo per acquisire il dato. E' normale?
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma l'hai impostato a 9bit di risoluzione? di default credo che usi la risoluzione massima
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Monza
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

anche io ho le ds18b20 con risoluzione impostata a 12 bit
Logged

Pages: 1 2 3 [4]   Go Up
Jump to: