Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lenne egy újabb kérdésem. Hogyan lehet EEPROM-ba negativ számot tárolni?
Az EEPROM könyvtár put(), get() függvényeivel bármilyen adattípust bele tudsz írni és ki tudsz olvasni az EEPROM-ból. A változók hosszára oda kell figyelned, mert az nem automatikus, nehogy átírd az egyik változó értékével a másikat, valamint ugyanolyan típusú változót olvass ki, mint amilyet beírtál.
Sziasztok!
Az alábbi kódban egy "ca" változóval is dolgoznék, és ennek a változónak használnám az aktuális állapotát a kódban később (még kezdő vagyok). Ha a ca változó értékét a switch utasítás előtt íratom ki, akkor értéke 2,3,4 közt változik érthetően. A switch végén viszont, amikor az értéke eléri a 4-et a változónak, visszaíratom 1-re. Ha ezután íratom ki a változót a com-ra, akkor viszont folyamatosan írja ciklusonként gondolom, hiába csak egyszer nyomtam meg. Ez így elfogadható, vagy van jobb megoldás? Azért kérdezem, mert később amikor a ca-ban található értékkel dolgoznék, nem mindegy, hogy annak értéke 1-3 közt vagy 2-4 közt változik. Köszi ha tudsz segíteni!
Gondolom a switch-et be kéne tenni a ca++ után. Így csak akkor fut le amikor a ca-t növeled
(esetleg a cb-nél is) vagy a switc-et tedd be külön függvénybe, és amikor kell meghívod, pl az első if-ben, meg a ca++ után... te tudod mikor kell
Gyanús nekem hogy az EEPROM.update ca és cb minden ciklus körbeforduláskor lefut, az eepromot sec perc alatt kinyírod. Az eepromnak írási élettartama van kb 100e-1milla, szóval csak akkor írjuk ha kell, nálad nincs semmilyen feltételben, folyamatosan pörög rajta a progi
Az update csak akkor írja az EEPROM-ot amikor változik az értéke, nem?
A második if a nyomógomb állapotát kiolvassa, majd ismét egy if ha gombnyomás történt akkor a léptetem a változó értékét, majd a switch figyeli e változó értéket és a változóban tárolt megfelelő értéknek állítja be az ahhoz tartozó kimenetet.
Közben rájöttem, hogy épp a switch-ben van a válasz, hisz az azt a kiemenetet kapcsolja, amilyen ahhoz tartozó érték van a változóban (ha egy a ca értéke, akkor a led1 fog jelezni). Szóval a serial.print nem azt mutatja amire kíváncsi vagyok, de csak azért, mert ő meg rossz helyen olvas ki szerintem.
Eeprom tartalmat altalaban shadow adattombe szoktak program futaskor irni olvasni.
Indilaskor az erprom tartalmat ide masoljak. Majd a teljes futasi idoben ezen az adattombon tekerik a bajtokat/biteket es nem az eeprom fizikai tarhelyet koptatjak. A shadow adattombot csak kikapcsolas elott irjak vissza az eeprom fizikai teruletere. Igen kerdezheted mi van veletlen el meno tap eseten? Jogos ... erre vannak a tapfesz allapotat figyelo belso elemek amik akar ilyenkor megszakitast generalva jeleznek. Ekkor ki lehet gyorsan irni a shadow adattombbol az eepromba a tartalmat. Igaz kezdokent nem olyan egyszeru a dolgod. Mindezt a kimeletesebb eeprom hasznalat miatt irom le. Masik opcio , hogy kulon 2 portot foglalsz ami igaz neha pocseklasnak tunhet. Egyiken eltudod kuldeni aludni a uC es fel is tudod ebreszteni. Masikon pedig egy izmosabb fettel /tranzisztorral kapcsolod a tapot az aramkor tobbi reszenek. Ekkor a kikapcsolas/altatas elott irod ki eepromba a megvaltozott bajtok tartalmat. Akar azt is megnezheted, hogy mik valtoztak meg? Csak azokat irod ki eepromba, amikhez nem nyultak valtozok azok eeprom tartalmat nem bantod. Igaz ekkor van egy " on/off portod" aminek allapot valtozasa inditja ezt a shadow adattomb/eeprom tartalom vizsgalatot es szukseges tartalmak kiirasat. Igaz itt is lehet tapfesz megszunese amikor azonnal kell menteni eepromba a shadow tomb tartalmat.
Bocs, igazad van, kevertem a write-val
update() Description Write a byte to the EEPROM. The value is written only if differs from the one already saved at the same address.
Nem kezelted le, hogy mi történik, ha a ca 5 vagy több lesz... És mivel "ca++;" -t használsz, ezért lehet 4-nél nagyobb is. Használhatnád: if (ca<3) ca++; -ezzel maximalizálva van 4-nél a változó értéke.
Vagy a switch-nél használj nagyobb vagy egyenlő jelet az utolsó ellenőrzésnél, nem tudom a "case ca>=4" működik-e, ki kell próbálni. Egyénként a switch...case-nek van egy default része is, ami akkor fut le, ha egyik case sem igaz (ez lenne a legkorrektebb megoldás). Nézz utána: Bővebben: Link A hozzászólás módosítva: Jún 9, 2022
Azt le tudnád írni, hogy mit szeretnél, hogy mit csináljon a programod?
Üdv!
előre bocsátom nem tudok programozni. Az alábbi programot áttudom faragni, hogy a tizedes 3 digit pontossággal jelezzen? Most pl"4.95" amit szeretnék elérni pl"4.955" valaki tud segíteni? köszönöm A hozzászólás módosítva: Jún 14, 2022
Hát igy láthatatlanban csak annyit lehet segíteni hogy mögé írsz egy 5-öst
lényeg le maradt.
alábbi prg találtam amit még nagyából értek is mit csinál. /* DC Voltmeter An Arduino DVM based on voltage divider concept T.K.Hareendran */ #include LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int analogInput = 0; float vout = 0.0; float vin = 0.0; float R1 = 100000.0; // resistance of R1 (100K) -see text! float R2 = 10000.0; // resistance of R2 (10K) - see text! int value = 0; void setup(){ pinMode(analogInput, INPUT); lcd.begin(16, 2); lcd.print("DC VOLTMETER"); } void loop(){ // read the value at analog input value = analogRead(analogInput); vout = (value * 5.0) / 1024.0; // see text vin = vout / (R2/(R1+R2)); if (vin<0.09) { vin=0.0;//statement to quash undesired reading ! } lcd.setCursor(0, 1); lcd.print("INPUT V= "); lcd.print(vin); delay(500); }
Üdv Alábbi kód-ban van egy sor
Idézet: „Voltage = Voltage * (5.0/1023.0) * 6.46; Current = Current * (5.0/1023.0) * 0.239;” itt a voltage változót miért szorozza 6,46 és honnan jön ez az érték? illetve a current változónál a 0.239. már az origin oldalon is feltette valaki a kérdést, de a szerző nem válaszolt. #include <LiquidCrystal.h> int Read_Voltage = A1; int Read_Current = A0; const int rs = 2, en = 4, d4 = 9, d5 = 10, d6 = 11, d7 = 12; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); float Voltage = 0.0; float Current = 0.0; float Power = 0.0; void setup() { lcd.begin(16, 2); Serial.begin(9600); lcd.print(" Arduino "); lcd.setCursor(0, 1); lcd.print(" Wattmeter "); delay(2000); lcd.clear(); } void loop() { Voltage = analogRead(Read_Voltage); Current = analogRead(Read_Current); Voltage = Voltage * (5.0/1023.0) * 6.46; Current = Current * (5.0/1023.0) * 0.239; Serial.println(Voltage); Serial.println(Current); Power = Voltage * Current; Serial.println(Power); lcd.setCursor(0, 0); lcd.print("V="); lcd.print(Voltage); lcd.print(" "); lcd.print("I=");lcd.print(Current); lcd.setCursor(0, 1); lcd.print("P="); lcd.print(Power); delay(1000); } köszönöm
5: referencia feszültség
1023.0: az ADC felbontása 6.46: 1 bit 6.46 V-ot jelent Hasonló a történet az áram esetén is.
Vélhetőleg a mérendő feszültség nem 5 voltban van maximalizálva, hanem ennél nagyobb és egy feszültség osztón keresztül kapja az ADC. A feszültség osztó osztási aránya lehet az az érték. Valószínűleg nem fogod pontosan megvalósítani azt a feszültségosztót és ez miatt majd pontosítani kell. Az áram mérésnél pedig egy söntellenálláson eső feszültség van valamekkorára fölerősítve és azt méri az ADC, majd ez van korrigálva.
Bővebben: Serial.print()
Talan jobb ha a String object-et hasznalod, utana mar akarhova irhatod... A hozzászólás módosítva: Jún 15, 2022
10 bites az ADC az arduino-ban, vagyis 1024 különféle értéket tud megkülönböztetni, és egész egyszerűen túl kicsi ez a felbontás ahhoz, amit szeretnél. Persze meg lehet csinálni, de kb. annyi haszna lesz, mintha utána írnál egy 5-ös számot (mint valaki korábban viccesen felvetette).
mA értéket szeretnék kiíratni.0.001-5A között kéne ampert mérnem. ezt megtudom oldani?
Mérni bármekkorát tudsz(persze nyilván illesztve), de a tartomány felbontása a max érték/1024 lesz csak. Tehát 5A-nél nem lesz 1mA-es felbontásod...
Légyszíves vesd össze az 1 mA és az 5000mA (5A) mint viszonyt és a kiírandó helyi értékeket.
A uC-el belső AD-je csak 1024 értéket tud felbontani 10biten. A 10 bitbe nem fog bele férni ekkora dinamika 5000es aránnyal. Kompromisszumot kell kötnöd a megjelenített felbontással. A hozzászólás módosítva: Jún 15, 2022
Ezt legjobban asztali több százezer forint értékű 4 5 digites kalibráló műszerekkel tudnád megvalósítani.
Vagy olyan külső AD konverter áramkörrel ami képes ekkora felbontásra. 4096 vagy 8192 12 - 14 bit mélységűek. Azok sem olcsóak.Ezen kívül a hozzájuk való interfészt is meg kell valósítani az Arduinoban, I2C porton beszélgethet és az ADC belső regisztereit kell kiolvasni beállítani, ezt kell a forráskódban leírni mint "interfész". Jobb esetben lehet egy fejlesztett interfész könyvtár az adott ADC áramkörhöz arduino alá. A hozzászólás módosítva: Jún 15, 2022
Külső ADC melynek nagyobb a felbontása mint 10 bit, de ilyen felbontás mellett kell a precíz kivitelezés, pontos feszültségreferencia.
Például MCP320x A hozzászólás módosítva: Jún 15, 2022
Én anno ADS1115-ös modult vettem, az 16 bites ADC, 15 bit ha nem használod a negatív tartományt. Akkoriban Kínából 500 Ft körül jött, de kellett gyorsan is, német eladótól itt volt 1500-ért 3 nap múlva. Meg se merem nézni, hogy ma mennyibe kerül...
Én is jó pár éve vásároltam, ezért kíváncsivá tettél az árával kapcsolatban, így ránéztem. "Ingyenes" szállítással 6,5 dodóért van az alin. Vagy 4,5 dollár + szállítási költség az alja.
Esetleg méréshatár-váltással lehetne megoldani.
Labortapokon hogy van ez megoldva?
Csak kíváncsiságból, de mire fel szükséges ez a nagy (1mA -es) pontosság?
A hozzászólás módosítva: Jún 15, 2022
|
Bejelentkezés
Hirdetés |