Unire 2 sketch (wifi shield ed il mio codice funzionante)... mi aiutate? pg.2

ciao ragazzi,

finito il mio progettino su arduino da autodidatta, ora vorrei fare il penultimo passo avanti e quindi prendere una wifi shield per poter mettere online i dati acquisiti da Arduino.

Nello specifico si tratta di far pubblicare 3 temperature ed implementare un bottone che mi permetta di azionare un servo da remoto.

Come noterete dal titolo del post il tutto andrà poi gestito da una app per iPhone che scriverò facendomi aiutare da un amico che di lavoro fa quello, nel frattempo, però, mi basta riuscire a far pubblicare da Arduino ciò che legge online (anche perché ora avendo Fastweb sto combattendo per avere un IP pubblico illimitato; finchè non me lo attivano avrò una limitazione di 20h mensili, ma per fare delle prove mi bastano).

Un paio di domande:

  1. quanti pin necessita un wifi shield?
  2. come comunicano? I2C?
  3. questa invece voleva saperla il mio amico delle app: arduino come mette a disposizione i dati in rete? (ho capito cosa intendeva dire, ma non conoscendo le varie possibilità per me rimane una domanda aperta... boh?!)

la cosa migliore, siccome non sono programmatore e ci ho messo 10 giorni per capire il linguaggio e completare il mio programma su Arduino, sarebbe poter avere sotto mano un programma già compilato che sfrutti il wifi shield... così da comprendere sul campo ciò che succede... (qualsiasi programma, non intendo averlo già pronto per i miei scopi). ho provato a scaricare librerie e di conseguenza utilizzare gli esempi però rimangono un po' a sé... alcuni sono troppo complessi e non capisco nemmeno il codice, altri sono troppo sciatti... sembrano addirittura incompleti... ne avete uno da farmi vedere?

nel frattempo vado a leggermi qualcosa sulle modalità client e server visto che non capisco quale sarebbe necessaria per il mio progetto ... (così ad occhio entrambe, però non ne sono sicuro)..

grazie a tutti
Luca

ps: la shield che vorrei prendere è questa:

(spero si possano pubblicare i link a siti di vendita... in caso contrario chiedo scusa, ma alla fine è un rivenditore che appare anche dalla pagina di arduino...)

Ciao,
riguardo all'utilizzo di pin, solitamente questo sito fornisce molte informazioni:
shieldlist.org
ma non nel caso dello shield a cui fai tu riferimento.

Utilizza i pin per il bus SPI (e quindi dal 10 al 13 digitali, in realtà usando il connettore ICSP), più qualche altro per eventuali led e per il controllo della sd (pin 4 e 9 digitali).
Qui:

la pagina ufficiale dello shield, con i link alle librerie sw e qualche esempio.

Sul come Arduino metta a disposizione dati: beh, questo è lo sketch che andrai a scrivere tu!

intanto ti ringrazio per la risposta... ma quello è l'unico modo di collegarlo? voglio dire, avendo occupati tutti i pin tranne i digitali 8 e 9 non ho via di scampo!
pensavo dialogasse in I2C cavoli... così sono legato...

ciao

avendo occupati tutti i pin tranne i digitali 8 e 9 non ho via di scampo

di impegnati hai il pin 4, 9, 10, 11, 12, 13
Ti rimangono liberi
digitali: 0, 1 (questi primi due considera che son quelli utilizzati anche dalla seriale), 2, 3, 5, 6, 7, 8
analogici: 0, 1, 2, 3, 4, 5, 6

Mi sembra che di pin liberi ne hai abbastanza...
Cosa ci devi fare?
3 temperature e un button riesci a gestirle senza problemi...

Considera inoltre che i pin analogici possono essere utilizzati come digitali.

