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   750 / 840
(#) Kera_Will válasza Kera_Will hozzászólására (») Okt 21, 2022 /
 
Mintaként
egyik forráskód részletem


  1. /*
  2. Elemi szünet 1
  3. Betűk közti szünet 3
  4. Szavak közti szünet 7
  5. */
  6.  
  7. /* Use File->Load Prog to
  8.    load a different Program
  9. */
  10.  
  11. byte Betu;
  12. byte ciklusok;
  13. unsigned long JelenIdo;
  14. unsigned long MultIdo;
  15. long CiklusIdo;
  16.  
  17. byte hanyadik;
  18.  
  19. int elemijelido;
  20.  
  21.  
  22. void setup()
  23. {
  24.         pinMode(13,OUTPUT);
  25.         pinMode(12,OUTPUT);
  26.         hanyadik=5;
  27.        
  28.         MultIdo=0;
  29.         elemijelido=70;
  30.         CiklusIdo=3000;
  31.         ciklusok=0;
  32.        
  33.         digitalWrite(13, LOW);
  34.         noTone(12);
  35.        
  36.         while (millis()-MultIdo < (hanyadik-1)*CiklusIdo)   //CiklusIdo = 5000
  37.         {
  38.                 //ciklusok ++;
  39.         }
  40.         MultIdo=millis();
  41.         ciklusok =0;
  42.        
  43.        
  44. }
  45.  
  46. void milisidozit()
  47. {
  48. while (millis()-MultIdo < elemijelido)   //
  49.         {
  50.                 //ciklusok ++;
  51.         }
  52.         MultIdo=millis();
  53. }
  54.  
  55.  
  56.  
  57.  
  58. void pont()
  59. {
  60.         digitalWrite(13, HIGH);tone(12, 700);
  61.         milisidozit();
  62.         digitalWrite(13, LOW);noTone(12);
  63.         milisidozit();
  64. }
  65.  
  66. void vonas()
  67. {
  68.         digitalWrite(13, HIGH);tone(12, 700);
  69.         delay(elemijelido*3);
  70.         digitalWrite(13, LOW);noTone(12);
  71.         delay(elemijelido);
  72. }
  73.  
  74.  
  75. void morze()
  76. {
  77.         while (Betu != B10000000)
  78.         {
  79.                 {
  80.                        
  81.                         //temp1 = Betu & B10000000;
  82.                         if (Betu & B10000000 ) vonas();
  83.                                 else
  84.                                         pont();
  85.                 }      
  86.                 Betu=Betu<<1;
  87.         }
  88.         delay(elemijelido*3);
  89.        
  90. }
  91.  
  92.  
  93. void mo()
  94. {
  95.         Betu=B11100000;     // M 11110000
  96.         morze();
  97.         Betu=B11110000;      // O 11110000
  98.         morze();
  99. }
  100.  
  101. void MO5()
  102. {
  103.         mo();
  104.         Betu=B00000100;      // 5 00000100
  105.         morze();
  106.         delay(elemijelido*4);
  107. }
  108.  
  109. void loop()
  110. {
  111.        
  112.         //      JelenIdo=millis();
  113.         while (millis()-MultIdo < CiklusIdo)   //CiklusIdo = 5000
  114.         {
  115.                 ciklusok ++;
  116.                 MO5()
  117.         }
  118.        
  119.         MultIdo=millis();
  120.         //tone(12, 1000);
  121.         //delay(150);
  122.         //noTone(12);
  123.         ciklusok =0;
  124.         while (millis()-MultIdo < 4*CiklusIdo)   //CiklusIdo = 5000
  125.         {
  126.                 //ciklusok ++;
  127.         }
  128.         MultIdo=millis();
  129.         ciklusok =0;
  130.        
  131.        
  132. }


ez már többet csinál :


  1. byte Betu;
  2. byte ciklusok;
  3. unsigned long JelenIdo;
  4. unsigned long MultIdo;
  5. long CiklusIdo;
  6.  
  7. byte hanyadik;
  8.  
  9. int elemijelido;
  10.  
  11.  
  12. void setup()
  13. {
  14.         pinMode(13,OUTPUT);
  15.         pinMode(12,OUTPUT);
  16.         hanyadik=5;
  17.        
  18.         MultIdo=0;
  19.         elemijelido=70;
  20.         CiklusIdo=3000;
  21.         ciklusok=0;
  22.        
  23.         digitalWrite(13, LOW);
  24.         noTone(12);
  25.        
  26.         while (millis()-MultIdo < (hanyadik-1)*CiklusIdo)   //CiklusIdo = 5000
  27.         {
  28.                 //ciklusok ++;
  29.         }
  30.         MultIdo=millis();
  31.         ciklusok =0;
  32.        
  33.        
  34. }
  35.  
  36. void milisidozit()
  37. {
  38. while (millis()-MultIdo < elemijelido)   //
  39.         {
  40.                 //ciklusok ++;
  41.         }
  42.         MultIdo=millis();
  43. }
  44.  
  45.  
  46.  
  47.  
  48. void pont()
  49. {
  50.         digitalWrite(13, HIGH);tone(12, 700);
  51.         milisidozit();
  52.         digitalWrite(13, LOW);noTone(12);
  53.         milisidozit();
  54. }
  55.  
  56. void vonas()
  57. {
  58.         digitalWrite(13, HIGH);tone(12, 700);
  59.         delay(elemijelido*3);
  60.         digitalWrite(13, LOW);noTone(12);
  61.         delay(elemijelido);
  62. }
  63.  
  64.  
  65. void morze()
  66. {
  67.         while (Betu != B10000000)
  68.         {
  69.                 {
  70.                        
  71.                         //temp1 = Betu & B10000000;
  72.                         if (Betu & B10000000 ) vonas();
  73.                                 else
  74.                                         pont();
  75.                 }      
  76.                 Betu=Betu<<1;
  77.         }
  78.         delay(elemijelido*3);
  79.        
  80. }
  81.  
  82.  
  83. void mo()
  84. {
  85.         Betu=B11100000;     // M 11110000
  86.         morze();
  87.         Betu=B11110000;      // O 11110000
  88.         morze();
  89. }
  90.  
  91. void MO5()
  92. {
  93.         mo();
  94.         Betu=B00000100;      // 5 00000100
  95.         morze();
  96.         delay(elemijelido*4);
  97. }
  98.  
  99. void loop()
  100. {
  101.        
  102.         //      JelenIdo=millis();
  103.         while (millis()-MultIdo < CiklusIdo)   //CiklusIdo = 5000
  104.         {
  105.                 ciklusok ++;
  106.                 MO5()
  107.         }
  108.        
  109.         MultIdo=millis();
  110.         //tone(12, 1000);
  111.         //delay(150);
  112.         //noTone(12);
  113.         ciklusok =0;
  114.         while (millis()-MultIdo < 4*CiklusIdo)   //CiklusIdo = 5000
  115.         {
  116.                 //ciklusok ++;
  117.         }
  118.         MultIdo=millis();
  119.         ciklusok =0;
  120.        
  121.        
  122. }


Hasonlót kell neked is csinálni ... nekem éppen foxadóba kellett,
kevesebb bittel 8 elég volt .
delay() hanyagolásával millis() függvénnyel mérve az eltelt időt.
A hozzászólás módosítva: Okt 21, 2022
(#) b_zoli hozzászólása Okt 22, 2022 /
 
Kész a programom.
Végül az egyeseket, és nullákat difiniáltam, és így a sync+ 100110010...stb-t kell megadni a megfelelő helyen. 7% ot foglal el eddig. Vagyis marad egy csomó lehetőség bővíteni.
A Ti verziótokat kipróbálom szintén.
Köszönöm mindenkinek a segítségét!

void one(void) {
digitalWrite(12, HIGH); //1
delayMicroseconds(700);
digitalWrite(12, LOW);
delayMicroseconds(380);
}

void null(void) {
digitalWrite(12, HIGH); //0
delayMicroseconds(320);
digitalWrite(12, LOW);
delayMicroseconds(740);
}
x
x
x
void nappali_1_le(void) {
sync();
one();
one();
null();

És a többi.....
A hozzászólás módosítva: Okt 22, 2022
(#) Kera_Will válasza b_zoli hozzászólására (») Okt 22, 2022 /
 
Esetleg a teljes kiadandó vezérlő szavadat is egybe foglalhatnád 1 "teljes szóvá".
Akkor azt jobbra vagy balra shifteléssel bitenként vizsgálva 0/1 értéket sokkal kevesebb sorból állna a programod.
Lásd morzekódolóm mintája.
A sok bitedet 40 vagy mennyi 1 1 parancsszó + szinkron akkor azt 18al beszorozva csak alig 7-800 sor a one / null hívások egymásutánjai és tárhely foglalás. Ha meg a shiftelős módot használod az kb.: max kb utasítás 20 sor és másik 18 db állandóváltozó "tömb" amiben a vezérlőszavak vannak ágyazva.
Jó lenne egy 64 bites integer típusú változó de azt sajna nem ismer az ardu.
Akkor 1 parancsszó 4 vagy 5 8 (2 3 d 16 bites ) bites "szótöredékből " állna és a "szó kibetűző algoritmus" egymás után a 8/16 bites részeket külön olvasná fel és döntené el a 0/1 állapotot .
(arduino integer változók méreteit meg kell lesni )
Hogy tudod összerakni egy "nagy szóvá" a "bitkolbászt" amit dekódoltál?
pl.: 111001100111000100110 pl.: ez 21 db bit egymás után.
21/16 (word tipus) ~ 1,3 tehát van 1 egész word és meg egy kicsi maradék .
Balról az első 16 bitet levágod :
1110011001110001
marad az utolsó 5 db :
00110
az első 16ot berakod az első tároló parancsszó részletbe (a definiált parancsszó tömbbe)
az utolsó öt bitet pedig kiegészíted annyi 1 vagy 0 értékkel ami word tipus méretűvé nem teszi

00110 +11111111111 =0011011111111111

(jobb esetben akár ütköző / szóvégjellé is tehetné mert a mintáidban tuti nincs 11db egyes értékű bited egymás után az általad dekódolt mintákban ) de mivel fix a méret akkor csak a shiftelések számát kell állandóvá tenni a "vezérlőszavakat felolvasó bontó" függvényed számára.
A hozzászólás módosítva: Okt 22, 2022
(#) Kera_Will válasza b_zoli hozzászólására (») Okt 22, 2022 /
 
Ez a favágós , egyszerű erőből történő megoldás, ez jó lehet így is.
Idővel elfogynak az erőforrásaid (program tárhely)ezért érdemes átszervezni a programot ezért javasolnám a kissé bonyolultabb bitenkénti shiftelős szókiolvasást.
A másik , hogy kényelmesebb 1 változó tartalmát át írni a "kvázi fejlécben"- változók deklarációs területén - mint azt a program törzsében 40 50 soron keresztül nul/one/nul/nul/ stb sorokat copy/paste módszerel bogarászni.Debug/ellenőrzés is egyszerűbb .... 1 helyen kell ellenőrizni és nem 50sorban.
A hozzászólás módosítva: Okt 22, 2022
(#) b_zoli hozzászólása Okt 22, 2022 /
 
Teljesen igazad lehet, nézegetem a kódodat, ez egy kicsit még magas nekem, de fejtegetem....
Bár két három hete még semmit sem értettem a program írásból. IC-ét már programoztam fel, (PIC, ATMEGA) de ott mindig megvolt a progija (hex). Ez a legelső programom, amit én írtam.
Mindig csak csodáltam azokat, akik értenek a programozáshoz....
(#) Skori válasza Kera_Will hozzászólására (») Okt 22, 2022 / 1
 
Idézet:
„Jó lenne egy 64 bites integer típusú változó de azt sajna nem ismer az ardu.”

Érdekes nálam lefordul simán arduino alatt:
  1. uint64_t hatvannegybitesA; //arduino 64 bites előjel nélküli egész
  2.  int64_t hatvannegybitesB; //arduino 64 bites előjeles  egész
A hozzászólás módosítva: Okt 22, 2022
(#) Kera_Will válasza Skori hozzászólására (») Okt 22, 2022 /
 
TNX Skori!
Akkor megoldva a 64 bites integer változó használata.Nem volt szükségem még ekkora bitmélységre és nem voltam biztos abban, hogy az arduino nyelvi környezet felkészült-e erre?
A hozzászólás módosítva: Okt 22, 2022
(#) vargham válasza Kera_Will hozzászólására (») Okt 22, 2022 /
 
A nyelv az C++, az Arduino csak könyvtárakat ad hozzá. A fordító az AVR GCC, annak kell támogatnia a 64 bites egészeket.
Gondold meg, hogy biztosan szükséged van rá? Ez egy nyolcbites processzor, elég sok órajel, mire elvégzi a műveleteket egy ekkora számmal.
(#) Kera_Will válasza vargham hozzászólására (») Okt 22, 2022 /
 
Valóban ez is zavar, ekkora bitmélységű műveletek esetén, hogy lenne optimális a hosszú bitminta kiküldése/tárolása. Akár több 8 bites szórészletre osztva is működhet a küldő ciklus több részből álló bájtokat "olvas fel".

Idézet:
„elég sok órajel, mire elvégzi a műveleteket egy ekkora számmal.”

Igen ez is igaz és ekkor a bitek közti kiküldési idő is számíthat. Rosszabb esetben már a vevőoldali dekódolást is zavarhatja ha túl sokáig számolja a hosszú bitek shiftelésének eredményét.
Lehet ez szőrszálhasogatásnak tűnik , de lehet olyan helyzet amikor már ez gondot jelenthet.
A hozzászólás módosítva: Okt 22, 2022
(#) vyky hozzászólása Okt 26, 2022 /
 
Sziasztok!
Egy kis segítséget kérnék tőletek.
Mitől van az ,hogy a hőmérő szenzor ugrál,pár fokot folyamatosan?
A kód:
  1. const int Relay = 12;
  2. int Ro = 11.0, B =  3950; //Nominal resistance 50K, Beta constant tank
  3. int Ro1 = 11.0;// solar
  4. int Rseries = 10;// Series resistor 10K
  5. float To = 298.15; // Nominal Temperature
  6.  
  7. void setup() {
  8.   Serial.begin(9600);
  9.   pinMode(Relay, OUTPUT);
  10. }
  11.  
  12. void loop() {
  13.   /*Read analog outputof NTC module,
  14.    i.e the voltage across the thermistor */
  15.   float Vt = analogRead(A2) * (5.0 / 1023.0);
  16.   float Vi = analogRead(A0) * (5.0 / 1023.0);
  17.   //Convert voltage measured to resistance value
  18.   //All Resistance are in kilo ohms.
  19.   float R1 = (Vt * Rseries) / (5 - Vt);
  20.   float R = (Vi * Rseries) / (5 - Vi);
  21.   /*Use R value in steinhart and hart equation
  22.     Calculate temperature value in kelvin*/
  23.   float T1 = 1 / ((1 / To) + ((log(R1 /Ro1)) / B));
  24.   float T =  1 / ((1 / To) + ((log(R / Ro)) / B));
  25.   float Tc1 = T1 -273.15;
  26.   float Tc = T - 273.15; // Converting kelvin to celsius
  27.   if (Tc > Tc1){
  28.     digitalWrite(Relay, HIGH);}
  29.     else{
  30.     digitalWrite(Relay, LOW);
  31.     }
  32.  
  33.   Serial.println((String)"Temperature in Tank    :" + Tc + "°C");
  34.   Serial.println((String)"Temperature in Solar   :" + Tc1 + "°C");
  35.   Serial.println(" ");
  36.   delay(5000);
  37. }

A szenzor kétkábeles valami,nem tudom azonosítani.De egy 10 K ellenállással van a Gnd,és a jel között.
(#) Kera_Will válasza vyky hozzászólására (») Okt 26, 2022 / 1
 
Az ugrálás azért lehet mert csak 1-szer mér az AD bemenet.
Több mérés átlagát kellene értékelni és azzal a relét húzni.
5-10 másodpercenként újra mérni és ezt 5-10-20 db értékéből átlagot számolni. Ha nagyon szofisztikált lenne az átlagoló függvényed akkor legkisebb és legnagyobb értéket el is dobhatná 1 1 átlag számítás eredményei közül. Természtesen ennyivel lassab lesz a kijelzés sebessége.
(#) Josi777 válasza vyky hozzászólására (») Okt 26, 2022 / 1
 
Valószínűleg zajos az analóg jel. Az analóg bemenetre egy RC szűrő kéne, valamint 1 mérés nem mérés. Valamilyen átlagolás vagy digitális szűrés is javíthatja a mérést. A statisztikai átlagolás általában segít. De megoldás lehet az LSB hiba kiküszöbölésére, ha 1 bittel csökkented a felbontást a mérés után.
(#) vyky hozzászólása Okt 26, 2022 /
 
Köszönöm a segítséget! Átlagolást még nem csináltam,de megpróbálom.
(#) Josi777 válasza vyky hozzászólására (») Okt 26, 2022 / 1
 
Gyakran a tápfeszültés ingadozása ill. zajossága is okozhatja a mérés pontatlanságát, ugyanis ahogy a programodból látom, az ADC referencia feszültsége az 5V-os tápon van. Ebben az esetben külső referencia is segíthet.
(#) b_zoli hozzászólása Okt 26, 2022 /
 
Sziasztok!
A kérdésem az lenne, hogy ha egy UNO-nak (Kínai) nem adok külön DC7-12V-ot, csak mondjuk 5V-ot akkor ez okozhatja, hogy a jelalak ami a kimeneten megjelenik elég ergya lesz?
Ugyan ez agy nano-nál (kettőnél is) viszont tök szép.
(#) icserny válasza b_zoli hozzászólására (») Okt 26, 2022 /
 
Ha a Vin bemenetre kötöd, akkor persze, hogy kevés az 5V.

"Ugyan ez egy nano-nál (kettőnél is) viszont tök szép."
Ha a panelre épített LDO olyan, hogy alacsony feszültségnél kinyit és átvezet, akkor jó lehet.

Ultra Low Dropout LDO regulators
A hozzászólás módosítva: Okt 26, 2022
(#) asch válasza vyky hozzászólására (») Okt 26, 2022 /
 
Pontosan milyen értékeket ír ki és mennyit ugrál?
(#) vyky válasza asch hozzászólására (») Okt 27, 2022 /
 
Szia asch!
A kiírt érték a valós hőmérsékletnek megfelel,csak 1-2 fokot ugrál ,úgy,hogy semmi nem változik körülötte. Benne van a pohár vízben mind a kettő szenzor és ,így is ugrál a mért hőfok,vagy felfele,vagy lefele.
(#) vyky válasza Josi777 hozzászólására (») Okt 27, 2022 /
 
Szia Josi777!
Szóval segíthet egy sima kondi?
Ide jó a kerámia kondi vagy csak a fólia jó?
Ezt az átlagolást próbáltam megérteni,de nem nagyon találtam hozzá példát
(#) kapu48 válasza vyky hozzászólására (») Okt 27, 2022 /
 
A/D mérési eredmény átlagolás probléma: Bővebben: Link
(#) Josi777 válasza vyky hozzászólására (») Okt 27, 2022 / 1
 
Simán jó a kerámia kondi is.
Itt egy ajánlott illesztés NTC-hez.
Átlagolásnak, ahogyan már egy kolléga említette, a statisztikai átlagolást ajánlom (a kúszó átlag is jó, csak az egy kicsit bonyolultabb). Röviden a működése: Számos analóg mérést sorba rendezel, majd a lista legvégéről 1-2 értéket elhagysz, majd a maradékot átlagolod. A rendezés azért kell, hogy a kiugró értékeket el tudd különíteni. Az egyszerűség kedvéért nem vizsgáljuk, hogy tényleg kiugró érték-e, a két végét levágjuk a sorozatnak. Majd ezt átlagoljuk.
Erre egy példaprogramot itt találsz (hibakezeléssel együtt):
Remélem, a változónevek eléggé beszédesek.
NTC statisztikai átlagolás példaprogram
A hozzászólás módosítva: Okt 27, 2022
(#) vyky válasza Josi777 hozzászólására (») Okt 28, 2022 /
 
Köszönöm,ez nagy segítség!!
(#) vyky válasza kapu48 hozzászólására (») Okt 28, 2022 /
 
Köszönöm,átolvasom
(#) GPeti1977 válasza Josi777 hozzászólására (») Okt 28, 2022 /
 
Az 5V helyett az osztót az Aref lábra is lehetne rakni, 2,56V belső referenciát használni.
(#) Kovidivi válasza Kera_Will hozzászólására (») Okt 28, 2022 /
 
Létezik long long típusú változó is, az is 64bit (lehet csak más a neve, de Arduino alatt használtam). Abban már elég sokminden belefér, és szerintem gyorsabb, mint a float.
A hozzászólás módosítva: Okt 28, 2022
(#) Kovidivi válasza GPeti1977 hozzászólására (») Okt 28, 2022 /
 
Az nem 1.1V?
(#) majkimester válasza Kovidivi hozzászólására (») Okt 28, 2022 /
 
Arduino Uno-ban lévő ATMega328-ban 1,1V-os belső referencia van, de a Mega2560 meg tudja az 1,1 és a 2,56V-ot is.
(#) b_zoli hozzászólása Okt 31, 2022 /
 
Sziasztok!

Van egy sötétedés szenzorom. (Photoresistor).
Természetesen változik az értéke.
Ha különböző értékekhez más állapotot akarok adni, akkor ez működhet, vagy ennek semmi értelme?:

  1. lightStatus = analogRead(ldr_pin);
  2.  
  3. if (lightStatus >=700 , 0)    // sötét van
  4. if (lightStatus <700 , 1)     // világos van
  5.  
  6. vagy maradjon ez:
  7.  
  8. if (lightStatus >=700)  {
  9.      lighStatus = 0;
  10.  }
  11. else { lightStatus = 1;
  12.       }
A hozzászólás módosítva: Nov 2, 2022
Moderátor által szerkesztve
(#) Bakman válasza b_zoli hozzászólására (») Okt 31, 2022 /
 
Jobb lenne egy kis hiszterézist belevinni a dologba.

  1. if (lightStatus > 699){
  2. sotet=1;
  3. }
  4.  
  5. if (lightStatus < 651){
  6. sotet=0;
  7. }
A hozzászólás módosítva: Nov 2, 2022
Moderátor által szerkesztve
(#) Josi777 válasza b_zoli hozzászólására (») Okt 31, 2022 /
 
Ebben a formában ez nem működik, ugyanis mindig a második fog teljesülni. Mire gondoltál, amikor az if -nél a 0-át és az 1-et odaírtad? Azzal ugyanis a vizsgálattól függetlenül megadtad a feltétel kimenetét

A szerkesztésed után beírt második megoldásban pedig ajánlatos lenne egy valamekkora hiszterézis, hogy ne billegjen a határértéknél.
A hozzászólás módosítva: Okt 31, 2022
Következő: »»   750 / 840
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