programma non va

#include <LiquidCrystal.h>
#include <leOS.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
leOS myOS;
const int button1=A3;
const int button2=A4;
const int button3=A2;
const int red=8;
const int green=9;
const int blue=10;
const int fotoresistenza=0;
const int termistore=1;
const int ledr=13;
const int ledb=6;
const int ledv=7;
const int led3=2;
int premuto1;
int premuto2;
int premuto3;
int punteggio;
int punteggio2;
int luce;
float valore;
float temperatura;
int tempo;
int velocita;
int a=0;
int b=0;
int c=0;
int d=0;



void setup()
{
  pinMode(led3,OUTPUT);
  pinMode(ledv,OUTPUT);
  pinMode(ledr,OUTPUT);
  pinMode(ledb,OUTPUT);
  pinMode(green,OUTPUT);
  pinMode(blue,OUTPUT);
  pinMode(red,OUTPUT);
  pinMode(fotoresistenza,INPUT);
  pinMode(termistore,INPUT);
  myOS.begin();
  myOS.addTask(ledOn,500);
  myOS.addTask(ledOff,1000);
  myOS.addTask(schermo,425,PAUSED);
  myOS.addTask(seriale,425,PAUSED);

  lcd.begin(16,2);
  Serial.begin(9600);  
}



void loop()
{
  luce=analogRead(fotoresistenza);
  valore=analogRead(termistore);
  velocita=10;
  temperatura=valore*(23/675);
  tempo=(1000/temperatura)*1;
  a=analogRead(button1);
  b=analogRead(button2);
  c=analogRead(button3);
  lcd.print("selezionare il");
  lcd.setCursor(0,1);
  lcd.print("programma");
  while (! ((a>=600) || (b>=600) || (c>=600))){
    a=analogRead(button1);
    b=analogRead(button2);
    c=analogRead(button3);
  }

  if(a>=600)
  {

    funzioneuno();
  }
  if(b>=600);
  {

    gioco();
  }
  if(c>=600)
  {
    gioco();
  }
}


void foto()
{
  if(luce<100)
  {

    digitalWrite(red, LOW);
    digitalWrite(green, LOW);
    digitalWrite(blue,HIGH);
    delay(5);


  }  
  if(luce>100 && luce <200)
  {
    digitalWrite(blue,HIGH);
    digitalWrite(red,LOW);
    digitalWrite(green,LOW);
    delay(5);
  }
  if(luce>200 && luce <300)
  {
    digitalWrite(red, LOW);
    digitalWrite(green, LOW);
    digitalWrite(blue,HIGH);
    delay(4);
  }
  if(luce>300 && luce<400)
  {
    digitalWrite(blue, LOW); 
    digitalWrite(red,LOW);
    digitalWrite(green,HIGH);
    delay(4);
  }
  if(luce>400 && luce<500)
  {
    digitalWrite(blue, LOW); 
    digitalWrite(red, LOW);
    digitalWrite(green,HIGH);
    delay(4);
  }
  if(luce>500 && luce<600)
  {
    digitalWrite(blue, LOW); 
    digitalWrite(red, LOW);
    digitalWrite(green,HIGH);
    delay(4);
  }
  if(luce>600 && luce<700)
  {
    digitalWrite(blue, LOW); 
    digitalWrite(green, LOW);
    digitalWrite(red,HIGH);
  }
  if(luce>700 && luce<800)
  {
    digitalWrite(blue, LOW); 
    digitalWrite(green, LOW);
    digitalWrite(red,HIGH);
  }
  if(luce>800);
  {
    digitalWrite(blue, LOW); 
    digitalWrite(green, LOW);
    digitalWrite(red,HIGH);
  }
}


void term()
{
  if(temperatura<20 && temperatura >16)
  {
    digitalWrite(ledv,LOW);
    digitalWrite(ledr,LOW);
    digitalWrite(ledb,HIGH);
    delay(tempo);  
  }
  if(temperatura>20 && temperatura <25)
  {
    digitalWrite(ledb,LOW);
    digitalWrite(ledr,LOW);
    digitalWrite(ledv,HIGH);
    delay(tempo);
  }
  if(temperatura>25)
  {
    digitalWrite(ledb,LOW);
    digitalWrite(ledv,LOW);
    digitalWrite(ledr,HIGH);
    delay(tempo);
  }
  if(temperatura<15)
  {
    digitalWrite(ledr,HIGH);
    digitalWrite(ledv,HIGH);
    digitalWrite(ledb,HIGH);
    delay(500);
  }
}


void controllo()
{
  foto();
  term();
  myOS.restartTask(schermo);
  myOS.restartTask(seriale);
}


void seriale()
{
  delay(velocita);
  Serial.print("ram libera= ");
  Serial.println(getFreeRam());
  Serial.print("temperatura= ");
  Serial.println(temperatura);
  Serial.println();
}

void ledOn()
{
  digitalWrite(led3,HIGH);
}

void ledOff()
{
  digitalWrite(led3,LOW);
}

void schermo()
{
  lcd.clear();
  lcd.print("temp= ");
  lcd.print(temperatura);
  lcd.setCursor(0,1);
  lcd.print("luce= ");
  lcd.print(luce);
}