è un controllore per acquario, e mi rimangono liberi solo i pin 0, 1, 8, 9 digitali, tutti gli altri sono occupati (dall'rtc, da 3 sensoli galleggianti connessi ai pin analogici, dal display, 2 pin per PWM che pilotano gli alimentatori per i led....) il programma l'ho già scritto, ora cercavo di mettere in rete i parametri rilevati da arduino

questa è una foto del progetto

Ciao,
tutto sommato il problema è legato all'utilizzo dei pin da parte del LCD... (correggimi se sbaglio)
In realtà potresti ovviare a questo problema pilotando il display con uno shift register:
http://code.google.com/p/arduinoshiftreglcd/
oppure usare un LCD seriale o i2c (alternativa più costosa)

In questo modo dovresti starci...

Eventualmente potresti pensare di utilizzare un'altro shield Wifi, per esempio il RedFly della Watterott, che utilizza i pin digitali 0,1,2 e 3
http://shieldlist.org/watterott/redfly

guarda, considerando la possibile implementazione di altre funzioni passo all'arduino mega e taglio la testa al toro... e quello che ho lo utilizzo per progettini nel tempo libero.

preferisco tenere come valida la scheda wifi che ho postato primo perché posso averla in giornata andandola a prendere, secondo perché, nonostante non funzionino sul mio attuale IDE che è il 22, almeno ha già la libreria pronta da scaricare comprensiva di esempi..

vorrei riformulare, a questo punto, la domanda...

questo è lo sketch d'esempio che mi ritrovo:

/*
 * 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,2};	// 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 = {"ASYNCLABS"};		// max 32 bytes

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

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"12345678"};	// 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);
}

e la mia domanda è:

i valori che vorrei ritrovarmi sulla pagina internet, li posso inserire direttamente in questestringhe di codice?:

WiServer.print("");
WiServer.print("Hello World!"); //QUESTA IN PARTICOLARE//
WiServer.print("");

e quindi, riprendendoli dallo sketch del mio arduino, mi basterebbe inserire questi parametri?:

lcd.print(sensors.getTempCByIndex(2)); --> diventerebbe --> WiServer.print(sensors.getTempCByIndex(2))
lcd.print(sensors.getTempCByIndex(1)); --> WiServer.print(sensors.getTempCByIndex(1))
lcd.print((sensors.getTempCByIndex(0)); --> WiServer.print((sensors.getTempCByIndex(0))

Spero di non scrivere cavolate, sto cercando di capire se la scrittura di dati su pagina web è simile nelle istruzioni a quella che si usa per impartire comandi ai display come il mio..

riassumendo in soldoni:

Se nel mio programma Arduino legge e riporta sul display 3 temperature in I2C sul pin 10 e volessi fargliele anche riportare sulla web page che lui mi crea apposta mi basterebbe implementare nel mio codice finito quello relativo alla wifi shield ed aggiungere i parametri che deve mandare online?

dovrebbe venire una cosa così:

WiServer.print("");
WiServer.print("Temperature");
WiServer.print(sensors.getTempCByIndex(2))
WiServer.print(sensors.getTempCByIndex(1))
WiServer.print(sensors.getTempCByIndex(0))
WiServer.print("");

ottenendo così un risultato del genere aprendo la pagina web:

Temperature
24.05
26.59
40.23

?

scusate l'elementarità della domanda... ad avere arduino mega e la shield avrei provato direttamente io...

Ciao,

guarda, considerando la possibile implementazione di altre funzioni passo all'arduino mega e taglio la testa al toro... e quello che ho lo utilizzo per progettini nel tempo libero.

oook

Se nel mio programma Arduino legge e riporta sul display 3 temperature in I2C sul pin 10 e volessi fargliele anche riportare sulla web page che lui mi crea apposta mi basterebbe implementare nel mio codice finito quello relativo alla wifi shield ed aggiungere i parametri che deve mandare online?

dovrebbe venire una cosa così:

WiServer.print("");
WiServer.print("Temperature");
WiServer.print(sensors.getTempCByIndex(2))
WiServer.print(sensors.getTempCByIndex(1))
WiServer.print(sensors.getTempCByIndex(0))
WiServer.print("");

sostanzialmente sì.
Magari dovrai scriverci un poco di html di contorno.

sono arrivato a questo risultato... dovrebbe andare bene.

purtroppo non ho la possibilità di testarlo perché non ho né la wifi shield né l'ethernet... ad occhio dovrebbe funzionare, comunque, no?

#include <OneWire.h>
#include "Wire.h"
#include <DallasTemperature.h>
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#define ONE_WIRE_BUS 10


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




byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // mac address
byte ip[] = { 
  192, 168, 1, 4 }; // ip arduino
byte gateway[] = { 
  192, 168, 1, 1 }; // router
byte subnet[] = { 
  255, 255, 255, 0 }; //subnet mask
Server server(80); //server port


String readString; //string


void setup(){
  Ethernet.begin(mac, ip, gateway, subnet);

  Serial.begin(9600);
}

void loop(){

  sensors.requestTemperatures();



  /*inizio client*/
  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString.concat(c); //store characters to string
        //if HTTP request has ended
        if (c == '\n' && currentLineIsBlank) {
          Serial.print(readString);
        }

        // COSTRUZIONE PAGINA HTML
        client.println("HTTP/1.1 200 OK");
        client.println("Content-Type: text/html");
        client.println();
        // inizializzo pagina
        client.print("<html><head><title>ARDUINO web prova temp</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
        //body
        client.println("<div style='width:640px; height:960px;'>"); //risoluzione per iphone 4-4S
        client.println("<h1>Temperatura</h1><hr />");
        
        client.println("<p>TEMPERATURA = ");
        client.print(sensors.getTempCByIndex(2));
        client.println(" C 
</p>");

      }  


      // link per aggiornare pagina e valori
      client.print("<h2>AGGIORNA SENSORI: <a href=''>CHECK</a></h2><hr />");



      // firma
      //client.println("<hr />");
      //client.print("<h4>Visita <a href='http://www.giannifavilli.it' target='_blank' />www.giannifavilli.it</a></h4>");
      //client.println("<hr />");

      // chiudo il div
      client.println("</div>");
      // chiudo pagina da togliere se uso ajax
      client.println("</body></html>");

      // pulisco la stringa per la successiva lettura
      readString="";
      //fermo il client
      client.stop();

    } //if c == /n
  } // if client available
} // while client connesso

purtroppo non ho la possibilità di testarlo perché non ho né la wifi shield né l'ethernet...

non ho guardato bene il codice (aspetto pure che lo testi :D), ma ho notato che è fatto per una Arduino Ethernet o con Ethernet Shield (o analoga).
Questo codice va modificato per essere utilizzato con shield WiFi da te linkato...

si si infatti, è che è l'unico esempio che non mi da errori sull'IDE 22; gli altri mi davano tutti errore ma non capisco di che tipo:

aspetto di provarla

ultima domandina: stavo cercando qualche informazione in più e mi sono accorto che dopo tutto non è poi così complicato trovare uno shift register per pilotare l'lcd... mi chiedevo se pervaso uno di questi potesse andare bene...

nello specifico mi riferisco al secondo della texas instr; quello da 0,25€

Ciao,
si, dovrebbe andare bene, ma se devi prendere pochi componenti, ti consiglio la baia.

Potresti usare anche un 74LS164N, trovi cmq schemi, libreria ed esempi nel link che ti ho passato qualche post fa:
http://code.google.com/p/arduinoshiftreglcd/

Ciao ragazzi, allora è tutto a posto... Comprata e configurata la shield... E funziona tutto ma riceve il segnale solo fino a qualche metro dal router, quindi devo aggiungere un'antenna esterna... Qualcuno mi sa dire dove e come vada innestata per favore? Il modello da me acquistato è quello che ho lincato sopra da futura shop

Ah, un'altra cosa: come posso capire quali pin utilizza su Arduino?

Ciao,

Qualcuno mi sa dire dove e come vada innestata per favore?

sul modulo, in un angolo, hai il connettorino. Il cavo per l'antenna si innesta lì.

come posso capire quali pin utilizza su Arduino

come già detto sopra:

Utilizza i pin per il bus SPI (e quindi dal 10 al 13 digitali, in realtà usando il connettore ICSP), più qualche altro per eventuali led e per il controllo della sd (pin 4 e 9 digitali).

ciao ragazzi...

dunque ho qualche problema con questa scheda wifi... spero che qualcuno mi possa aiutare

