Aruino v-meter
Moderátor: Moderátori
Aruino v-meter
Dobrý deň. Zdravím všetkých arduino nadšencov. Mám k vám prosbu. Na nete som našiel tento projekt, ktorý sa náramne hodí do môjho návrhu konštrukcie.
[code]
void setup(){
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
Serial.begin(9600);
}
void loop(){
int sensorValue = analogRead(A0);
Serial.print("Decimal=");
Serial.print(sensorValue);
Serial.print("\tBinary=");
Serial.println(sensorValue,BIN);
if(sensorValue>=0&&sensorValue<=1023){
digitalWrite(13,(sensorValue&4));
digitalWrite(12,(sensorValue&8));
digitalWrite(11,(sensorValue&16));
digitalWrite(10,(sensorValue&32));
digitalWrite(9,(sensorValue&64));
digitalWrite(8,(sensorValue&128));
digitalWrite(7,(sensorValue&256 )==256);
digitalWrite(6,(sensorValue&512 )==512);
}
delay(50);
}[/code]
Jedná sa vlastne o voltmeter s binárnym 10 bitovým výstupom. Prvé 2 bity som vypustil, aby som nemal také jemné rozlíšenie. Potreboval by som doplniť projekt o zápis a čítanie do internej eeprom, nejakým aretovaným tlačítkom, tzv "hold", na nejakom A1-A5 pine. Potrebujem hlavne pri vypnutí a zapnutí napájania, aby sa nastavila posledná hodnota výstupov, nezávisle na stave A0 vstupe. No a tu je môj problém. Nech hľadím do rôznych príručiek a eeprom, tým viac tomu nerozumiem a absolutne nechápem princíp. Akékoľvek moje úpravy s eeprom.h, projekt tvrdohlavo odmieta spoluprácu. Prosím vás, ak niekto má čas a pomôže mi to rozchodiť, budem vám veľmi vďačný. Ďakujem.
[code]
void setup(){
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
Serial.begin(9600);
}
void loop(){
int sensorValue = analogRead(A0);
Serial.print("Decimal=");
Serial.print(sensorValue);
Serial.print("\tBinary=");
Serial.println(sensorValue,BIN);
if(sensorValue>=0&&sensorValue<=1023){
digitalWrite(13,(sensorValue&4));
digitalWrite(12,(sensorValue&8));
digitalWrite(11,(sensorValue&16));
digitalWrite(10,(sensorValue&32));
digitalWrite(9,(sensorValue&64));
digitalWrite(8,(sensorValue&128));
digitalWrite(7,(sensorValue&256 )==256);
digitalWrite(6,(sensorValue&512 )==512);
}
delay(50);
}[/code]
Jedná sa vlastne o voltmeter s binárnym 10 bitovým výstupom. Prvé 2 bity som vypustil, aby som nemal také jemné rozlíšenie. Potreboval by som doplniť projekt o zápis a čítanie do internej eeprom, nejakým aretovaným tlačítkom, tzv "hold", na nejakom A1-A5 pine. Potrebujem hlavne pri vypnutí a zapnutí napájania, aby sa nastavila posledná hodnota výstupov, nezávisle na stave A0 vstupe. No a tu je môj problém. Nech hľadím do rôznych príručiek a eeprom, tým viac tomu nerozumiem a absolutne nechápem princíp. Akékoľvek moje úpravy s eeprom.h, projekt tvrdohlavo odmieta spoluprácu. Prosím vás, ak niekto má čas a pomôže mi to rozchodiť, budem vám veľmi vďačný. Ďakujem.
0
Re: Aruino v-meter
Programátor musí byť absolútne dôsledný.
1. Oprav si nadpis.
2. Asi si zle použil ikonku na vkladanie kódu.
3. Aké Arduino? Nie všetky majú EEPROM.
4. Kód, čo si dal, neobsahuje nič s EEPROM.
Arduino IDE má príklady na použitie EEPROM. Pozeral si, skúšal? Čo konkrétne nefunguje?
1. Oprav si nadpis.
2. Asi si zle použil ikonku na vkladanie kódu.
3. Aké Arduino? Nie všetky majú EEPROM.
4. Kód, čo si dal, neobsahuje nič s EEPROM.
Arduino IDE má príklady na použitie EEPROM. Pozeral si, skúšal? Čo konkrétne nefunguje?
0
Re: Aruino v-meter
Ahoj budvar10, rád ťa opäť "vidím".
K tvojim otázkam.
Programátor musí byť absolútne dôsledný.
1. Oprav si nadpis.------------- Neviem aký nadpis máš na mysli
2. Asi si zle použil ikonku na vkladanie kódu.------------------ Áno, zabudol som odfajknúť zakazanie BBCode
3. Aké Arduino? Nie všetky majú EEPROM.----------------Mega328 má eeprom, či?
4. Kód, čo si dal, neobsahuje nič s EEPROM.----------------- Áno program je viacmenej originál z netu, jemne upravený k môjmu účelu. Tam nič nie je o eeprom. Preto píšem o úpravu programu, čo a kde vložiť a tak podobne. Samozrejme, ak sa to dá. Viem, že treba #include "EEPROM.h", že existuje EEPROM. get, EEPROM.put, ale ako to použiť, to je moc na mňa.
K tvojim otázkam.
Programátor musí byť absolútne dôsledný.
1. Oprav si nadpis.------------- Neviem aký nadpis máš na mysli
2. Asi si zle použil ikonku na vkladanie kódu.------------------ Áno, zabudol som odfajknúť zakazanie BBCode
3. Aké Arduino? Nie všetky majú EEPROM.----------------Mega328 má eeprom, či?
4. Kód, čo si dal, neobsahuje nič s EEPROM.----------------- Áno program je viacmenej originál z netu, jemne upravený k môjmu účelu. Tam nič nie je o eeprom. Preto píšem o úpravu programu, čo a kde vložiť a tak podobne. Samozrejme, ak sa to dá. Viem, že treba #include "EEPROM.h", že existuje EEPROM. get, EEPROM.put, ale ako to použiť, to je moc na mňa.
0
Re: Aruino v-meter
Ahoj budvar10, rád ťa opäť "vidím".
Arduino v-meterNeviem aký nadpis máš na mysli
Áno, má. UNO alebo Nano, tak?Mega328 má eeprom, či?
https://docs.arduino.cc/learn/built-in- ... es/eeprom/EEPROM. get, EEPROM.put, ale ako to použiť, to je moc na mňa.
Sú tam aj príklady.
Kód: Vybrať všetko
EEPROM.put(address, data);
EEPROM.get(address, data);
int vystup_posledny_stav = 234;
EEPROM.put(0x00, vystup_posledny_stav); //ulozis
EEPROM.get(0x00, vystup_posledny_stav); //precitas
Je dobré vedieť veľkosť premennej. Napr. int je 2 bytes, t.j. ďalšiu premennú môžeš uchovať až na adrese 0x02.
0
Re: Aruino v-meter
No jo. S tým nadpisom SORRY, nevšimol som si to. Ale inak si rozumieme? A ten odkaz -jojoj angličtina, nemáš v talone aj niečo po našom irečitom - slovak language?
0
Re: Aruino v-meter
No, ja som z toho ... Dal som to do translatora, ale aj tak to nevlezie do mojej palice. Potrebujem v zapojení použiť tlačítko, kde pri stlačení urobí zápis, (memory), na výstupných pinoch a ignoruje stav vstupu A0. Po uvolnení tlačítka oätovne obnoví funkciu čítania stavu na vstupe A0. Pri vypnutí a zapnutí napájania potrebujem aby načítalo stav posledného zápisu tlačítka pred vypnutím. A to mám problém, implementovať tlačítko na túto funkciu. Úplne ideálne funguje zapojenie s prevodníkom ADC0804 akurát nemá eeprom pamäť, takže po zapnutí napájania, je stav výstupov závislý na stave vstupného napätia.
0
- mclareniak
- Zaslúžilý člen
- Príspevky: 1212
- Dátum registrácie: 21 Feb 2008, 00:00
- Bydlisko: okr. Prievidza
Re: Aruino v-meter
0
Keďže vedeniu fóra a niektorým užívateľom vadil obsah môjho podpisu, bol som požiadaný o odstránenie určitej časti. Preto som sa rozhodol odstrániť celý pôvodný podpis.
Re: Aruino v-meter
Tlačidlo, (ako rozsvietiť a zhasnúť led, to áno), ale myslim si, že to má súvis s prikazom do eeprom, tak to neviem. Ja som to už písal v starších príspevkoch že tie rôzne arduinovské príkazy neovládam, preto sa na vás obraciam s pomocou to spojazdniť. Ale, ak to je problém...?
Pre enigma -vieš si opraviť ten náslov ? - ak myslíš ten názov ( Aruino v-meter) tak prepáč. Myslím, že preklepov je v iných príspevkoch viac a netrhá to žily. A pritom každý vie o čo sa jedná.
Pre enigma -vieš si opraviť ten náslov ? - ak myslíš ten názov ( Aruino v-meter) tak prepáč. Myslím, že preklepov je v iných príspevkoch viac a netrhá to žily. A pritom každý vie o čo sa jedná.
0
Re: Aruino v-meter
Ale ty jsi byl na to upozorněný a místo jednoduché nápravy jsi arogantní.
To o tobě hodně vypovídá.
To o tobě hodně vypovídá.
0
Re: Aruino v-meter
Ak tlačidlom vieš rozsvieťiť/zhasnúť LED, podobne je to so zápisom do EEPROM. Skús dať nejaký kód. Čo nefunguje, skúsime sa pozrieť.
Potrebuješ uchovať stav pinov 6-13. Na to stačí jeden bajt.
Potrebuješ uchovať stav pinov 6-13. Na to stačí jeden bajt.
0
Re: Aruino v-meter
No ak niekto považuje preklep za aroganciu, tak sa vám všetkým ospravedlňujem. Opraviť to skutočne neviem, ako sa to robí? Otázku -vieš si opraviť ten náslov ? - v slovenskom jazyku, slovo - náslov- nepoznám, a nepozastavujem sa nad tým. Ale ak sa chcete rýpať v drobnostiach, môžme to ukončiť.
0
Re: Aruino v-meter
A to nejde definovat takhle ? :budvar10 napísal: ↑06 Apr 2024, 15:11Je dobré vedieť veľkosť premennej. Napr. int je 2 bytes, t.j. ďalšiu premennú môžeš uchovať až na adrese 0x02.Kód: Vybrať všetko
EEPROM.put(address, data); EEPROM.get(address, data); int vystup_posledny_stav = 234; EEPROM.put(0x00, vystup_posledny_stav); //ulozis EEPROM.get(0x00, vystup_posledny_stav); //precitas
Kód: Vybrať všetko
EEPROM.put(address, data);
EEPROM.get(address, data);
int vystup_posledny_stav = 234;
EEMEM int EE_vystup_posledny_stav;
EEPROM.put(&EE_vystup_posledny_stav, vystup_posledny_stav); //ulozis
EEPROM.get(&EE_vystup_posledny_stav, vystup_posledny_stav); //precitas
-----------------------------------------------------------------------------------------------------------------------------------------------------
Neznám Arduino, ale když používám EEPROM, tak definuju data uložená v EEPROM takto :
Kód: Vybrať všetko
#include<avr/eeprom.h>
EEMEM int EE_Data1, EE_Data2;
EEMEM float EE_Data3, EE_Data4;
Kód: Vybrať všetko
#include<avr/eeprom.h>
typedef struct ConfigurationStruct
{
unsigned char AcceptedAddress[WLESS_ADDRESS_LENGHT];
} ConfigurationStruct;
typedef struct EE_ConfigurationStruct
{
ConfigurationStruct Configuration;
unsigned int CheckSum;
} EE_ConfigurationStruct;
ConfigurationStruct Configuration;
EEMEM EE_ConfigurationStruct EE_Configuration, EE_Configuration_Backup;
A čtení pak podle toho.
0
Re: Aruino v-meter
@balu
Jedná sa o ATmega procesor, nielen to, že to je Arduino. Práca s EEPROM je trochu komplikovanejšia. Je potrebné si prečítať DS.
Nie takto, ako to píšeš, sa to síce nedá, ale nejdeš na to zle. EERef, tam už použiješ operátor priradenia, čo je definovaný. Problém je, že to nie je zdokumentované a ani v príkladoch to nie je. Pre začiatočníka asi nepoužiteľné, dokonca aj nebezpečné pre EEPROM. 100k zápisov a je po nej. Asi preto to nie je v dokumentácii.
To ale presahuje diskusiu v tomto vlákne o svetelý rok.
Samozrejme si môžeš vytvoriť definície na pozíciu v EEPROM. Čokoľvek, čo zvýši komfort.
alebo cez štruktúry. Ten stav výstupu sa dá ako bitové pole a celá alebo časť EEPROM ako štruktúra čítaná/zapisovaná ako jeden datový blok. Ale to už sa mi tu nechce rozpisovať. Možnosti sú.
Jedná sa o ATmega procesor, nielen to, že to je Arduino. Práca s EEPROM je trochu komplikovanejšia. Je potrebné si prečítať DS.
Nie takto, ako to píšeš, sa to síce nedá, ale nejdeš na to zle. EERef, tam už použiješ operátor priradenia, čo je definovaný. Problém je, že to nie je zdokumentované a ani v príkladoch to nie je. Pre začiatočníka asi nepoužiteľné, dokonca aj nebezpečné pre EEPROM. 100k zápisov a je po nej. Asi preto to nie je v dokumentácii.
To ale presahuje diskusiu v tomto vlákne o svetelý rok.
Samozrejme si môžeš vytvoriť definície na pozíciu v EEPROM. Čokoľvek, čo zvýši komfort.
Kód: Vybrať všetko
#define EE_VYSTUP_POSLEDNY_STAV 0 // postupne vytvorit komplet mapu EEPROM
#define EE_DALSIE_DATA 1
uint8_t vystup_posledny_stav;
void setup()
{
EEPROM.get(EE_VYSTUP_POSLEDNY_STAV, vystup_posledny_stav);
}
0
Re: Aruino v-meter
Zaujimave ze tam neni nikde if na kontrolu ci zapisana a zapisovana hodnota neni rovnaka. Za dalsie po 100tis zapisoch sa rozpadne ovlafacie tlacitko, takze eprom bude detail, okrem toho neverim ze zariadenie bude mat zivotnost taku dlhu aby sa vykonalo 100tis zapisov, skor zostarne cely ten projekt.
0
Re: Aruino v-meter
@Atlan
Technicky je tam if, vnútorne to používa funkciu update a tá kontroluje identické dáta.
So 100tis zápismi som nemyslel zápis cez tlačidlo, ale ten class EERef. Ten umožní definovať premennú v EE a pracovať s ňou podobne ako v normálnej RAM. Nejaký začiatočník tam dá napr. počítadlo a je vymaľované.
Ale je to tam a dá sa to použiť napr. aj:
EEPROM[0] = ...
Len ten EERef class som nevidel v dokumentácii.
EDIT:
Tu je ten "if":
Technicky je tam if, vnútorne to používa funkciu update a tá kontroluje identické dáta.
So 100tis zápismi som nemyslel zápis cez tlačidlo, ale ten class EERef. Ten umožní definovať premennú v EE a pracovať s ňou podobne ako v normálnej RAM. Nejaký začiatočník tam dá napr. počítadlo a je vymaľované.
Ale je to tam a dá sa to použiť napr. aj:
EEPROM[0] = ...
Len ten EERef class som nevidel v dokumentácii.
EDIT:
Tu je ten "if":
Kód: Vybrať všetko
EERef &update( uint8_t in ) { return in != *this ? *this = in : *this; }
0
Re: Aruino v-meter
To jsi mně asi úplně nepochopil. To, že se jedná o AVR procesor je mi jasné z jedné z reakcí výše, jak se pracuje s EEPROM u AVR procesorů vím už z doby, kdy jsem AVRka programoval v assembleru, ale s Aduinem nedělám a postup definice "proměnných" (v tomto případě asi lépe říci definice umístění dat v EEPROM), jak jsem jí uvedl v příkladu je standartní použití v Atmel Studiu (nově Microchip Studiu), tak jsem předpokládal, že stejně (podobně) se definují místa pro data uložená v EEPROM v Arduinu.
Definovat umístění dat v EEPROM (nebo jakékoliv paměti) tímto způsobem
Kód: Vybrať všetko
#define EE_VYSTUP_POSLEDNY_STAV 0 // postupne vytvorit komplet mapu EEPROM
#define EE_DALSIE_DATA 1
Dají se totiž definovat i konstanty (nelze je měnít) i v programové paměti :
Kód: Vybrať všetko
const unsigned char PROGMEM StartText[]="ESP8266 Klient.\r\n";
const unsigned char PROGMEM StartText2[]="Text from Klient.\r\n";
Dost pochybuju, že ti, kteří pracují s periferiemi tak, že zvládnout napsat maximálně XY.begin() a když to nefunguje, tak končí, že zvládnou počítat, kolik která proměnná potřebuje místa, aby pro ně "rezervovali" místo v EEPROM.
=======================================================================================
Pokud nelze umístění dat v EEPROM provést tak, jako v Atmel Studiu, nadefinoval bych proměnné, které se ukládají/čtou z EEPROM následujícím způsobem. Je to sice o něco pracnější, ale daleko bezpečnější.
1) Začal bych nadefinováním typu, který se jako blok bude do EEPROM ukládat :
Kód: Vybrať všetko
typedef struct EEPROM_DataStruct
{
int PromennaTypuInt;
int DruhaPromennaTypuInt;
unsigned int PromennaTypuUnsignedInt;
char PromennaChar;
char RetezecDlouhy19Znaku[20];
} EEPROM_DataStruct;
Kód: Vybrať všetko
EEPROM_DataStruct EEPROM_Data;
Kód: Vybrať všetko
EEPROM_Data.PromennaTypuInt = 1685;
EEPROM_Data.DruhaPromennaTypuInt = -276;
EEPROM_Data.PromennaTypuUnsignedInt = 19253;
EEPROM_Data.PromennaChar = 'C';
strcpy (EEPROM_Data.RetezecDlouhy19Znaku, "Testovací");
Kód: Vybrať všetko
UlozitDoEEPROM((unsigned char *)&EEPROM_Data, sizeof(EEPROM_Data), 0);
PrecistZEEPROM((unsigned char *)&EEPROM_Data, sizeof(EEPROM_Data), 0);
Kód: Vybrať všetko
void UlozitDoEEPROM(unsigned char *__Buffer, int __PocetBytu, int __StartAdresa)
{
for (int _Idx = 0 ; _Idx < __PocetBytu ; _Idx++ )
{
EEPROM.update(__StartAdresa + _Idx, __Buffer[Idx]);
}
}
void PrecistZEEPROM(unsigned char *__Buffer, int __PocetBytu, int __StartAdresa)
{
for (int _Idx = 0 ; _Idx < __PocetBytu ; _Idx++ )
{
__Buffer[_Idx] = EEPROM.read(__StartAdresa + _Idx);
}
}
0
Re: Aruino v-meter
@balu
Chápem čo píšeš. Ja už tiež Arduino veľmi nepoužívam. Ono sa to vyvíja a nejako to veľmi nesledujem.
Osobne si ale myslím, že najefektívnejšie je používať funkcie definované avrlib:
eeprom_read_block, eeprom_write_block pre blokový zápis atď.
Ono práca s AVR EEPROM má určité špecifiká a napr Arduino knižnica používa len eeprom_read_byte a eeprom_write_byte. Len tieto 2 funkcie a to nie je práve najefektívnejšie.
Chápem čo píšeš. Ja už tiež Arduino veľmi nepoužívam. Ono sa to vyvíja a nejako to veľmi nesledujem.
Osobne si ale myslím, že najefektívnejšie je používať funkcie definované avrlib:
eeprom_read_block, eeprom_write_block pre blokový zápis atď.
Ono práca s AVR EEPROM má určité špecifiká a napr Arduino knižnica používa len eeprom_read_byte a eeprom_write_byte. Len tieto 2 funkcie a to nie je práve najefektívnejšie.
0
-
- Podobné témy
- Odpovedí
- Zobrazení
- Posledný príspevok
-
- 3 Odpovedí
- 863 Zobrazení
-
Posledný príspevok od používateľa Lennox