Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   737 / 839
(#) willmenn hozzászólása Jún 5, 2022 /
 
Lenne egy újabb kérdésem. Hogyan lehet EEPROM-ba negativ számot tárolni?
(#) Josi777 válasza willmenn hozzászólására (») Jún 5, 2022 /
 
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.
(#) willmenn válasza Josi777 hozzászólására (») Jún 5, 2022 /
 
Köszi!
(#) gordonfreemN hozzászólása Jún 8, 2022 /
 
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!

  1. #include <EEPROM.h>
  2. const int mode_led1 = A0;
  3. const int mode_led2 = A2;
  4. const int mode_led3 = A4;
  5. const int select_led4 = 8;
  6. const int select_led5 = 10;
  7. const int select_led6 = 12;
  8.  
  9. const int in_relay1 = A1;
  10. const int in_relay2 = A3;
  11. const int in_relay3 = A5;
  12. const int out_relay1 = 7;
  13. const int out_relay2 = 9;
  14. const int sch_relay1 = 11;
  15. const int sch_relay2 = 13;
  16.  
  17. const int button1 = 2;
  18. const int button2 = 3;
  19.       int buttonstate1;
  20.       int buttonstate2;
  21.       int lastbuttonstate1;
  22.       int lastbuttonstate2;
  23.       byte ca;
  24.       byte cb;
  25.  
  26.  
  27. void setup()
  28. {
  29.   Serial.begin(9600);
  30.   pinMode(mode_led1, OUTPUT);
  31.   pinMode(mode_led2, OUTPUT);
  32.   pinMode(mode_led3, OUTPUT);
  33.   pinMode(select_led4, OUTPUT);
  34.   pinMode(select_led5, OUTPUT);
  35.   pinMode(select_led6, OUTPUT);
  36.   pinMode(in_relay1, OUTPUT);
  37.   pinMode(in_relay2, OUTPUT);
  38.   pinMode(in_relay3, OUTPUT);
  39.   pinMode(out_relay1, OUTPUT);
  40.   pinMode(out_relay2, OUTPUT);
  41.   pinMode(sch_relay1, OUTPUT);
  42.   pinMode(sch_relay2, OUTPUT);
  43.   pinMode(button1, INPUT);
  44.   pinMode(button2, INPUT);
  45.   buttonstate1 = 1;
  46.   buttonstate2 = 1;
  47.   lastbuttonstate1 = 1;
  48.   lastbuttonstate2 = 1;
  49.   Serial.println("counter value:");
  50.   //Serial.println("in_relay0 state:");
  51.   digitalWrite(select_led4, 1);
  52.   digitalWrite(select_led5, 0);
  53.   digitalWrite(select_led6, 0);
  54.   delay(50);
  55.   digitalWrite(select_led4, 0);
  56.   digitalWrite(select_led5, 1);
  57.   digitalWrite(select_led6, 0);
  58.   delay(50);
  59.   digitalWrite(select_led4, 0);
  60.   digitalWrite(select_led5, 0);
  61.   digitalWrite(select_led6, 1);
  62.   delay(50);
  63.   digitalWrite(mode_led1, 1);
  64.   digitalWrite(mode_led2, 0);
  65.   digitalWrite(mode_led3, 0);
  66.   delay(50);
  67.   digitalWrite(mode_led1, 0);
  68.   digitalWrite(mode_led2, 1);
  69.   digitalWrite(mode_led3, 0);
  70.   delay(50);
  71.   digitalWrite(mode_led1, 0);
  72.   digitalWrite(mode_led2, 0);
  73.   digitalWrite(mode_led3, 1);
  74.   delay(50);
  75.   ca = EEPROM.read(0); //counter variable a
  76.   cb = EEPROM.read(1); //counter variable b
  77. }
  78.  
  79. void loop()
  80. {
  81.   if (ca == 0) {ca = 1;} //felprogramozás után, amikor az eepromba még nem írt
  82.   buttonstate1 = digitalRead(button1); //gomb állapot kiolvasása
  83.   if (buttonstate1 != lastbuttonstate1) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  84.   {
  85.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  86.     if (buttonstate1 == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  87.     {
  88.      //Serial.println(buttonstate1); //irja ki a gomb aktuális állapotát
  89.      ca++; //növelje ca változó értékét egyel, kiindulóérték egy
  90.      
  91.     }
  92.   }
  93.     switch (ca) { //ca változó használata
  94.     case 1: //ha értéke egy
  95.     digitalWrite(mode_led1, 1);
  96.     digitalWrite(mode_led2, 0);
  97.     digitalWrite(mode_led3, 0);  
  98.     break;
  99.     case 2: //ha értéke kettő
  100.     digitalWrite(mode_led1, 0);
  101.     digitalWrite(mode_led2, 1);
  102.     digitalWrite(mode_led3, 0);
  103.     break;
  104.     case 3: //ha értéke három
  105.     digitalWrite(mode_led1, 0);
  106.     digitalWrite(mode_led2, 0);
  107.     digitalWrite(mode_led3, 1);
  108.     break;
  109.     case 4: //ha értéke 4
  110.     ca = 1; //ca értéke legyen ismét egy
  111.     break;
  112.     }  
  113. lastbuttonstate1 = buttonstate1; //gomb előző állapotát írja be a gomb aktuális állapotának
  114. EEPROM.update(0, ca); //tegye eepromba a ca változó értékét, ha az változott
  115.     Serial.println(ca); //írja ki ca változó értékét
  116. //-----------------------------------------------------
  117.   if (cb == 0) {cb = 1;}
  118.   buttonstate2 = digitalRead(button2);
  119.   if (buttonstate2 != lastbuttonstate2)
  120.   {
  121.     delay(50);
  122.     if (buttonstate2 == 0)
  123.     {
  124.      //Serial.println(buttonstate1);
  125.      cb++;
  126.      //Serial.println(cb);
  127.     }
  128.   }
  129.     switch (cb) {
  130.     case 1:
  131.     digitalWrite(select_led4, 1);
  132.     digitalWrite(select_led5, 0);
  133.     digitalWrite(select_led6, 0);
  134.     if (ca == 1) {
  135.       digitalWrite(in_relay1, 1);
  136.       }
  137.     if (ca == 2) {
  138.       digitalWrite(out_relay1, 1);
  139.       }
  140.     if (ca == 3) {
  141.       digitalWrite(sch_relay1, 1);
  142.       }
  143.     break;
  144.     case 2:
  145.     digitalWrite(select_led4, 0);
  146.     digitalWrite(select_led5, 1);
  147.     digitalWrite(select_led6, 0);
  148.     if (ca == 1) {
  149.       digitalWrite(in_relay2, 1);
  150.       }
  151.     if (ca == 2) {
  152.       digitalWrite(out_relay2, 1);
  153.       }
  154.     if (ca == 3) {
  155.       digitalWrite(sch_relay2, 1);
  156.       }
  157.     break;
  158.     case 3:
  159.     digitalWrite(select_led4, 0);
  160.     digitalWrite(select_led5, 0);
  161.     digitalWrite(select_led6, 1);
  162.     if (ca == 1) {
  163.       digitalWrite(in_relay3, 1);
  164.       }
  165.     break;
  166.     case 4:
  167.     cb = 1;
  168.     break;
  169.     }  
  170. lastbuttonstate2 = buttonstate2;
  171. EEPROM.update(1, cb);
  172. }

ard.JPG
    
(#) pipi válasza gordonfreemN hozzászólására (») Jún 8, 2022 /
 
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
(#) pipi válasza gordonfreemN hozzászólására (») Jún 8, 2022 / 1
 
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
(#) gordonfreemN válasza pipi hozzászólására (») Jún 8, 2022 /
 
Az update csak akkor írja az EEPROM-ot amikor változik az értéke, nem?
(#) gordonfreemN válasza pipi hozzászólására (») Jún 8, 2022 /
 
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.
(#) Kera_Will válasza gordonfreemN hozzászólására (») Jún 8, 2022 /
 
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.
(#) pipi válasza gordonfreemN hozzászólására (») Jún 8, 2022 /
 
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.
(#) Kovidivi válasza gordonfreemN hozzászólására (») Jún 9, 2022 / 2
 
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
(#) Josi777 válasza gordonfreemN hozzászólására (») Jún 9, 2022 / 1
 
Azt le tudnád írni, hogy mit szeretnél, hogy mit csináljon a programod?
(#) elactrofan hozzászólása Jún 14, 2022 /
 
Ü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
(#) pipi válasza elactrofan hozzászólására (») Jún 14, 2022 / 2
 
Hát igy láthatatlanban csak annyit lehet segíteni hogy mögé írsz egy 5-öst
(#) elactrofan válasza pipi hozzászólására (») Jún 15, 2022 /
 
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);
}
(#) elactrofan hozzászólása Jún 15, 2022 /
 
Ü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
(#) Bakman válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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.
(#) mateatek válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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.
(#) cua válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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
(#) tbarath válasza elactrofan hozzászólására (») 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).
(#) elactrofan válasza tbarath hozzászólására (») Jún 15, 2022 /
 
mA értéket szeretnék kiíratni.0.001-5A között kéne ampert mérnem. ezt megtudom oldani?
(#) sdrlab válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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...
(#) Kera_Will válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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
(#) Kera_Will válasza elactrofan hozzászólására (») 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
(#) GPeti1977 válasza elactrofan hozzászólására (») Jún 15, 2022 / 1
 
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
(#) tbarath válasza GPeti1977 hozzászólására (») Jún 15, 2022 / 1
 
É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...
(#) morgo válasza tbarath hozzászólására (») Jún 15, 2022 /
 
É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.
(#) Skori válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
Esetleg méréshatár-váltással lehetne megoldani.
(#) elactrofan hozzászólása Jún 15, 2022 /
 
Labortapokon hogy van ez megoldva?
(#) Régi motoros válasza elactrofan hozzászólására (») Jún 15, 2022 /
 
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
Következő: »»   737 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem