Uchování hodnoty proměnné
Úvodní stránka › Fórum › Vaše projekty › Arduino › Uchování hodnoty proměnné
- Toto téma obsahuje celkem 12 odpovědí. Do diskuze (3 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 7 roky a 10 měsíci.
-
AutorPříspěvky
-
24.11.2016 v 8:46 #9292NavryÚčastník
Vyrobil jsem si takový datalogger, kterým zapisuji analogové hodnoty na SD kartu.
K tomuto mám připojený dálkový ovladač a LCD display.Potřeboval bych poradit, jak mám napsat to, abych při zmačknutí tlačítka na ovladači – např. tl.1,
začal vypisoval na display hodnoty uloženy v „obrazovce LCD č.1“, tl.2 = obraz.LCD č.2, atd.Toto mě funguje (switch – case) ale problém je v tom, že musím toto tlačítko stále držet.
Chtěl bych to tak abych zmačknul tl.č1, a dokud nezmáčknu jiné tlačítko (např.č.2), tak se bude zobrazovat stále obraz. LCD č.1
Jsem to tak napsal, že nevím jetli se dá pochopit můj problém.
25.11.2016 v 7:44 #9294Vojtěch VosáhloÚčastníkUdělejte si 2 proměnné – tlacitko a tlacitkoOld
A do smyčky pro lcd to pusťte pouze pokud se liší. Tzn.if(tlacitko != tlacitkoOld){ //něco se ukáže na lcd tlacitkoOld = tlacitko; }
Do tlacitko zapisujete jaké tlačítko bylo stisknuto a tlacitkoOld by mělo stačit inicializovat jako nulu, samozřejmě podle toho jak získáváte názvy tlačítek, takocý typ proměnné to bude. Taky kdyby jste měl na ovladači tlačítko 0 tak se musí tlacitkoOld nastavit na -1. Hodně štěstí
25.11.2016 v 8:54 #9295NavryÚčastníkDěkuji za odpověď!
Potřebuji použít IR dálkový ovladač a tímto budu prepinat 9obrazovek displaje LCD. Zmačknu tl.1 LCD 1,…..Zmacknu 9 a LCD 9.
Jedná se o to, že ovladač vysílá kó pouze při zmačknutí přislušného tlačítka a aby byla vyvolana trvale patřičná obrazovka LCD musí být nasetován „nějaký bit“
Na dvě obrazovky pomocí tlačítka mě to funguje ale přes to DO nevím jak to udělat.
Předem děkuji za Vaše nápady (rady)27.11.2016 v 14:49 #9308posjirkaÚčastníkzřejmě se troch nechápete.
Použil bych switch case.Představte si, že tlačítko 1 odešle bude mít kod 11 (co dostane od IR přijímače), talčítko 2 bude mít kod 12, tlačítko 3 kod 13.
obrazovky budou mít čísla 1, 2, 3Jen pro představu.
v setup() si nastavíš, že obrazovka = 1
ve smyčce loop() pak budeš neustále čekat na příjem kodu a podle toho co příjme změn
pomocí switch case na
kod 11 = obrazovka 1
kod 12 = obrazovka 2
kod 13 = obrazovka 3pak pokračuješ tím, že podle promenne „obrazovka“ zobrazíš co je třeba, tedy další switch case.
bez kodu se to blbě popisuje 🙂
27.11.2016 v 18:31 #9316NavryÚčastníkTo je mě tak nějak jasné. Jde pouze o to, že zmačknu nějaké tlačítko a vyvolám patřičnou obrazovku ale jakmile jej pustím (přestanu vysílat kód) tak „switch“ nedostane žádnou hodnotu (proměnnou) a tím pádem neproběhne (case) a skočí to do default:
Nemůžu přijít na to jak uchovat poslední stav (case) do té doby než přijde jiný požadavek z IR ovladače.
Předem díky za rady28.11.2016 v 0:17 #9318posjirkaÚčastníkale o tom to právě je…. myslím že jsem to popsal jasně.
Dej sem kod a můžeme ho upravit. Opravdu nebudu vymýšlet pseudo kod… na to vážně nemám čas….28.11.2016 v 8:10 #9324NavryÚčastníkZde je můj kód, zobrazeni je na konci.
Nějak to nechápu s tím přepínáním.
Ještě jednou se omlouvám za moje neustálé otravování.28.11.2016 v 8:57 #9325NavryÚčastník/*—–( Import needed libraries )—–*/
#include <LiquidCrystal.h>
#include <SD.h>
#include <Wire.h>
#include „RTClib.h“
#include <interval.h>
#include <IRremoteInt.h>
#include „IRremote.h“/*—–( Declare Constants )—–*/
int receiver = 2; // pin 1 of IR receiver to Arduino digital pin 11
int teplVenk = 1; //Cidlo Commet
int vlhkVenk = 0; //Cidlo Commet
int topTepl = 3; //Pt100 topení teplá
int topStud = 2; //Pt100 topení studena/*—–( Declare objects )—–*/
IRrecv irrecv(receiver); // create instance of ‚irrecv‘
decode_results results; // create instance of ‚decode_results‘
File logfile;
Interval blink;
LiquidCrystal lcd(3, 4, 5, 6, 7, 8); // initialize the library with the numbers of the interface pins
RTC_DS1307 RTC; // define the Real Time Clock object/*—–( Declare Variables )—–*/
const int chipSelect = 10;
const long blinkinterval = 100; // interval at which to blink (milliseconds)void setup() /*—-( SETUP: RUNS ONCE )—-*/
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
lcd.begin(16,2);
Wire.begin();
RTC.begin();//—————————————-
if (! RTC.isrunning()) {
Serial.println(„RTC is NOT running!“); // following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
//——————————-
Serial.print(„Initializing SD card…“);
pinMode(SS, OUTPUT);// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println(„Card failed, or not present“);
// don’t do anything more:
while (1) ;
}
Serial.println(„card initialized.“);
// create a new file
char filename[] = „METEO_00.CSV“;
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + ‚0‘;
filename[7] = i%10 + ‚0‘;
if (! SD.exists(filename)) {
// only open a new file if it doesn’t exist
logfile = SD.open(filename, FILE_WRITE);
break; // leave the loop!
}
}Serial.print(„Logging to: „);
Serial.println(filename);
logfile.println(„Datum, TeplotaVenku, VlhkostVenku, TopeniTepla, TopeniStudena“);
}/*–(end setup )—*/void loop() /*—-( LOOP: RUNS CONSTANTLY )—-*/
{
if (irrecv.decode(&results)) // have we received an IR signal?{
// Serial.println(results.value, HEX); UN Comment to see raw values
translateIR();
irrecv.resume(); // receive the next value
}
//——————————————————–
int SCteplVenk = analogRead(teplVenk);
SCteplVenk = map(SCteplVenk, 0, 1023, -20, 50);int SCvlhkVenk = analogRead(vlhkVenk);
SCvlhkVenk = map(SCvlhkVenk, 0, 1023, 0, 100);int SCtopTepl = analogRead(topTepl);
SCtopTepl = map(SCtopTepl, 0, 1023, 10, 120);int SCtopStud = analogRead(topStud);
SCtopStud = map(SCtopStud, 0, 1023, 10, 120);String dataString = „“;
DateTime now = RTC.now();
//———————————————————–
if (blink.expired()) {
blink.set(blinkinterval); // set new interval periodlogfile.print(now.year(), DEC);
logfile.print(„/“);
logfile.print(now.month(), DEC);
logfile.print(„/“);
logfile.print(now.day(), DEC);
logfile.print(„,“);
logfile.print(now.hour(), DEC);
logfile.print(„:“);
logfile.print(now.minute(), DEC);
logfile.print(„,“);
//———————————————————–
logfile.print(SCteplVenk);
logfile.print(„,“);
logfile.print(SCvlhkVenk);
logfile.print(„,“);
logfile.print(SCtopTepl);
logfile.print(„,“);
logfile.print(SCtopStud);
logfile.print(„,“);
// delay(10000); //čekej 10minut//————————————————————
logfile.println(dataString);
logfile.flush();
}
//———————————————————–}/* –(end main loop )– */
/*—–( Declare User-written Functions )—–*/
void translateIR() // takes action based on IR code received
{
int SCteplVenk = analogRead(teplVenk);
SCteplVenk = map(SCteplVenk, 0, 1023, -20, 50);int SCvlhkVenk = analogRead(vlhkVenk);
SCvlhkVenk = map(SCvlhkVenk, 0, 1023, 0, 100);int SCtopTepl = analogRead(topTepl);
SCtopTepl = map(SCtopTepl, 0, 1023, 10, 120);int SCtopStud = analogRead(topStud);
SCtopStud = map(SCtopStud, 0, 1023, 10, 120);
// describing KEYES Remote IR codesint tlacitko = 0;
switch(results.value){
case 0x141: tlacitko = 1;
Serial.println(“ zmacknuto tlacitko 1 „);
lcd.setCursor(0, 0); // set the cursor to (0,0):
lcd.print(SCteplVenk);
lcd.setCursor(0, 1);
lcd.print(SCvlhkVenk);
lcd.setCursor(3, 0);
lcd.print(„C – Teplota“);
lcd.setCursor(3, 1);
lcd.print(„% – Vlhkost“);
break;
case 0x942: tlacitko = 2;
Serial.println(“ zmacknuto tlacitko 2 „);
lcd.setCursor(0, 0);
lcd.print(SCtopTepl);
lcd.setCursor(0, 1);
lcd.print(SCtopStud);
lcd.setCursor(3, 0);
lcd.print(„C – Kotel HOT“);
lcd.setCursor(3, 1);
lcd.print(„C – Kotel COLD“);
break;
case 0x143: tlacitko = 3;
Serial.println(“ zmacknuto tlacitko 3 „);
break;
case 0x944: tlacitko = 4;
Serial.println(“ zmacknuto tlacitko 4 „);
break;
case 0x145: tlacitko = 5;
Serial.println(“ zmacknuto tlacitko 5 „);
break;
case 0x946: tlacitko = 6;
Serial.println(“ zmacknuto tlacitko 6 „);
break;
case 0x147: tlacitko = 7;
Serial.println(“ zmacknuto tlacitko 7 „);
break;
case 0x948: tlacitko = 8;
Serial.println(“ zmacknuto tlacitko 8 „);
break;
case 0x149: tlacitko = 9;
Serial.println(“ zmacknuto tlacitko 9 „);
break;
case 0x940: tlacitko = 0;
Serial.println(“ zmacknuto tlacitko 0 „);
break;
default:
Serial.println(“ jine tlacitko „);
}// End Case// return tlacitko;
} //END translateIR
28.11.2016 v 9:43 #9326posjirkaÚčastníkomlouvat se vubec nemusis. nikdo z nas nezna vsechno a kazdy nejak zacinal.
Kdyz vkladas kod pouzivej parove znacky „code“ (tlacitko CODE) pred a za kodem. uchova si formatovani. trochu jsem ti to prekopal:
– zrusil duplicitni vypocty
– odstranil zobrazovani obrazovek jen pri stisku tlacitka (funkce zobraz() )
– presunul promennou tlacitko
– naformatoval podle se abych se v tom vyznal.
– …vsechny zmeny mam pod revizi “ #1 “ takze ji muzes v pohode dohledat
Vyzkousej to a uvidis. ja nema jak to vyzkouset a stavet se mi to vazne nechce 🙂 :// #1 - BY JP 11/2016 // uprava na prepinani obrazovky pomocí tlacitek IR ovladace // uprava na zobrazovani aktualnich dat (v puvodni verzi zustali hodnoty z doby prd sepnutim tlacitka) /*—–( Import needed libraries )—–*/ #include <LiquidCrystal.h> #include <SD.h> #include <Wire.h> #include „RTClib.h“ #include <interval.h> #include <IRremoteInt.h> #include „IRremote.h“ /*—–( Declare Constants )—–*/ int receiver = 2; // pin 1 of IR receiver to Arduino digital pin 11 int teplVenk = 1; //Cidlo Commet int vlhkVenk = 0; //Cidlo Commet int topTepl = 3; //Pt100 topení teplá int topStud = 2; //Pt100 topení studena int tlacitko = 0; // #1 - ID cislo tlacitka /*—–( Declare objects )—–*/ IRrecv irrecv(receiver); // create instance of ‚irrecv‘ decode_results results; // create instance of ‚decode_results‘ File logfile; Interval blink; LiquidCrystal lcd(3, 4, 5, 6, 7, 8); // initialize the library with the numbers of the interface pins RTC_DS1307 RTC; // define the Real Time Clock object /*—–( Declare Variables )—–*/ const int chipSelect = 10; const long blinkinterval = 100; // interval at which to blink (milliseconds) void setup(){ /*—-( SETUP: RUNS ONCE )—-*/ Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver lcd.begin(16,2); Wire.begin(); RTC.begin(); //—————————————- if (! RTC.isrunning()) { Serial.println(„RTC is NOT running!“); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } //——————————- Serial.print(„Initializing SD card…“); pinMode(SS, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println(„Card failed, or not present“); // don’t do anything more: while (1) ; } Serial.println(„card initialized.“); // create a new file char filename[] = „METEO_00.CSV“; for (uint8_t i = 0; i < 100; i++) { filename[6] = i/10 + ‚0‘; filename[7] = i%10 + ‚0‘; if (! SD.exists(filename)) { // only open a new file if it doesn’t exist logfile = SD.open(filename, FILE_WRITE); break; // leave the loop! } } Serial.print(„Logging to: „); Serial.println(filename); logfile.println(„Datum, TeplotaVenku, VlhkostVenku, TopeniTepla, TopeniStudena“); tlacitko = 0; // #1 - nastaveni vychozi hodnoty }/*–(end setup )—*/ void loop(){ /*—-( LOOP: RUNS CONSTANTLY )—-*/ if (irrecv.decode(&results)) { // have we received an IR signal? // Serial.println(results.value, HEX); UN Comment to see raw values translateIR(); irrecv.resume(); // receive the next value } //——————————————————– int SCteplVenk = analogRead(teplVenk); SCteplVenk = map(SCteplVenk, 0, 1023, -20, 50); int SCvlhkVenk = analogRead(vlhkVenk); SCvlhkVenk = map(SCvlhkVenk, 0, 1023, 0, 100); int SCtopTepl = analogRead(topTepl); SCtopTepl = map(SCtopTepl, 0, 1023, 10, 120); int SCtopStud = analogRead(topStud); SCtopStud = map(SCtopStud, 0, 1023, 10, 120); String dataString = „“; DateTime now = RTC.now(); //———————————————————– if (blink.expired()) { blink.set(blinkinterval); // set new interval period logfile.print(now.year(), DEC); logfile.print(„/“); logfile.print(now.month(), DEC); logfile.print(„/“); logfile.print(now.day(), DEC); logfile.print(„,“); logfile.print(now.hour(), DEC); logfile.print(„:“); logfile.print(now.minute(), DEC); logfile.print(„,“); //———————————————————– logfile.print(SCteplVenk); logfile.print(„,“); logfile.print(SCvlhkVenk); logfile.print(„,“); logfile.print(SCtopTepl); logfile.print(„,“); logfile.print(SCtopStud); logfile.print(„,“); // delay(10000); //čekej 10minut //———————————————————— logfile.println(dataString); logfile.flush(); } //———————————————————– zobraz(); // #1 - vykresleni obrazovky }/* –(end main loop )– */ /*—–( Declare User-written Functions )—–*/ void translateIR(){ // takes action based on IR code received /* #1 duplicitni funkce int SCteplVenk = analogRead(teplVenk); SCteplVenk = map(SCteplVenk, 0, 1023, -20, 50); int SCvlhkVenk = analogRead(vlhkVenk); SCvlhkVenk = map(SCvlhkVenk, 0, 1023, 0, 100); int SCtopTepl = analogRead(topTepl); SCtopTepl = map(SCtopTepl, 0, 1023, 10, 120); int SCtopStud = analogRead(topStud); SCtopStud = map(SCtopStud, 0, 1023, 10, 120); // describing KEYES Remote IR codes */ // int tlacitko = 0; // #1 - zruseni switch(results.value){ case 0x141: tlacitko = 1; /* #1 - zruseni Serial.println(“ zmacknuto tlacitko 1 „); lcd.setCursor(0, 0); // set the cursor to (0,0): lcd.print(SCteplVenk); lcd.setCursor(0, 1); lcd.print(SCvlhkVenk); lcd.setCursor(3, 0); lcd.print(„C – Teplota“); lcd.setCursor(3, 1); lcd.print(„% – Vlhkost“); */ break; case 0x942: tlacitko = 2; /* #1 Serial.println(“ zmacknuto tlacitko 2 „); lcd.setCursor(0, 0); lcd.print(SCtopTepl); lcd.setCursor(0, 1); lcd.print(SCtopStud); lcd.setCursor(3, 0); lcd.print(„C – Kotel HOT“); lcd.setCursor(3, 1); lcd.print(„C – Kotel COLD“); */ break; case 0x143: tlacitko = 3; /* #1 Serial.println(“ zmacknuto tlacitko 3 „); */ break; case 0x944: tlacitko = 4; /* #1 Serial.println(“ zmacknuto tlacitko 4 „); */ break; case 0x145: tlacitko = 5; /* #1 Serial.println(“ zmacknuto tlacitko 5 „); */ break; case 0x946: tlacitko = 6; /* #1 Serial.println(“ zmacknuto tlacitko 6 „); */ break; case 0x147: tlacitko = 7; /* #1 Serial.println(“ zmacknuto tlacitko 7 „); */ break; case 0x948: tlacitko = 8; /* #1 Serial.println(“ zmacknuto tlacitko 8 „); */ break; case 0x149: tlacitko = 9; /* #1 Serial.println(“ zmacknuto tlacitko 9 „); */ break; case 0x940: tlacitko = 0; /* #1 Serial.println(“ zmacknuto tlacitko 0 „); */ break; default: /* #1 Serial.println(“ jine tlacitko „); */ }// End Case } //END translateIR void zobraz(){ // #1 - funkce vykresleni obrazovky switch(tlacitko){ case 1: Serial.println(“ zmacknuto tlacitko 1 „); lcd.setCursor(0, 0); // set the cursor to (0,0): lcd.print(SCteplVenk); lcd.setCursor(0, 1); lcd.print(SCvlhkVenk); lcd.setCursor(3, 0); lcd.print(„C – Teplota“); lcd.setCursor(3, 1); lcd.print(„% – Vlhkost“); break; case 2: Serial.println(“ zmacknuto tlacitko 2 „); lcd.setCursor(0, 0); lcd.print(SCtopTepl); lcd.setCursor(0, 1); lcd.print(SCtopStud); lcd.setCursor(3, 0); lcd.print(„C – Kotel HOT“); lcd.setCursor(3, 1); lcd.print(„C – Kotel COLD“); break; case 3: Serial.println(“ zmacknuto tlacitko 3 „); break; case 4: Serial.println(“ zmacknuto tlacitko 4 „); break; case 5: Serial.println(“ zmacknuto tlacitko 5 „); break; case 6: Serial.println(“ zmacknuto tlacitko 6 „); break; case 7: Serial.println(“ zmacknuto tlacitko 7 „); break; case 8: Serial.println(“ zmacknuto tlacitko 8 „); break; case 9: Serial.println(“ zmacknuto tlacitko 9 „); break; case 0: Serial.println(“ zmacknuto tlacitko 0 „); break; default: Serial.println(“ jine tlacitko „); } }
28.11.2016 v 9:48 #9327posjirkaÚčastníkpo testu klidne zakomentovane casti smaz … bude to prehlednejsi
28.11.2016 v 10:01 #9328NavryÚčastníkJsi zlatý, díky za pomoc. Jak budu večer doma, tak hned vyzkouším.
Ještě jednou DÍKY!28.11.2016 v 17:29 #9329NavryÚčastníkTakže jsem vytvořil kod k testování a funguje tak jak potřebuji
Jenom v tom,tebou upraveném kódu musím ponechat ve „voidech“:/* #1 duplicitni funkce
int SCteplVenk = analogRead(teplVenk);
SCteplVenk = map(SCteplVenk, 0, 1023, -20, 50);int SCvlhkVenk = analogRead(vlhkVenk);
SCvlhkVenk = map(SCvlhkVenk, 0, 1023, 0, 100);int SCtopTepl = analogRead(topTepl);
SCtopTepl = map(SCtopTepl, 0, 1023, 10, 120);int SCtopStud = analogRead(topStud);
SCtopStud = map(SCtopStud, 0, 1023, 10, 120);
// describing KEYES Remote IR codes
*/
Jinak mě to píše při kompilaci,že nemám deklarované proměnné.
V které části programu je mám deklarovat aby byly dostupné ve všech „voidech“?TESTOVACI KOD:
int Kod1; int Kod2; int Kod3; int KodVal = 0; int tlacitko = 0; //------------------------------------------------------------------ // ostatni promenne void setup() { Serial.begin(9600); pinMode(Kod1, INPUT); pinMode(Kod2, INPUT); pinMode(Kod3, INPUT); tlacitko = 1; } //================================================================== void loop() { Kod1 = digitalRead(2); Kod2 = digitalRead(3); Kod3 = digitalRead(4); delay (100); Kod(); zobraz(); } //=================================================================== void Kod() { KodVal = (Kod1) + (2*Kod2) + (4*Kod3); // výpočet binární hodnoty switch(KodVal){ case 1: tlacitko = 1; break; case 2: tlacitko = 2; break; case 3: tlacitko = 3; break; case 4: tlacitko = 4; break; case 5: tlacitko = 5; break; case 6: tlacitko = 6; break; case 7: tlacitko = 7; break; case 8: tlacitko = 8; break; case 9: tlacitko = 9; break; case 10: tlacitko = 10; break; default: break; } } //================================================================== void zobraz(){ // #1 - funkce vykresleni obrazovky switch(tlacitko){ case 1: Serial.println(" zmacknuto tlacitko 1 "); break; case 2: Serial.println(" zmacknuto tlacitko 2 "); break; case 3: Serial.println(" zmacknuto tlacitko 3 "); break; case 4: Serial.println(" zmacknuto tlacitko 4 "); break; case 5: Serial.println(" zmacknuto tlacitko 5 "); break; case 6: Serial.println(" zmacknuto tlacitko 6 "); break; case 7: Serial.println(" zmacknuto tlacitko 7 "); break; case 8: Serial.println(" zmacknuto tlacitko 8 "); break; case 9: Serial.println(" zmacknuto tlacitko 9 "); break; case 10: Serial.println(" zmacknuto tlacitko 10 "); break; default: Serial.println(" jine tlacitko "); break; } }
28.11.2016 v 21:28 #9330posjirkaÚčastníkúplně na začátku. Tam kde máš
int tlacitko = 0;
jsem rád, že to funguje jak potřebuješ … jen při tom deklarování proměných nezapomeň že je už jednou máš, tak je nemůžeš deklarovat znovu ve funkcích.
Těm proměnným deklarovaným na začátku se pak říká globální proměnné. tzn. jsou společné pro všechny funkce/metody. -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.