Il fatto è che se collegata ad Arduino da sola funziona, quando però sopra ci connetto anche la mia pcb con tutti i circuiti non funziona più...

non so se sia un problema di codice e quindi il modo in cui ho fuso il mio sketch con quello della wifi shield li faccia collidere oppure c'è qualche altro problema...

ho notato, poi, che una volta connesso il tutto ed acceso, il display che segna i vari parametri ci mette una trentina i secondi ad accendersi ed a caricare i dati; la wifi shield invece non si connette proprio...

siamo sicuri che i pin da tenere liberi siano quelli dal 10 al 13 compresi e basta? considerate che il led che segnala l'agganciamento alla rete non è abilitato e la micro sd non mi serve... tutti gli altri sono occupati

vi inserisco il codice così magari è più facile aiutarmi... date un occhio a come ho fuso gli sketch... secondo me il problema è li..

il programma non è completo, ho tagliato le parti non importanti lasciando solo le intestazioni

#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

int blue = 3;              
int white = 9;            
int ledlcd = A0;            
int livellob = A1;
int livellom = A2;
int livelloa = A3;

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

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



/*Configurazione wifi*/


// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,1,134};	// 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 = {"Mia rete"};		// max 32 bytes

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

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"xxxx"};	// 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("<titolo>");
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("Temperatura Acqua: ");
        WiServer.print(sensors.getTempCByIndex(0));
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("Temperatura LED 1: ");
        WiServer.print(sensors.getTempCByIndex(2));
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("Temperatura LED 2:");
        WiServer.print(sensors.getTempCByIndex(1));
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("
/p");
        WiServer.print("Riserva osmosi: ");
        WiServer.print("
/p");
       
        if (livellob == LOW){
          WiServer.print("30%" );
        }
      
        WiServer.print("
/p");
        
       
        if (livellom == LOW){
          WiServer.print("60%" );
         }
         
        WiServer.print("
/p");
        
          if (livelloa == LOW){
          WiServer.print("100%" );
         }
         
        WiServer.print("
/p");
   
   WiServer.print("</html>");
        
        
     
        // URL was recognized
        return true;
    }
    // URL not found
    return false;
}


/*Rtc 1307*/ 


/*Onesecond*/ 


void onesecond()  
{ 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  srlcd.setCursor(0, 0); 
  srlcd.print(hour, DEC); 
 (etc)
  
  delay(1000); 
} 

 
/*Void setup*/ 


void setup() { 

  pinMode(ledlcd, OUTPUT);      
  pinMode(livellob, INPUT);
  pinMode(livellom, INPUT);
  pinMode(livelloa, INPUT);
  digitalWrite(livellob, HIGH);
  digitalWrite(livellom, HIGH);
  digitalWrite(livelloa, HIGH);
  
  
  sensors.begin();              
  
  
  /* wifi 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);

  
  /*Setup display*/ 

  /*Loop*/ 

void loop() 
{ 
  onesecond(); 

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




  /*Loop dimming salita*/
  
  
  /*Loop a regime*/
  
  
  /*Loop dimming discesa*/


  //*Notturno*/ 

if (((ontime * 60) + photoperiod + (2 * blueramptime) + (2 * whiteramptime)) < daybyminute) 
  {          
       
    ledlcdOff(); 
   
  } 

   
}  // FINE

specifico l'uso dei pin:

a0 --> retroilluminazioone lcd
a1, 2 e 3 --> 3 interruttori galleggianti
a4 e 5 --> rtc

13, 12, 11, 10 --> wifi shield (icsp)
9 --> pwm 1
8, 7, 6 --> shift register
5 --> servo motore
4 --> i2c sonde temperatura
3 --> pwm 2

ho fatto qualche tentativo anche questa mattina ma niente.... separatamente funziona tutto regolarmente, ma quando li unisco non funzionano e ho il presentimento che il problema derivi da qualche interferenza con l'rtc...

mi spiego meglio: sul display il mio programma mi fa apparire una serie di dati (ora, data, temperature... etc)... quando unisco tutto in un programma e lo carico la data e l'ora diventano 00:00 00/00/00 / la wishield, inoltre, non si connette alla mia rete