Arduino + keypad a odosielanie udajov

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Arduino + keypad a odosielanie udajov

Příspěvek od byfo » 13 srp 2020, 11:37

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

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Arduino + keypad a odosielanie udajov

Příspěvek od martinius96 » 13 srp 2020, 12:31

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:
  • 50\0
  • 49999999\0
  • 123456\0
Jednoducho si vždy načítaš až tú dĺžku, ktorú si zapísal, pretože sa to načíta až po \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);
}

Použitie v programe:

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

ArduXPP
Příspěvky: 361
Registrován: 14 pro 2017, 19:31
Reputation: 0
Kontaktovat uživatele:

Re: Arduino + keypad a odosielanie udajov

Příspěvek od ArduXPP » 13 srp 2020, 12:54

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.

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Arduino + keypad a odosielanie udajov

Příspěvek od AstroMiK » 13 srp 2020, 13:04

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.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Arduino + keypad a odosielanie udajov

Příspěvek od kiRRow » 13 srp 2020, 15:56

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)

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Re: Arduino + keypad a odosielanie udajov

Příspěvek od byfo » 15 srp 2020, 13:18

martinius96 píše:
13 srp 2020, 12:31
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:
  • 50\0
  • 49999999\0
  • 123456\0
Jednoducho si vždy načítaš až tú dĺžku, ktorú si zapísal, pretože sa to načíta až po \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);
}

Použitie v programe:

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? :( :shock:

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Re: Arduino + keypad a odosielanie udajov

Příspěvek od byfo » 15 srp 2020, 13:35

dakujem vsetkym za pomoc

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Arduino + keypad a odosielanie udajov

Příspěvek od martinius96 » 15 srp 2020, 14:12

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ú:

Kód: Vybrat vše

String abcd = "123456"; 
writeString(100, abcd); //a bude to fungovať normálne... 
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ť:

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
    }
  }
} 

byfo
Příspěvky: 25
Registrován: 13 srp 2020, 11:25
Reputation: 0

Re: Arduino + keypad a odosielanie udajov

Příspěvek od byfo » 15 srp 2020, 14:59

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

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Arduino + keypad a odosielanie udajov

Příspěvek od martinius96 » 15 srp 2020, 17:10

Som rád, že to funguje a vážim si aj štedrý darček, potešil ma, ďakujem ;)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 11 hostů