Pages: [1] 2   Go Down
Author Topic: programma non va  (Read 1455 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti smiley
lo so vi sto stressando con le domande, prometto che cercherò di farne di meno smiley-razz
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 smiley 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 smiley
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e qui la parte che da problemi
Code:
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
« Last Edit: November 23, 2012, 01:12:30 pm by lupo95 » Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21937
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: November 23, 2012, 04:09:47 pm by uwefed » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quindi mi consigliate di salvare tutte le variabili sulla eproom?
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21937
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Consiglio di usare la funzione F() e memorizzare i testi da stampare nella memoria flash. Come descritto in http://arduino.cc/playground/Learning/Memory
Quote
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
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per usare PRGMEM bisogna includere la libreria no?
ho visto alcuni codici per gli LCD dove per le grafiche scrivono:
Code:
static unsigned char  __attribute__ ((progmem)) symbol [] = {0x00, 0x00, ....};
è lo stesso o fa un'altra cosa?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per usare PRGMEM bisogna includere la libreria no?
ho visto alcuni codici per gli LCD dove per le grafiche scrivono:
Code:
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
http://www.arduino.cc/playground/Main/PROGMEM
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie mille! smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì la F() si aspetta un char* ma passato direttamente e non per referenza, per cui
Code:
Serial.println(F("MARIO"));
funziona

Code:
char* mario = "MARIO";
Serial.println(F(mario));
non funziona.

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


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma la funzione sarebbe:
Code:
glcd.drawstring(6*2,2,"INFRARED RECEIVERS",0);
che usando F()
diventa:
Code:
glcd.drawstring(6*2,2,F("INFRARED RECEIVERS"),0);
ma così mi da quell'errore
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley-wink
Logged


Pages: [1] 2   Go Up
Jump to: