Arduino + keypad a odosielanie udajov
Arduino + keypad a odosielanie udajov
Ahojte, vedel by mi niekto poradit?
Chcem si urobit solarny regulator na bazen, a chcem zadavat hodnoty pomocov klavesnice, a odoslat ich do zariadenia.. najlepsie to ukazuje toto video:https://www.youtube.com/watch?v=TJREzBJv_eg (zada hodnotu, odosle, nieco sa deje)
Program:
Arduino bude sledovat teplotu X, ktoru mozem upravit cez klavesnicu, na mne vyhovujucu.. Napriklad 40, 50 a viac.. nasledne zapne cerpadlo a podobne.. Ako zadam hodnotu X tak, ze si to arduino zapamata, moze byt aj 3 miestna, ba i viac.. napriklad 100..
Nie som uplny novacik, ale toto je pre mna este trosku mutna voda.. snazim sa tomu pochopit, no neviem ako arduino chape cisla.. nechcem nikoho zatazovat, no velmi by ste mi pomohli..
Dakujem, majte sa krasne, a vela radosti
Chcem si urobit solarny regulator na bazen, a chcem zadavat hodnoty pomocov klavesnice, a odoslat ich do zariadenia.. najlepsie to ukazuje toto video:https://www.youtube.com/watch?v=TJREzBJv_eg (zada hodnotu, odosle, nieco sa deje)
Program:
Arduino bude sledovat teplotu X, ktoru mozem upravit cez klavesnicu, na mne vyhovujucu.. Napriklad 40, 50 a viac.. nasledne zapne cerpadlo a podobne.. Ako zadam hodnotu X tak, ze si to arduino zapamata, moze byt aj 3 miestna, ba i viac.. napriklad 100..
Nie som uplny novacik, ale toto je pre mna este trosku mutna voda.. snazim sa tomu pochopit, no neviem ako arduino chape cisla.. nechcem nikoho zatazovat, no velmi by ste mi pomohli..
Dakujem, majte sa krasne, a vela radosti
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Arduino + keypad a odosielanie udajov
Danú hodnotu, ktorú si načítaš uložíš do EEPROM pamäte.
Zapisuje sa od zvolenej adresy EEPROM pamäte, celkovo má Arduino (Uno) k dispozícii 512B, teda miesta pre zápis máš dosť.
Na konci zapisovanej hodnoty (reťazca) sa vloží znak \0, čo je jeho terminátor.
Následne pri vyčítaní (od rovnakej adresy, od ktorej si zapisoval) to načíta hodnotu po ukončovací znak - \0.
Teda obsah môže vyzerať ako:
Ja som to pri Ethernet termostate robil tak, že som to zapisoval a načítaval ako String a ten som následne pretypoval cez String.toInt(), respektíve String.toFloat() na potrebnú premennú.
Používam tieto definície funkcií pre zápis a čítanie z EEPROM:
Použitie v programe:
Zapisuje sa od zvolenej adresy EEPROM pamäte, celkovo má Arduino (Uno) k dispozícii 512B, teda miesta pre zápis máš dosť.
Na konci zapisovanej hodnoty (reťazca) sa vloží znak \0, čo je jeho terminátor.
Následne pri vyčítaní (od rovnakej adresy, od ktorej si zapisoval) to načíta hodnotu po ukončovací znak - \0.
Teda obsah môže vyzerať ako:
- 50\0
- 49999999\0
- 123456\0
Ja som to pri Ethernet termostate robil tak, že som to zapisoval a načítaval ako String a ten som následne pretypoval cez String.toInt(), respektíve String.toFloat() na potrebnú premennú.
Používam tieto definície funkcií pre zápis a čítanie z EEPROM:
Kód: Vybrat vše
void writeString(char add, String data)
{
int _size = data.length();
int i;
for (i = 0; i < _size; i++)
{
EEPROM.write(add + i, data[i]);
}
EEPROM.write(add + _size, '\0'); //Add termination null character for String Data
}
String read_String(char add)
{
int i;
char data[100]; //Max 100 Bytes
int len = 0;
unsigned char k;
k = EEPROM.read(add);
while (k != '\0' && len < 500) //Read until null character
{
k = EEPROM.read(add + len);
data[len] = k;
len++;
}
data[len] = '\0';
return String(data);
}
Kód: Vybrat vše
writeString(10, "0.25"); //zápis hodnoty 0.25 (String) od adresy 10
String referencia = read_String(10); //nacitame String "0.25" od adresy 10
float referencia_teplota = referencia.toFloat(); //pretypujeme String "0.25" na float 0.25
Re: Arduino + keypad a odosielanie udajov
Ta hodnota může mít uložena i v ram, a pak stačí nový záznam uloži. No a jak je to na tom videu, tak pak už jen se načte ten nový záznam.
Re: Arduino + keypad a odosielanie udajov
Před nedávnem jsem tu byl poučen, že se dají použít jednodušší funkce:
EEPROM.put(address, data)
EEPROM.get(address, data)
Vlákno na fóru:
https://arduino-forum.cz/viewtopic.php?f=4&t=2394
Sám jsem to ale ještě nezkoušel.
EEPROM.put(address, data)
EEPROM.get(address, data)
Vlákno na fóru:
https://arduino-forum.cz/viewtopic.php?f=4&t=2394
Sám jsem to ale ještě nezkoušel.
Re: Arduino + keypad a odosielanie udajov
Jak dostat číslo z klávesnice do arduina? Z klávesnice leze vždy jen jeden znak. Ale ty potřebuješ zadat 1-4místné číslo.
Mám proměnnou vkladaneCislo = 0.
Vždy když přímu znak z klávesnice vynásobím vkladaneCislo * 10 a pak k nemu prictu hodnotu z klávesnice.
Tak pokračuji do té doby, než stisknu "enter" ... po tom provedu nějakou akci (uložím do paměti, pošlu po i2c ... atd) a vkladaneCislo si opět nastavím na 0.
Např mačkáš 159.
0 * 10 + 1 = 1
1 * 10 + 5 = 15
15 * 10 + 9 = 159 <- a mám ho v proměnné
s desetiným číslem to děláš podobně ... jen počítáš navíc kolik znaků je za desetinou čárkou (a rovnou hlídáš jestli ti tam nějakej koumák necpe druhou desetinou čárku) ... abys vložené číslo mohl dělit 10 * pocetZnakuZaCarkou. (Pozor, aby ti nenastala situace, kdy dělíš nulou)
Mám proměnnou vkladaneCislo = 0.
Vždy když přímu znak z klávesnice vynásobím vkladaneCislo * 10 a pak k nemu prictu hodnotu z klávesnice.
Tak pokračuji do té doby, než stisknu "enter" ... po tom provedu nějakou akci (uložím do paměti, pošlu po i2c ... atd) a vkladaneCislo si opět nastavím na 0.
Např mačkáš 159.
0 * 10 + 1 = 1
1 * 10 + 5 = 15
15 * 10 + 9 = 159 <- a mám ho v proměnné
s desetiným číslem to děláš podobně ... jen počítáš navíc kolik znaků je za desetinou čárkou (a rovnou hlídáš jestli ti tam nějakej koumák necpe druhou desetinou čárku) ... abys vložené číslo mohl dělit 10 * pocetZnakuZaCarkou. (Pozor, aby ti nenastala situace, kdy dělíš nulou)
Re: Arduino + keypad a odosielanie udajov
martinius96 píše: ↑13 srp 2020, 12:31Danú hodnotu, ktorú si načítaš uložíš do EEPROM pamäte.
Zapisuje sa od zvolenej adresy EEPROM pamäte, celkovo má Arduino (Uno) k dispozícii 512B, teda miesta pre zápis máš dosť.
Na konci zapisovanej hodnoty (reťazca) sa vloží znak \0, čo je jeho terminátor.
Následne pri vyčítaní (od rovnakej adresy, od ktorej si zapisoval) to načíta hodnotu po ukončovací znak - \0.
Teda obsah môže vyzerať ako:
- 50\0
- 49999999\0
Jednoducho si vždy načítaš až tú dĺžku, ktorú si zapísal, pretože sa to načíta až po \0.
- 123456\0
Ja som to pri Ethernet termostate robil tak, že som to zapisoval a načítaval ako String a ten som následne pretypoval cez String.toInt(), respektíve String.toFloat() na potrebnú premennú.
Používam tieto definície funkcií pre zápis a čítanie z EEPROM:Použitie v programe:Kód: Vybrat vše
void writeString(char add, String data) { int _size = data.length(); int i; for (i = 0; i < _size; i++) { EEPROM.write(add + i, data[i]); } EEPROM.write(add + _size, '\0'); //Add termination null character for String Data } String read_String(char add) { int i; char data[100]; //Max 100 Bytes int len = 0; unsigned char k; k = EEPROM.read(add); while (k != '\0' && len < 500) //Read until null character { k = EEPROM.read(add + len); data[len] = k; len++; } data[len] = '\0'; return String(data); }
Kód: Vybrat vše
writeString(10, "0.25"); //zápis hodnoty 0.25 (String) od adresy 10 String referencia = read_String(10); //nacitame String "0.25" od adresy 10 float referencia_teplota = referencia.toFloat(); //pretypujeme String "0.25" na float 0.25
Prosim ta, mozes mi to lepsie popisat, paci sa mi to ako to mas vyriesene, len sa troskus tracam v tom co je vstup, vystup.. co vstupuje do tvojej funkcie write, a co read.. ako pomenovat svoje premenne.. :/
Kód: Vybrat vše
char keypressed;
byte data_count = 0;
char data[100]; //je to spravne???
void setup() {
Serial.begin(9600); // Initialise the serial monitor
}
void loop() {
keypressed = customKeypad.getKey();
if (keypressed){
data[data_count] = keypressed;
data_count++;
}
if (keypressed == 'A'){
writeString();
}
if (keypressed == 'B'){
read_String();
}
}
postupne mi pridava znaky do nejakej "matice".. a teraz uz ked mam vsetko co chcem, chcel by som to odoslat do EEROM a teda zapisat.. to co sa to zapisuje, sa u mna vola "data" a "data_count" je cislo stlpca, ktory sa kazdym znakom meni.. Pochopil som tomu spravne?? a tento retazec, treba teraz spojit a nakoniec pridat /0?
Kód: Vybrat vše
void writeString(char add, String data) ->nepoznam tento zapis :(
{
int _size = data.length();
int i;
for (i = 0; i < _size; i++)
{
EEPROM.write(add + i, data[i]);
}
EEPROM.write(add + _size, '\0'); //Add termination null character for String Data
}
co v podstate potrebujem ja vytvorit? ktore premenne? trosku sa mylim void writeString(char add, String data) -> co zobrazuje tento zapis?? co namiesto char add a namiesto string data?? - respektive ako svoje premenne premenovat?
Re: Arduino + keypad a odosielanie udajov
dakujem vsetkym za pomoc
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Arduino + keypad a odosielanie udajov
Ohľadom Keypadu ti veľmi nepodarím, nikdy som ho nemal a nepoužil, neviem akú knižnicu používaš.
Čo sa týka toho, ako používaš tie premenné, tak to robíš zle.
Všimni si definíciu funkcie pre zápis: void writeString(char add, String data)
Obsahuje 2 parametre t.j. adresu --> kam zapisujeme a String data, čo sú už konkrétne dáta, ktoré dávaš funkcii pre zápis.
Funkcia je typu void, nemá návratový typ. Taktiež v tele funkcie sa využívajú funkcie Stringu pre dĺžku a pod.
Druhá funkcia pre čítanie z EEPROM String read_String(char add) má návratový typ String a parameter add --> odkiaľ z EEPROM začíname načítavať.
Nepoužívaš správne dátové typy a takto sa ti to myslím ani neskompiluje. Potrebuješ si načítať znak a previesť ho na String.
Nič nemáš premenovávať, len použiť a vložiť tvoje premenné! Je to predpis - definícia.. To, čo mu vložíš, s tým pracuje.. To nemá nič spoločné s tým, že je tam String data, tak musíš mu dať String data.. Prečítaš si niečo o definíciách funkcií.
To, že je tam char addr a String data neznamená, že mu musíš dať char addr a String data.. Pri volaní funkcie tam môžeš dať pokojne aj vlastnú premennú:
Urobil som ten program tak, aby si to dynamicky načítaval.. Napríklad 12321498494989 a po stlačení A to odošleš do EEPROM. Pri stlačení B vyčítaš to, čo si tam zapísal.
Teda to skús asi takto, mohlo by to fungovať:
Čo sa týka toho, ako používaš tie premenné, tak to robíš zle.
Všimni si definíciu funkcie pre zápis: void writeString(char add, String data)
Obsahuje 2 parametre t.j. adresu --> kam zapisujeme a String data, čo sú už konkrétne dáta, ktoré dávaš funkcii pre zápis.
Funkcia je typu void, nemá návratový typ. Taktiež v tele funkcie sa využívajú funkcie Stringu pre dĺžku a pod.
Druhá funkcia pre čítanie z EEPROM String read_String(char add) má návratový typ String a parameter add --> odkiaľ z EEPROM začíname načítavať.
Nepoužívaš správne dátové typy a takto sa ti to myslím ani neskompiluje. Potrebuješ si načítať znak a previesť ho na String.
Nič nemáš premenovávať, len použiť a vložiť tvoje premenné! Je to predpis - definícia.. To, čo mu vložíš, s tým pracuje.. To nemá nič spoločné s tým, že je tam String data, tak musíš mu dať String data.. Prečítaš si niečo o definíciách funkcií.
To, že je tam char addr a String data neznamená, že mu musíš dať char addr a String data.. Pri volaní funkcie tam môžeš dať pokojne aj vlastnú premennú:
Kód: Vybrat vše
String abcd = "123456";
writeString(100, abcd); //a bude to fungovať normálne...
Teda to skús asi takto, mohlo by to fungovať:
Kód: Vybrat vše
#include <EEPROM.h>
String OurString = ""; //tu budeme načítavať --> glob. premenná
void writeString(char add, String data)
{
int _size = data.length();
int i;
for (i = 0; i < _size; i++)
{
EEPROM.write(add + i, data[i]);
}
EEPROM.write(add + _size, '\0'); //Add termination null character for String Data
}
String read_String(char add)
{
int i;
char data[100]; //Max 100 Bytes --> mozne zmenit
int len = 0;
unsigned char k;
k = EEPROM.read(add);
while (k != '\0' && len < 500) //Read until null character
{
k = EEPROM.read(add + len);
data[len] = k;
len++;
}
data[len] = '\0';
return String(data);
}
void setup() {
Serial.begin(9600); // Initialise the serial monitor
}
void loop() {
char keypressed = customKeypad.getKey();
if (keypressed) {
if (keypressed == 'A') {
writeString(100, OurString ); //zapisujeme do EEPROM od adresy 100 a nase data ulozene v globalnej premennej
OurString = ""; //nas dynamicky String si mozeme vyprazdnit
} else if (keypressed == 'B') {
String nacitane_z_EEPROM = read_String(100); //pri znaku B si vycitame a vypiseme obsah z EEPROM z adresy 100
Serial.print("Z EEPROM som nacital toto: ");
Serial.println(nacitane_z_EEPROM);
} else {
OurString += keypressed; //budeme nacitavat znaky ak su ine ako znak A
}
}
}
Re: Arduino + keypad a odosielanie udajov
dakujem za pomoc!! naoazj si mi pomohol, tak dufam ze neodmietnes maly darcek na podporu odomna na PP..
prekonvertoval som to, krasne mi to funguje, maj sa krasne, a vela radosti vidiet ze sa tomu venujes, a to si vazim
prekonvertoval som to, krasne mi to funguje, maj sa krasne, a vela radosti vidiet ze sa tomu venujes, a to si vazim
-
- Příspěvky: 579
- Registrován: 01 srp 2017, 19:29
- Bydliště: Poprad
- Kontaktovat uživatele:
Re: Arduino + keypad a odosielanie udajov
Som rád, že to funguje a vážim si aj štedrý darček, potešil ma, ďakujem
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů