ciao a tutti, sto effettuando un progetto che simuli la domotica grazie ad arduino. La logica del mio progetto è, arduino uno mi funge da web server tramite l'ethernet shield, dove è possibile interfacciarsi con esso mediante un pannello di controllo implementato con semplice codice html(bottoni per aprire o chidere delle porte o accebdere e spegnere delle luci). Ho scritto il codice seguendo diversi esempi e tutorial, iniziamente andava con il codice di accensione e spegnimento di un solo led, ma quando riporto il codice per altri due led 3 servo motori e la lettura dei valori da un sensore mi si pianta tutto e non funziona piu nemmeno qualla luce che precedentemente andava perfettamente (ho una certa fretta scusatemi ma settimana prossima devo presentarlo come tesina all'orale per la maturità, vi chiedo aiuto e non so piu dove sbattere la testa ), c'è qualcuno disposto ad aiutarmi?
moolto probabilmente sei nel classico problema della mancanza di ram. C'è poco da fare se non spammare a manetta PROGMES sulle variabili costanti (sopratutto le stringhe) e decimare variabili, array e buffer.
posta il codice che vediamo dove possiamo ottimizzare per il non uso di ram ![]()
eccolo qui :
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
#include <dht.h>
dht DHT; 98 // qui è presente la libreria dht 11 che ho utilizzato: https://arduino-info.wikispaces.com/file/view/DHT-lib.zip/545470280/DHT-lib.zip
#define DHT11_PIN 2
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x26, 0x3A };
byte ip[] = { 192, 168, 1, 200 }; // indirizzo IP del server
EthernetServer server(80); //server port
int Lucestanza = 5;
int Lucesalotto = 6;
int Lucegarage = 3;
Servo garage;
Servo ingresso;
Servo stanza
int pos;
String readString; //string
void setup(){
Ethernet.begin(mac, ip);
pinMode(Lucestanza, OUTPUT);
pinMode(Lucesalotto, OUTPUT);
pinMode(Lucegarage, OUTPUT);
garage.attach(7);
ingresso.attach(8);
stanza.attach(9);
Serial.begin(9600);
}
void loop(){
EthernetClient 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);
//LUCE STANZA
if(readString.indexOf("Luce_Stanza_On") > 0) {//lets check if LED should be lighted
//LED has to be turned ON
digitalWrite(Lucestanza, HIGH); // set the LED on
}
//LED has to be turned OFF
if(readString.indexOf("Luce_Stanza_Off") > 0) {//lets check if LED should be off
digitalWrite(Lucestanza, LOW); // set the LED OFF
}
//FINE LUCE STANZA
//LUCE SALOTTO
if (readString.indexOf("Luce_Salotto_On") >0)
{
digitalWrite(Lucesalotto, HIGH);
}
if (readString.indexOf("Luce_Salotto_Off") >0)
{
digitalWrite(Lucesalotto, LOW);
}
//FINE LUCE SALOTTO
//LUCE GARAGE
if (readString.indexOf("Luce_Garage_On") >0)
{
digitalWrite(Lucegarage, HIGH);
}
if (readString.indexOf("Luce_Garage_Off") >0)
{
digitalWrite(Lucegarage, LOW);
}
//FINE LUCE GARAGE
//GARAGE
if (readString.indexOf("Apri_Garage") >0)
{
for(pos = 90; pos>=0; pos-=2) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
garage.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (readString.indexOf("Chiudi_Garage") >0)
{
for(pos = 0; pos < 90; pos += 2) // goes from 180 degrees to 0 degrees
{
garage.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
//GARAGE
//INGRESSO
if (readString.indexOf("Apri_Ingresso") >0)
{
for(pos = 90; pos>=0; pos-=2) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
ingresso.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (readString.indexOf("Chiudi_Ingresso") >0)
{
for(pos = 0; pos < 90; pos += 2) // goes from 180 degrees to 0 degrees
{
ingresso.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
//INGRESSO
//STANZA
if (readString.indexOf("Apri_Stanza") >0)
{
for(pos = 90; pos>=0; pos-=2) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
stanza.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (readString.indexOf("Chiudi_Stanza") >0)
{
for(pos = 0; pos < 90; pos += 2) // goes from 180 degrees to 0 degrees
{
stanza.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
//STANZA
// now output HTML data starting with standart header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the respon
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head>");
client.println("<style>");
client.println("h1{text-shadow: 2px 2px #00AEB3;}");
client.println("</style>");
client.println("<title>DOMOTICA</title>");
client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
client.println("</head>");
client.println("<body>");
client.println("
");
client.println("<h1>benvenuto utente, questo e' il tuo sistema di domotica</h1>");
client.println("
");
client.println("
");
int chk = DHT.read11(DHT11_PIN);
chk = DHT.read11(DHT11_PIN);
switch (chk)
{
case DHTLIB_OK:
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.print("Time out error,\t");
break;
case DHTLIB_ERROR_CONNECT:
Serial.print("Connect error,\t");
break;
case DHTLIB_ERROR_ACK_L:
Serial.print("Ack Low error,\t");
break;
case DHTLIB_ERROR_ACK_H:
Serial.print("Ack High error,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
client.println("UMIDITA':");
client.println(DHT.humidity,1);
client.println("%");
client.println("
");
client.println("TEMPERATURA:");
client.println(DHT.temperature,1);
client.println("C");
client.println("
");
client.println("
");
client.println("<a href=\"/Luce_Garage_On\"\">accendi la luce del Garage</a>");
client.println("<a href=\"/Luce_Garage_Off\"\">spegni la luce del Garage</a>
");
client.println("
");
client.println("
");
client.println("<a href=\"/Luce_Stanza_On\"\">accendi la luce della stanza</a>");
client.println("<a href=\"/Luce_Stanza_Off\"\">spegni la luce della stanza</a>
");
client.println("
");
client.println("
");
client.println("<a href=\"/Luce_Salotto_On\"\">accendi la luce del salotto</a>");
client.println("<a href=\"/Luce_Salotto_Off\"\">spegni la luce del salotto</a>
");
client.println("
");
client.println("
");
client.println("<a href=\"/Apri_Garage\"\">apri il garage </a>");
client.println("<a href=\"/Chiudi_Garage\"\">chiudi il garage </a>
");
client.println("
");
client.println("
");
client.println("<a href=\"/Apri_Stanza\"\">apri la porta della stanza </a>");
client.println("<a href=\"/Chiudi_Stanza\"\">chiudi la porta della stanza </a>
");
client.println("
");
client.println("
");
client.println("<a href=\"/Apri_Ingresso\"\">apri la porta di ingresso </a>");
client.println("<a href=\"/Chiudi_Ingresso\"\">chiudi la porta di ingresso </a>
");
client.println("</body>");
client.println("</html>");
//printing LED status
//client.print("<h2><a href='/?Luce_Stanza_On'>ACCENDI</a> | <a href='/?Luce_Stanza_Off'>SPEGNI</a></h2>");
client.println("</body></html>");
readString="";
client.stop();
} //if c == /n
} // if client available
} // while client connesso
} // if client
} //loop
qui il seguito che per motici di dimensioni non ci stava ![]()
elimina readstring, analizza la stringa mentre arriva senza salvarla
e come vado a prendere i link e confrontarli?
questo è il bello!
Tanto per cominciare NON ti serve usare tutte qelle stringhe, che potresti per cominicare salfare in FLASH con la F().
ma se poi invece che inviare STRINGHE diverse, invii un solo carattere?
a accende la sala
b il salotto
c la spegne
etc.. et voilà, non hai più bisogno nemmeno di usare le stringhe, il programma diventa più facile, e hai da 0-9 a-z A-Z stati disponibi.
se te ne sservodno di più allora usi più lettere, in cui ogni lettera è un gruppo; quindi se vedi come prima lettera una "a" entri in un if/switch che gestisce solo le cose "garage", e poi se la seconda lettera è "a" accendi la luce 1 (del garage ovvio), se "b" la spegni, se "c" alzi la saracinesca...
ma direi che per ora non hai bisogno di queste complicazioni.
QUINDI NON leggi tutto con readString.concat(c);
MA,
sapendo che la tua richiesta è tipo
GET /Luce_Salotto_Off HTTPbalbbalbal
la fai diventare
GET /a HTTPbalbbalbal
fai una while su char c = client.read(); buttando via tutto fichè non leggi uno "/"; poi leggi il successivo carattere, ed esegui la corrispondente azione (o lo salvi per dopo), poi continui a leggere (in loop buttando via tutto) finchè il client non finisce la sua sua richiesta (if (c == '\n' && currentLineIsBlank) {) o si disconnette. gli mandi il codie 200 e buona.
AH TUTTA la pagina HTML la stai tenendo in RAM, questa è il classico esempio da salvare in flash usando F()
non mi è chiaro come usare F() ![]()
(da come avrai capito non me ne intendo molto
)
ehi lesto ora mi fuziona tutto quanto grazie al tuo consiglio di cambiare il nome ai lnk yep!!!!
![]()
ora vorrei rendere piu carino il mio pannello di controllo, consigli ? ![]()
tanto per cominciare studiati questo, così risparmi ancora un sacco di RAM Arduino Playground - Memory
poi per rendere più carino... bho sono pessimo con la grafica, guardati bootstrap magari
va bene grazie mille davvero
![]()
uhm..sarà sempre un problema di memoria piena murata ma ho provato un semplice allarme tramite sensore ultrasuoni che ho trovato qui :http://www.instructables.com/id/SIMPLE-ARDUINO-ULTRASONIC-SENSOR-DOOR-ALARM-/
ma se inserisco quella porzione di codice cambiando naturalmente i pin, non mi va nulla
...
per usare la funzione F(), che libreria devo aggiungere? perchè nel link che tu gentilmente mi hai postato mi parla della PROGMEM con le strenghe...
saluti,
Daniel.