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

ciao a tutti,

non riesco poprio a farla funzionare questa shield wifi.... vi posto il tentativo (non funzionante) che mi sta dando delle belle rogne...

questa è la shield

questo il codice

#include <WiServer.h>
#include <ShiftRegLCD.h>
#include <OneWire.h> 
#include <DallasTemperature.h> 
#include "Wire.h"  
#define DS1307_I2C_ADDRESS 0x68 //set rtc  
#define ONE_WIRE_BUS 4 //Define the pin of the DS18B20 
#define WIRELESS_MODE_INFRA	1
#define WIRELESS_MODE_ADHOC	2





altri int.... tolti per fare spazio

int blue = 3;              // blue LEDs connected to digital pin 3 (pwm) 
int white = 9;            // white LEDs connected to digital pin 11 (pwm) 
int ledlcd = A0;            // led lcd connected to analog pin 0 
int livellob = A1;
int livellom = A2;
int livelloa = A3;


ShiftRegLCD srlcd(7, 8, 6, 2);

OneWire oneWire(ONE_WIRE_BUS);  
DallasTemperature sensors(&oneWire); 



/*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  RTC 1307  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 



byte decToBcd(byte val)    // Convert normal decimal numbers to binary coded decimal 
{ 
  return ( (val/10*16) + (val%10) ); 
} 


byte bcdToDec(byte val)    // Convert binary coded decimal to normal decimal numbers 
{ 
  return ( (val/16*10) + (val%16) ); 
} 

etc etc...



/*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  ONESECOND --> OPERAZIONI CICLICHE RIPETUTE OGNI SECONDO|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 



void onesecond() //function that runs once per second while program is running 
{ 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); 
  srlcd.setCursor(0, 0); 
 
      srlcd.print(hour, DEC); 
    
   
  srlcd.print(":"); 
  if (minute < 10) { 
    srlcd.print("0"); 
  }
  srlcd.print(minute, DEC); 
 
  srlcd.setCursor(8, 0);
  if (dayOfMonth < 10) {
    srlcd.print("0");
  }
  srlcd.print(dayOfMonth, DEC);
  
  srlcd.print("/");
  if (month < 10){
    srlcd.print("0");
  }
  srlcd.print(month, DEC);
  srlcd.print("/");
  srlcd.print(year, DEC);
  
  
  
  
 srlcd.setCursor(13, 3);
  if (digitalRead(livellob) == LOW){
    srlcd.write(1);
  }
  else {
    srlcd.write(0);
  }
 
  srlcd.setCursor(14, 3);
  if (digitalRead(livellom) == LOW){
    srlcd.write(1);
  }
  else {
   srlcd.write(0);
  }
   srlcd.setCursor(15, 3);
  if (digitalRead(livelloa) == LOW){
    srlcd.write(1);
  }
  else {
    srlcd.write(0);
  }
 // lcd.print(":"); 
  //if (second < 10) { 
   // lcd.print("0"); 
 // } 
 // lcd.print(second, DEC); 
  
 // lcd.print(" "); 
 WiServer.server_task();
 
 // delay(10);
  delay(1000); 
} 

 



/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||   WIFI CONFIGURAZIONE|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


// 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 = {"15342985dresa"};	// 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) {
  
    // Check if the requested URL matches "/"
    if (strcmp(URL, "/") == 0) {
        // Use WiServer's print and println functions to write out the page content
        
         WiServer.print("<html>");
        WiServer.print("Hello World!");
        WiServer.print("</html>");
      
    
        
     
        // URL was recognized
        return true;
    }
    // URL not found
    return false;
}




/*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  S E T U P  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 


void setup() { 
 // pinMode(ledPin1, OUTPUT);    // set the digital pin as output: 
 // pinMode(ledPin2, OUTPUT);    // set the digital pin as output: 
  pinMode(ledlcd, OUTPUT);      // Set analog pin 0 as a output 
  pinMode(livellob, INPUT);
  pinMode(livellom, INPUT);
  pinMode(livelloa, INPUT);
  digitalWrite(livellob, HIGH);
  digitalWrite(livellom, HIGH);
  digitalWrite(livelloa, HIGH);
  
 // pinMode(fuge, OUTPUT);      // Set analog pin 1 as a output 
 // pinMode(moon, OUTPUT);      // Set analog pin 3 as a output 
  sensors.begin();             // Start up the DS18B20 Temp library 
  
  
  // wifi//
  
 // 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);

  /*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  SETUP DISPLAY |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 




/*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  L O O P |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 




void loop() 
{ 
  onesecond(); 
 // relay2(); 
 // relay1(); 

// Run WiServer
  




  /*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  FUNZIONI DIMMING|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 

  




  /*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  LOOP CRESCENTE|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 



  /*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  LOOP MANTENIMENTO|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 






  /*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  LOOP DECRESCENTE|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 



 
  //*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||  N O T T E |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/ 


}  // END LOOP

il risultato che ottengo è questo:

una volta caricato il programma arduino non da segni di vita per circa 30 secondi, dopodiché parte ma le sonde di temperatura non le legge ed il wifi non si aggancia alla rete nonostante sia a 2 metri dal router...

Forse non vanno uniti in questo modo i due programmi?

Ciao a tutti
Luca

vi ricordo quali sono le connessioni:

A0 --> retroilluminazione lcd
A1 --> SENSORE GALLEGGIANTE 1
A2 --> SENSORE GALLEGGIANTE 2
A3 --> SENSORE GALLEGGIANTE 3
A4 --> RTC
A5 --> RTC

13 / 10 --> WIFI SHIELD
9 --> PWM 1
8 --> SHIFT REGISTER
7 --> SHIFT REGISTER
6 --> SHIFT REGISTER
5 --> SERVO MOTORE
4 --> I2C SONDE DS18B20
3 --> PWM 2

A parte che nel codice ci sono commenti senza il // e il compilatore è un po' schizzinoso.
Dovresti per prima cosa staccare tutti i sensori e lcd.
Attaccare solo la wifi shield ad arduino e provare solo la parte di codice per ottenere l'indirizzo ip e testare le comunicazioni con il pc tramite seriale.
Distribuisci lungo il codice dei Serial.println("cosa stai facendo?"); per capire dove si blocca e restituire i risultati delle funzioni.

Come sei sicuro che la wifi funziona aggiungi le altre parti (hardware e software), una alla volta, finché non trovi tutto funzionante.

si le parti le ho dovute togliere perché altrimenti non sarei riuscito ad inserirlo nel post... supera i 9500 caratteri.... dal punto di vista software comunque non mi da problemi, lo verifica e lo compila...

separatamente i programmi funzionano entrambi: sia il mio che la wifi shield. il problema sorge quando li unisco e pensavo che fosse solo un problema di "collocamento" degli spezzoni di codice della wifi shield...

Ciao,
non ho guardato il codice, ma la mappatura.
Hai verificato l'utilizzo dei pin?

A0 --> retroilluminazione lcd
A1 --> SENSORE GALLEGGIANTE 1
A2 --> SENSORE GALLEGGIANTE 2
A3 --> SENSORE GALLEGGIANTE 3
A4 --> RTC
A5 --> RTC

13 / 10 --> WIFI SHIELD
9 --> PWM 1
8 --> SHIFT REGISTER
7 --> SHIFT REGISTER
6 --> SHIFT REGISTER
5 --> SERVO MOTORE
4 --> I2C SONDE DS18B20
3 --> PWM 2

il pin digitale 4 , guardando lo schema della WIFI shield, è in uso dalla stessa (gestione SD).
Sicuro non dia problemi?

anche io avevo il dubbio così ho provato a lasciare libero il pin 4 spostando le sonde i2c sul pin 5 ma il risultato è sempre lo stesso.

mi correggo però: il codice qui sotto mi da solo due problemi:

dopo averlo caricato su arduino il display rimane spento per una trentina di sec, poi parte e anche le sonde restituiscono la temperatura nonostante siano sul pin 4

è il wifi che non va proprio, si connette ma se visito l'ip 192.168.1.120 non c'è nulla, mi segnala errore server irraggiungibile

deve trattarsi per forza di un problema di programma

Ciao

è il wifi che non va proprio, non si aggancia alla rete

se invece utilizzi il wifi da solo, con quella configurazione, funziona bene?

Poi ti chiedo una cosa; perchè setti una password sia per WPA2 (la rete l'hai settata così) che per WEP?

const prog_char security_passphrase[] PROGMEM = {"15342985dresa"};	// 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
				};

nel loop hai avviato il wifi server?

WiServer.server_task();

hai provato ad abilitare il wifi server in verbose mode, nel setup?

WiServer.enableVerboseMode (true);

Poi, qualche considerazione personale: a me piace mettere tutte le dichiarazioni nella parte alta del codice, e tutte le funzioni aggiuntive dopo setup e loop.
In questo modo so che se cerco una variabile, la troverò sempre e solo in un posto, così come per le funzioni base e le aggiuntive - cosa che agevola molto la lettura del codice e soprattutto il debug... :stuck_out_tongue:

grazie dell'intervento...

il programma della shield wifi l'ho preso e copiato così com'era, per quello ci sono sia la wpa2 (la mia) che la wep (ora ho tolto)... e da solo funziona senza problemi

anche il mio programma da solo funziona e funziona anche se ci unisco quello del wifi: ci mette una trentina di secondi a caricarsi ma dopo quel lasso di tempo il display si accende e mi restituisce tutti i dati... insomma funziona in tutto.

il wifi invece no, funziona unicamente se è da solo. Proprio adesso ho provato a liberare anche il pin 4 e 9 ma nulla: ho provato a chiudere il contatto sulla shield del led di "segnalazione aggancio alla rete" e dopo quella 30ina di secondi si accende quindi dovrebbe essere connesso però non ho risposta all'indirizzo da me settato!

wifi server nel loop:

ho provato ad aggiungerlo sia al loop principale sotto al onesecond() che ad implementarlo direttamente in onesecond ma il risultato è lo stesso

verbose mode: non so cosa intendi dire, anche qui mi sono limitato a lasciare tutto come ho trovato nel codice d'esempio e le due stringhe sono abilitate... non sono rese commento..:

 WiServer.init(sendMyPage);
  
  // Enable Serial output and ask WiServer to generate log messages (optional)
  Serial.begin(57600);
  WiServer.enableVerboseMode(true);

ho anche chiamato futurashop per avere conferma dei pin utilizzati dalla shield... e mi hanno confermato 10 a 13 digitali + 9 per il led di segnalazione (a ponticello innestato) + eventualmente il 4 per la micro sd

non so proprio più cosa tentare, è da stamattina che giro e rigiro il codice ed il risultato non cambia... ma è possibile?!! poi senz'altro sarà una cavolata

Ciao,
mi sa che il problema è proprio la funzione onesecond.

Fai questa prova: commenta tutta la parte di scrittura su LCD e il delay, lasciando solo

  WiServer.server_task();

Questo perchè nella onesecond tu usi un delay: questa funzione blocca l'esecuzione di tutto il codice per il tempo indicato.
Se vuoi gestire degli intervalli, utilizza piuttosto millis(), o funzioni come Metro et similia

ho provato... non risolve nulla...

Come stai alimentando il tutto?
Come sei messo con l'utilizzo di memoria?

alimentatore esterno da 10v e lo sketch è di 23274 bytes.

ho fatto delle prove anche con un alimentatore a 12v sempre e comunque connesso tramite jack su Arduino a 2 metri dal router con tutte le protezioni disattivate tranne chiave wpa2 (firewall disatt., Passthrough VPN tutto disattivato..)

Dal router riesci a vedere il client (wifi-shield) associato?
Se dopo la presunta connessione del wifi con il router provi a fare ping sull'indirizzo 192.168.1.120 ti risponde?

ah caspita no, non lo vede! ho appena provato a caricare l'esempio della libreria (funzionante) e nonostante visualizzo Hello World digitando l'ip, dalle pagine di configurazione del router non vedo la shield... facendo il ping non mi restituisce niente...

aspetta però,... questo potrebbe anche voler dire che il wifishield non gestisce il prtocollo icmp (quello del ping), se vedi il messaggio servito dal webserver tramite il pc allora funziona. (io non ho quello shield)
Partendo quindi dallo sketch funzionante inizia ad aggiungere il codice relativo alla gestione degli altri componenti , uno per volta e vedi fino a che punto continua a funzionare.
Oppute scrivi dei messaggi traccianti sulla seriale relativi alle varie funzioni e vedi fino a che messaggio ricevi.

secondo me c'è qualche conflitto con i pin.... ho fatto questa prova:

se carico l'esempio simpleserver della libreria --> funziona

se poi, lasciando sempre lo stesso codice, aggancio sopra alla wifi shield il mio circuito stampato su cui ci sono lo shift register, l'rtc etc etc non funziona più.... io sono comunque sicuro che tutti i collegamenti rispettino lo schema (l'ho progettata su fritzing e poi stampata a casa... per forza funziona)

se poi la stacco, la pagina "hello world" non la rivedo finchè non faccio un reset ad arduino...

allora mi chiedo: è vero che ho avuto conferma dei pin utilizzati dalla shield (10 a 13 + eventualmente 4 e 9) ma come posso verificare fisicamente quali pin utilizzi?

non saprei, pensavo ad un comando seriale che mi indicasse la presenza di tensione o comunque di movimento su ogni singolo pin... così mi accorgerei subito se c'è qualcosa che non va...

Si, ma il resto del codice funziona?

si il mio si... ricapitolando ognuno dei due codici funziona; se li unisco funziona solo il mio dopo una trentina di secondi dal riavvio di arduino. il wifi shield, invece, segna l'aggancio alla rete ma non crea la pagina web.

Se non pubblichi il codice sano è difficile che ci capiamo qualcosa, potrebbe essere di tutto, da un delay nel posto sbagliato ad un conflitto di librerie o un ram overflow.

ok, questo è l'esempio simpleserver

/*
 * A simple sketch that uses WiServer to serve a web page
 */


#include <WiServer.h>

#define WIRELESS_MODE_INFRA	1
#define WIRELESS_MODE_ADHOC	2

// 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) {
  
    // Check if the requested URL matches "/"
    if (strcmp(URL, "/") == 0) {
        // Use WiServer's print and println functions to write out the page content
        WiServer.print("<html>");
        WiServer.print("Hello World!");
        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);
}

void loop(){

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