unsigned int getFreeRam()
{
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

void funzioneuno()
{
  lcd.clear();
  lcd.print("programma 1 cavo");
  lcd.setCursor(0,1);
  lcd.print("usb consigliato");
  delay(2000);
  while(d==0)
  {
    luce=analogRead(fotoresistenza);
    valore=analogRead(termistore);
    velocita=10;
    temperatura=valore*0.031578947;
    foto();
    term();
    myOS.restartTask(schermo);
    myOS.restartTask(seriale);

  }
}

void funzionedue()
{
  lcd.clear();
  lcd.print("programma 2 cavo");
  lcd.setCursor(0,1);
  lcd.print("usb obbligatorio");
  delay(1000);
  lcd.clear();
  while(d==0)
  {
    luce=analogRead(fotoresistenza);
    valore=analogRead(termistore);
    velocita=10;
    temperatura=valore*0.031578947;
    seriale();
  }
}

e qui la parte che da problemi

void gioco()
{ 

  while(d==0)
  {
    premuto1=analogRead(button1);
    premuto2=analogRead(button2);
    premuto3=analogRead(button3);
    a=analogRead(button1);
    b=analogRead(button2);
    c=analogRead(button3);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("benvenuti");
    lcd.setCursor(0,1);
    lcd.print("nell'arduquiz");
    delay(5000);
    lcd.clear();
    lcd.print("istruzioni");
    delay(2500);
    lcd.clear();
    lcd.print("tasto 3");
    lcd.setCursor(0,1);
    lcd.print("saltare la domanda");
    delay(2500);
    lcd.clear();
    lcd.print("gli altri 2 servono ");
    lcd.setCursor(0,1);
    lcd.print("per indicare le risposte");
    delay(2500);
    lcd.clear();
    lcd.print("risposta giusta");
    lcd.setCursor(0,1);
    lcd.print("+1000 punti");
    delay(2000);
    lcd.clear();
    lcd.print("risposta sbagliata");
    lcd.setCursor(0,1);
    lcd.print("- 150 punti");
    delay(2000);
    lcd.clear();
    lcd.print("risposta saltata");
    lcd.setCursor(0,1);
    lcd.print("+ 0 punti");
    delay(2000);
    lcd.clear();
    lcd.print("per ricominciare");
    lcd.setCursor(0,1);
    lcd.print("tasto reset");
    delay(2000); 
    lcd.clear();
    lcd.print("ogni domanda resta");
    lcd.setCursor(0,1);
    lcd.print("scritta x 5s");
    delay(2000);
    lcd.clear();
    lcd.print("sono gentile e ");
    lcd.setCursor(0,1);
    lcd.print("ti regalo un punto");
    delay(2000);
    lcd.clear();
    lcd.print("tasto 1 per iniziare");
    delay(1000);
    while(!(premuto1>=600))
    {
      premuto1=analogRead(button1);
      premuto2=analogRead(button2);
      premuto3=analogRead(button3);
      a=analogRead(button1);
      b=analogRead(button2);
      c=analogRead(button3);
    }
    if(premuto1>=600)
    {
      lcd.clear();
      lcd.print("ok allora iniziamo :)");
      delay(2000);
      lcd.clear();
      lcd.print("3....");
      delay(1000);
      lcd.clear();
      lcd.print("2.....");
      delay(1000);
      lcd.clear();
      lcd.print("1.........");
      delay(1000);
      lcd.clear();
      lcd.print("viaaaaaaaaaa :)");
      delay(500);
      lcd.clear();
      lcd.print("quale e' la");
      lcd.setCursor(0,1);
      lcd.print("capitale d'Italia");
      delay(5000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("tasto 1 = Roma");
      lcd.setCursor(0,1);
      lcd.print("tasto 2 = Milano");
      delay(1000);
      a=0;
      b=0;
      c=0;
      while (! ((a>=600) || (b>=600) || (c>=600))){
        premuto1=analogRead(button1);
        premuto2=analogRead(button2);
        premuto3=analogRead(button3);
        a=analogRead(button1);
        b=analogRead(button2);
        c=analogRead(button3);
      }
      if(premuto1>600)
      {
        punteggio+1000;    // qui non da i punti
        punteggio2=punteggio;
      }
      if(premuto2>=600)
      {
        punteggio=punteggio - 150;
        punteggio2=punteggio;
      }
      if(premuto3>=600);
      {
        punteggio=punteggio + 1;
      }
      lcd.clear();
      lcd.print("punteggio");
      lcd.setCursor(0,1);
      lcd.print(punteggio);
      delay(1000);
      lcd.clear();
      lcd.print("quale e' la capitale");
      lcd.setCursor(0,1);
      lcd.print("dell'India");
      delay(5000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("tasto 1 = guarana'");
      lcd.setCursor(0,1);
      lcd.print("tasto 2 = New Delhi");
      delay(1000);
      while (! ((a>=600) || (b>=600) || (c>=600))){     // da qui in poi non si ferma più ad aspettare la risposta
        premuto1=analogRead(button1);
        premuto2=analogRead(button2);
        premuto3=analogRead(button3);
        a=analogRead(button1);
        b=analogRead(button2);
        c=analogRead(button3);
      }
      if(premuto1==HIGH)
      {
        punteggio=punteggio - 150;
        punteggio2=punteggio;
      }
      if(premuto2==HIGH)
      {
        punteggio=punteggio + 1000;
        punteggio2=punteggio;
      }
      if(premuto3==HIGH)
      {
        punteggio=punteggio + 0;
        punteggio2=punteggio;
      }
      lcd.print("punteggio");
      lcd.setCursor(0,1);
      lcd.print(punteggio); 
      delay(1500);
      lcd.clear();
      lcd.print("quanto fa");
      lcd.setCursor(0,1); 
      lcd.print("1+1-1x1:1");
      delay(5000);
      lcd.print("tasto 1=0");
      lcd.setCursor(0,1);
      lcd.print("tasto 2=1");
      while (! ((a>=600) || (b>=600) || (c>=600))){
        premuto1=analogRead(button1);
        premuto2=analogRead(button2);
        premuto3=analogRead(button3);
        a=analogRead(button1);
        b=analogRead(button2);
        c=analogRead(button3);
      }
      if(premuto1>600);
      {
        punteggio=punteggio-150;
      }
      if(premuto2>600);
      {
        punteggio=punteggio+1000;
      }
      if(premuto3>600)
      {
        punteggio=punteggio+0;
      }
      lcd.clear();
      lcd.print("punteggio");
      lcd.setCursor(0,1);
      lcd.print(punteggio);
      delay(1000);
      lcd.clear();
    }
  }
  if(premuto1<600)
  {
    delay(10);
  }
}

ho dovuto inserire il codice in 2 risposte perchè era troppo lungo :blush:

Sai che l' Arduino non é un PC con 2 GByte di RAM?
Sai che ha solo 2kByte o 8kByte (se é un MEGA) di RAM?
Sai anche che se stampi qualcosa il testo passa per la RAM e la blocca?
Sai se usi troppa RAM vengono sovvrascritte delle altre variabili e hai problemi strani?
Usa PROGMEM oppure F() per memorizzare i testi nella Flash.
http://arduino.cc/playground/Learning/Memory

potresti leggerti anche questo:
http://arduino.cc/forum/index.php/topic,133530.0.html

Ciao Uwe

Quoto Uwe, ed in più aggiungo che tu hai creato un task "seriale" che contiene il richiamo alla funzione "delay". Non ti può funzionare correttamente, la delay usa il timer 0 ma all'interno di una ISR (routine di gestione di un interrupt) gli altri interrupt risultano bloccati.

ok grazie mille vedo cosa riesco a combinare ...
i problemi di fare un chimico biologico come scuola è appunto che non mi insegnano a programmare :stuck_out_tongue:

quindi mi consigliate di salvare tutte le variabili sulla eproom?

Consiglio di usare la funzione F() e memorizzare i testi da stampare nella memoria flash. Come descritto in Arduino Playground - Memory

Version 1.0 of the Arduino IDE introduced the F() syntax for storing strings in flash memory rather than RAM. e.g.
Serial.println(F("This string will be stored in flash memory"));

Ciao Uwe

per usare PRGMEM bisogna includere la libreria no?
ho visto alcuni codici per gli LCD dove per le grafiche scrivono:

static unsigned char  __attribute__ ((progmem)) symbol [] = {0x00, 0x00, ....};

è lo stesso o fa un'altra cosa?

?R:
per usare PRGMEM bisogna includere la libreria no?
ho visto alcuni codici per gli LCD dove per le grafiche scrivono:

static unsigned char  __attribute__ ((progmem)) symbol [] = {0x00, 0x00, ....};

è lo stesso o fa un'altra cosa?

E' la stessa cosa, PROGMEM è un aliasi di attribute ((progmem)).
Comunque ti conviene usare la lib apposita, il problema non è dire al compilatore di lasciare i dati in Flash con PROGMEM ma di come farglieli recuperare da lì per passarli alle funzioni che li richiedono.
Ti consiglio un paio di letture:
www.teslabs.com/openplayer/docs/docs/prognotes/Progmem Tutorial.pdf
Arduino Playground - PROGMEM

ok grazie mille! :wink:

la F() invece non ha bisogno della libreria, no?
però non funziona sempre, dipende dal metodo nella quale la uso, per esempio ho provato ad usarla in una funzione della libreria del mio GLCD e mi da questo errore:

VI_Thunders_2_0:263: error: no matching function for call to 'ST7565::drawstring(int, int, const __FlashStringHelper*, int)'
C:\Users\User\SkyDrive\Documenti\Arduino\Arduino-sw\libraries\ST7565/ST7565.h:106: note: candidates are: void ST7565::drawstring(uint8_t, uint8_t, char*, uint8_t)

perchè si aspetta un char penso, potrei facilmente modificare la libreria per rendere compatibile... cosa ne dite?

Sì la F() si aspetta un char* ma passato direttamente e non per referenza, per cui

Serial.println(F("MARIO"));

funziona

char* mario = "MARIO";
Serial.println(F(mario));

non funziona.

Prima di riscriverti la funzione, fai prima ad usare PROGMEM.

ma la funzione sarebbe:

glcd.drawstring(6*2,2,"INFRARED RECEIVERS",0);

che usando F()
diventa:

glcd.drawstring(6*2,2,F("INFRARED RECEIVERS"),0);

ma così mi da quell'errore

Perché la funzione F() funziona solo in abbinamento alla classe Print, usata dalla sottoclasse Stream e dalle sue derivate, come Serial ed altre, per cui al momento funziona solo se richiami il metodo .print/ln() di queste classi derivate. Ma se usi librerie di terze parti, puoi scordartela.
Quindi impara ad usare PROGMEM e sei a posto. :wink:

ahn ok ok, avevo capito male...
grazie ancora :wink:

non sto capendo una cosa di progmem perchè il compilatore non mi da errori però il programma non va come mi aspetto...
se per dichiarare una striga da dare al mio LCD scrivo così è giusto?

const char wrgpsw[] PROGMEM={"WRONG PASSWORD!"};

e devo darla alla funzione del LCD che è:

void ST7565::drawstring(uint8_t x, uint8_t line, char *c, uint8_t color) {
  while (c[0] != 0) {
    drawchar(x, line, c[0], color);
    c++;
    x += 6; // 6 pixels wide
    if (x + 6 >= LCDWIDTH) {
      x = 0;    // ran out of this line
      line++;
    }
    if (line >= (LCDHEIGHT/8))
      return;        // ran out of space :(
  }
 if (x <= LCDWIDTH && color)drawline(x,line*8,x,line*8+7,color); 
}

quindi nel programma per scrivere nello schermo faccio:

  glcd.drawstring(0, 5,(char*)wrgpsw,0);

ma questo è sbagliato, da quello che ho letto bisogna usare

glcd.drawstring(0, 5,(char*)pgm_read_word(&(wrgpsw[i])),0);

però così sono costretto ad usare un ciclo for per scrivere tutta la stringa... e tra l'altro non sto capendo cosa mi ritorna perchè mi scrive simboli sbagliati :~

Non mi ricordo se l'avevo già detto a te oppure a qualcun altro.... ma il problema di PROGMEM non è tanto nel memorizzare dei dati dalla Flash, il problema è recuperarli :sweat_smile:

Prova così:

char buffer[25];
PROGMEM char *wrgpsw[] = {"WRONG PASSWORD!"};
strcpy_P(buffer, (char*)pgm_read_word(&(wrgpsw)));

Adesso dovresto avere in "buffer" (che è un array di tipo char) la stringa estratta dalla Flash.

PS: l'ho scritto di getto, compila ma non l'ho testato. La dimensione di buffer è arbitraria, regolala tu in base alla max lunghezza che devi trattare

ho provato come dicevi tu ma ancora niente :disappointed_relieved:

sto leggendo il file pgmspace.html che è all'egato con l'IDE e veso la fine c'è scritto come si dovrebbere procedere con le stringe... se non ho capito male dicono che non si può mettere nella flash una stringa alla volta, o almeno non lo prendono neanche in considerazione quel caso, boh... :roll_eyes: comunque dicono di fare così mettendole tutte in una tabella:

char string_1[] PROGMEM = "String 1";
char string_2[] PROGMEM = "String 2";
char string_3[] PROGMEM = "String 3";
char string_4[] PROGMEM = "String 4";
char string_5[] PROGMEM = "String 5";

PGM_P string_table[] PROGMEM = 
{
    string_1,
    string_2,
    string_3,
    string_4,
    string_5
};

e poi per riportarle in ram quando ce n'è bisogno suggeriscono di fare così:

void foo(void)
{
    char buffer[10];
    
    for (unsigned char i = 0; i < 5; i++)
    {
        strcpy_P(buffer, (PGM_P)pgm_read_word(&(string_table[i])));
        
        // Display buffer on LCD.
    }
    return;
}

ora non ho il robot per provare, secondo voi ha senso la cosa?