Go Down

Topic: programma non va (Read 1 time) previous topic - next topic

lupo95

ciao a tutti :)
lo so vi sto stressando con le domande, prometto che cercherò di farne di meno :P
sto creando un programma che all'avvio in base a quale tasto premo avvia un sottoprogramma(o come si chiama xD )
fino a qui tutto apposto :) il primo programma va ovvero legge la temperatura e la scrive sul seriale e sul lcd.
il problema sta nel secondo... è un quiz ancora in fase di sviluppo
praticamente alla prima domanda funzione bene (a parte che se fai giusto non ci ti da i punti se qualcuno sa come risolverlo mi fa un favore)
poi dalla seconda domanda in poi non si ferma più ad aspettare la risposta fa quello che vuole...
ora vi carico il programma

grazie infinite in anticipo :)

lupo95

Code: [Select]
#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();
 }
}



lupo95

#2
Nov 23, 2012, 07:10 pm Last Edit: Nov 23, 2012, 07:12 pm by lupo95 Reason: 1
e qui la parte che da problemi
Code: [Select]
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  :smiley-red:

uwefed

#3
Nov 23, 2012, 10:06 pm Last Edit: Nov 23, 2012, 10:09 pm by uwefed Reason: 1
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


leo72

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.

Go Up