Offline
Full Member
Karma: 0
Posts: 139
|
 |
« on: November 23, 2012, 01:08:18 pm » |
ciao a tutti  lo so vi sto stressando con le domande, prometto che cercherò di farne di meno  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 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 139
|
 |
« Reply #1 on: November 23, 2012, 01:09:04 pm » |
#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
Full Member
Karma: 0
Posts: 139
|
 |
« Reply #2 on: November 23, 2012, 01:10:04 pm » |
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 
|
|
|
|
« Last Edit: November 23, 2012, 01:12:30 pm by lupo95 »
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 161
Posts: 15712
+39 349 2158303
|
 |
« Reply #3 on: November 23, 2012, 04:06:45 pm » |
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/Memorypotresti leggerti anche questo: http://arduino.cc/forum/index.php/topic,133530.0.htmlCiao Uwe
|
|
|
|
« Last Edit: November 23, 2012, 04:09:47 pm by uwefed »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #4 on: November 23, 2012, 05:20:58 pm » |
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
Full Member
Karma: 0
Posts: 139
|
 |
« Reply #5 on: November 24, 2012, 02:27:16 pm » |
ok grazie mille vedo cosa riesco a combinare ... i problemi di fare un chimico biologico come scuola è appunto che non mi insegnano a programmare 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Full Member
Karma: 0
Posts: 139
|
 |
« Reply #6 on: November 24, 2012, 02:31:02 pm » |
quindi mi consigliate di salvare tutte le variabili sulla eproom?
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 161
Posts: 15712
+39 349 2158303
|
 |
« Reply #7 on: November 24, 2012, 04:11:20 pm » |
Consiglio di usare la funzione F() e memorizzare i testi da stampare nella memoria flash. Come descritto in http://arduino.cc/playground/Learning/MemoryVersion 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
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 831
ƎR like no other.
|
 |
« Reply #8 on: November 28, 2012, 05:45:30 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #9 on: November 28, 2012, 07:17:14 am » |
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 http://www.arduino.cc/playground/Main/PROGMEM
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 831
ƎR like no other.
|
 |
« Reply #10 on: November 28, 2012, 07:27:17 am » |
ok grazie mille! 
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 831
ƎR like no other.
|
 |
« Reply #11 on: November 28, 2012, 07:45:44 am » |
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?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #12 on: November 28, 2012, 08:56:43 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Vicenza, Italy
Offline
God Member
Karma: 4
Posts: 831
ƎR like no other.
|
 |
« Reply #13 on: November 28, 2012, 09:05:29 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16460
Don't know what I do
|
 |
« Reply #14 on: November 28, 2012, 09:18:58 am » |
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. 
|
|
|
|
|
Logged
|
|
|
|
|
|