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   599 / 851
(#) tbarath válasza Massawa hozzászólására (») Márc 6, 2020 /
 
Na erre (is) kell egy git tároló, aztán csak nyomnál egy diff-et, és máris látnád, hogy korábban mit b***tál el. Baromi tanulságos tud lenni
(#) atiotezer válasza Kovidivi hozzászólására (») Márc 7, 2020 /
 
Szia.

Én azt sajnos nem tudom, hogy hogyan kell, de ha gondolod megmutathatnád, itt a teljes program.
köszönöm.
(#) Massawa válasza tbarath hozzászólására (») Márc 7, 2020 /
 
Jo az Arduino IDE-ben a Ctrl+Z azzal vissza lehet lépkedni amig nem indul el ujra a kod.
Az mi az a git tárolo? Ilyemivel még nem volt dolgom. Én text editorokban szoktam a különbségeket keresni (ASM-ben még bonyolultabb ), ahhoz persze kell egy müködö jo kod......
A hozzászólás módosítva: Márc 7, 2020
(#) icserny válasza Massawa hozzászólására (») Márc 7, 2020 /
 
Idézet:
„Az mi az a git tárolo?”

github.com, lásd pl. itt: Adafruit könyvtárak
(#) Massawa válasza icserny hozzászólására (») Márc 7, 2020 /
 
Igy már értem, gondoltam, hogy ez lesz..
(#) vyky válasza Massawa hozzászólására (») Márc 7, 2020 /
 
Szia. Egy elvetemült ötlet csak. Miért nem a két végállást kapcsolóval oldottad meg?
Ami a forgás irányát kapcsolgatja,tudom nem elegáns és a cséve testek hosszától is függ a lépések hossza ,de azt a végélés kapcsolót nem kell fixre tenni.
(#) supercharger hozzászólása Márc 7, 2020 /
 
Szép napot mindenkinek!

Abszolút kezdőtől érkezik a kérdés. Futtattam egy programot egy nano-n ami rendben megy is. Most képernyőt cseréltem Keyestudio KS0454-re DfRobot könyvtárakkal. A lábakat átvariáltam, működik, kijelez, de..... a képernyő frissítés katasztrófális.

Leegyszerűsítettem a programot, hogy csak a minimális maradjon benne és még így is villog. Gondolom más lezhet a baj, de mi? Lehet, hogy annyira lassú ez a TFT, hogy még egy hőmérőt sem lehet vele normálisan megépíteni?


Köszönöm a segítséget!

  1. #include "DFRobot_ST7687S_Latch.h"
  2. #include <DHT.h>               // include DHT library
  3.  
  4. #ifdef __AVR__
  5. uint8_t pin_cs = 3, pin_rs = 5, pin_wr = 6, pin_lck = 7;
  6. #else
  7. uint8_t pin_cs = D3, pin_rs = D5, pin_wr = D6, pin_lck = D7;
  8. #endif
  9. #define BLACK 0x0000
  10. #define WHITE 0xFFFF
  11. #define RED   0xF800
  12. #define BLUE  0x001F
  13. #define ORANGE  0xff8000
  14.  
  15. DFRobot_ST7687S_Latch tft(pin_cs, pin_rs, pin_wr, pin_lck);
  16.  
  17. #define DHTPIN  A0           // DHT11 data pin is connected to Arduino analog pin 1
  18. #define DHTTYPE DHT11        // DHT11 sensor is used
  19.  
  20. float temp; //Stores temperature value
  21. DHT dht11(DHTPIN, DHTTYPE);  // initialize DHT library
  22.  
  23. void setup(void)
  24.  
  25. {
  26.  
  27.   Serial.begin(115200);
  28.   tft.fillScreen(DISPLAY_BLACK);
  29.   tft.setTextSize(1);                 // text size = 1
  30.   tft.setTextColor(DISPLAY_RED);     // set text color to green and black background
  31.   tft.setCursor(57, 0);              // move cursor to position
  32.   tft.print("TELEP1");
  33.  
  34.   // initialize DHT11 sensor
  35.   dht11.begin();
  36.  
  37. }
  38.  
  39. char _buffer[7];
  40.  
  41. // main loop
  42. void loop()
  43.  
  44. {
  45.  
  46.   // read temperature
  47.   byte temp = dht11.readTemperature();
  48.  
  49.   // print temperature (in °C)
  50.   tft.setTextSize(6);
  51.   sprintf(_buffer, "%02u", temp);
  52.   tft.setTextColor(DISPLAY_WHITE);  // set text color to red and black background
  53.   tft.setCursor(33, 10);
  54.   tft.print(_buffer);
  55.  
  56. }
  57.  
  58. // end of code.
(#) asch válasza Massawa hozzászólására (») Márc 7, 2020 /
 
A git egy verziókezelő, ami alkalmas arra, hogy egy folder változásait nyomonkövethetővé teszi, tárlolja megjeleníti.

(Plusz nagyon jó elosztott csoportmukára, de itt most nem ezek a finkciói vannak előtérben.)

A git szabad szoftver nyílt forráskóddal. Önmagában csak a saját gépeden is használhatod.

A github egy szolgáltatás, hogy git-es repókat (verziókezelt könyvtárakat) megoszthass, illetve megosztottan használhass. Nyílt projektekhez ingyenes, csak regisztrálni kell és lehet tolni felfelé a verziókat. Ha ide feltetted volna ezt, akkor egyből mindenki láthatta volna az egész programot. Csak beírod a linket - akár konkrét sorra is linkelhetsz egy konkrét változaton belül - és mindenki tudja miről beszélsz.

Hasonló a gitlab is, amit saját szerverre is lehet telepíteni. Ez ráadásul szabad szoftverrel valósítja meg lényegében a github funkcionalitását. Ezt azoknak írom, akik idegenkednek a multiktól.

Saját gépen használva két változat között például a "git difftool -d ." parancs segítségével meg tudjuk jeleníteni, hogy mi változott az előző változat óta.

A különbségeket úgy jeleníti meg, hogy egy összehasonlító programot nyit. Nekem a kedvencem a meld, nálam ez van bekonfigurálva: http://meldmerge.org/ A weboldalt nézd meg, hogy milyen, milyen frankó megjelenítést csinálna neked! Mindezt ingyen szabad szoftverekkel. Magyarítása is van.
(#) asch válasza supercharger hozzászólására (») Márc 7, 2020 /
 
Kijelzőnél villogás attól keletkezik, hogy a két képkocka közötti állapotot látja a felhasználó. Mikor betűket rajzolunk, akkor például először letöröljük a betűk hátterét (hogy az előző betűk ne legyenek ott), majd rárajzoljuk az újat. Ha a letörlés állapota véletlenül megjelenik a képernyőn, abból van a villogás.

Ez ellen a tipikus megoldás a double buffering: két képkocka van a memóriában egyszerre, és csak akkor váltunk az újra át, amikor az már teljesen készen van. Ezt a jobb vasak tudják támogatni. Ez sajnos nem tud ilyet ahogy láttam - kicsit ránézegettem az adatlapjára.

Double buffering nélkül lehetőség még, ha szinkronizálod a rajzolást a megjelenítéssel: mindig akkor rajzolsz, amikor a kijelzés éppen nem frissül, és a következő frissítési periódusig be is fejezed a rajzot. Szerintem ez sem működhet itt, mert nincs visszacsatolásod, hogy mikor történik a pixelek frissítése az eszköz memóriájából.

(Double buffering mellett is szinkronizálni kell a képkockák közötti váltást a megjelenítéssel, ez az úgynevezett VSYNC. Ha ez nincs, akkor lehet úgynevezett tearing. De ez itt lényegtelen, ha csak ennyi baj lenne, nem lenne baj.)

Harmadik megoldás, ha a rajzolást úgy írod át, hogy egyből a jó pixeleket írod ki, nincsen köztes rossz kép.

(Triviális megoldás lenne, ha a mikrokontrolleren lenne tárolva egy képkockád. Lényegében a double buffering egyik buffere az MCU-n, a másik a LCD vezérlőben van. De ehhez nincs elegendő memória. (64*128*2bájt=16kB vs 2kB SRAM) Ilyet már csináltam OLED kijelzőhöz, de az bináris, pixelenként 1 bit volt, és az épp befért a memóriába. 128*64/8=1024 bájt.)

Ezt úgy lehet megcsinálni, hogy a betűkiírást úgy írod át, hogy a betűknek szánt téglalapot végigscanneled például függőleges csíkonként és minden csíkot egyből jóra rajzolsz. Így ha éppen a folyamat közepén frissít a képernyő, akkor is félig átírt számokat látsz, nem félkész kockát.

Másik megoldás lehet, ha mégis SRAM-ban rajzolsz, de csak 1 biten, és onnan frissíted a képernyőt. Az SRAM-ba kétértékű pixeleket teszel és a színeket csak a kifrissítéskor teszed hozzá valami logika alapján.

A lényeg, hogy ezekhez a betűkiírást lényegében újra kell programoznod. Esetleg megoldás lehet a frissítési periódus lelassítása: hőmérsékletet nem kell túl gyakran frissíteni. És ha ritka esemény, akkor egy villanás nem is zavarja a usert.
A hozzászólás módosítva: Márc 7, 2020
(#) supercharger válasza asch hozzászólására (») Márc 7, 2020 /
 
Köszönöm

Arra jutottam, hogy ez így nem ér annyit A lényeget értem a megvalósítás mint a TFT, kínai.

(#) asch válasza supercharger hozzászólására (») Márc 7, 2020 /
 
Egyébként számold ki a teljes képernyő újrarajzolásához szükséges adatmennyiséget, és így egy adott FPS-hez tartozó adatsebességeket. Aztán nézd meg a felhasznált adatbusz órajelét, stb: szerintem nem lehet ezzel 50FPS körüli frissítést csinálni. Ha jól emlékszem a 128X64X1bit kijelzőt tudtam I2C-n kb 20 FPS-sel hajtani. Annak mondjuk buta volt a protokollja, amiatt sem tudtam feljebb menni.

SPI max frekvencia: 8MHz, az max 1MB/sec. 50 képkockát szeretnénk, tehát 20.000 bájtunk marad egy kockányi időre. Végülis akár bírhatná is az 50 FPS-t, de ehhez az kellene, hogy a programod kb 16 órajelenként előállítson 1 bájtot a képből. Ez reménytelen vállalkozás ezen a csippen. Egy agyonoptimalizált betűkiíró algoritmus is többet fog ennél fogyasztani. Tehát nem csak a képernyő lassú, hanem a processzor is.
(#) benjami válasza supercharger hozzászólására (») Márc 7, 2020 /
 
Nem fog teljesen megszűnni ugyan a villogás, de javulni fog a helyzet, ha kevesebbszer írod a kijelzőt. Ha a fenti programod a cél mindössze akkor a loop elejére vagy a végére mondjuk beleraksz 50msec várakozást. Ha más feladat is van, akkor célszerű a rendszeridőt kiolvasva eldönteni mikor frissíted a kijelzőt.
(#) asch válasza supercharger hozzászólására (») Márc 7, 2020 /
 
A monokróm bufferbe rajzoló libem egyébként itt van: https://github.com/rizsi/Arduino-IR-decoder/tree/master/libraries/r...AW/src

Villódzás nélkül kb 20FPS-t tudok a 128X64-es OLED képernyőn, teljesen vállalható.

Ez az OLED vezérlő libem: https://github.com/rizsi/Arduino-IR-decoder/tree/master/libraries/r...ED/src .Az OLED-et teljesen interruptban állapotgéppel vezérli, így nem blokkolja a főprogramot. Ezzel az I2C-s OLED-del működik: https://www.hestore.hu/prod_10035540.html

A következő kütyümmel az SPI-s változatra átállok.
(#) supercharger válasza benjami hozzászólására (») Márc 7, 2020 /
 
Hát ez szerintem felejtős lesz. A fenti kódból már mindent kivettem és kicsik a karakterek is. Ha megnövelem a karakter méretét akkorára amekkorára szeretném és kap még egy szenzort plusz szenzoronként.

tft.setTextSize(6);

kapott 3000 delayt a végére

Kb ecsettel hamarabb átrajzolnám a kijelzőt Refresh majdnem 2 másodperc!

Érdekes: találtam hozzá egy kész .ino (gyári clock) kódot, az is szépen vibrál.

Szerintem ez a kijelző statikus "valami" kijelzésére lehet alkalmas, utána meghal
(#) nemgyuri válasza nemgyuri hozzászólására (») Márc 7, 2020 / 1
 
Sziasztok! Ezt a kódot csak azért teszem ide, hogy ne a hibás maradjon meg a fórumon.
HC SR04-es ultrahangos távolságmérőt NEM SZABAD az Echo láb "L"-be kényszerítésével resetelni. Kapcsolási rajz + szkópos vizsgálattal erre jutottam. A modul tápját kell minimum 200ms időre elvenni, amikor nem volt viszhang, így a modul automatikusan resetel.
  1. #define LED300Pin 12
  2.  #define LED600Pin 13
  3.  #define LED900Pin 11
  4.  #define LEDHibaPin 10
  5.   //  #define EchoPin 2 // SR04 Echo laba PIN2-re kotve
  6.   //  #define TriggerPin 3 // SR04 Trigger laba PIN3-ra kotve
  7.     const int EchoPin=8; // Így is jó..
  8.     const int TriggerPin=9;
  9.    
  10.     byte Valt = 0;  
  11.     unsigned long EchoTime = 0; // az Echo labon megjeleno jel hosszat tartalmazo valtozo
  12.     unsigned long Tavolsag = 0; // a mert tavolsagot tartalmazo valtozo
  13.  
  14.   void Tavmeres() {
  15.      delayMicroseconds(2);
  16.      digitalWrite(TriggerPin, HIGH); // Pulse for 10 �s to trigger ultrasonic sensor
  17.      delayMicroseconds(10);
  18.      digitalWrite(TriggerPin, LOW);
  19.      EchoTime = pulseIn(EchoPin, HIGH,30000); // az Echo labon a magas allapot idejenek merese
  20.      Tavolsag = 10*EchoTime/58; // a celtargy tavolsaganak kiszamitasa (mm-ben)
  21.      Serial.print(Tavolsag, DEC);
  22.    }
  23.   void EchoTorles() {
  24. //    pinMode(EchoPin, OUTPUT); // ez nem megoldás! két kimenet egymás ellen dolgozna!!!
  25. //    digitalWrite(EchoPin, LOW); // HC SR04 tápot kell elvenni, így a modul resetel.
  26. //    delayMicroseconds(10);     //+5V -- PNP -- modul Vcc
  27. //    pinMode(EchoPin, INPUT);   // LEDHibaPin 10 -- 0,5-1k -- PNP bázis
  28.     delayMicroseconds(10);
  29.      digitalWrite(LED300Pin,HIGH);
  30.      digitalWrite(LED600Pin,HIGH);
  31.      digitalWrite(LED900Pin,HIGH);
  32.      digitalWrite(LEDHibaPin,LOW);
  33.      if (Valt==0) {
  34.       digitalWrite(LEDHibaPin,LOW);
  35.       delay(300);
  36.       Valt = 1;
  37.      } else {
  38.       digitalWrite(LEDHibaPin,HIGH);
  39.       delay(300);
  40.       Valt = 0;
  41.      }
  42.   }
  43.   void Kiiras() {
  44.      Serial.print(EchoTime,DEC);
  45.      //delay(100); //msec
  46.      Serial.print("    ");
  47.      Serial.print(Tavolsag, DEC); // az eredmeny elkuldese a soros porton keresztul a PC-re
  48.      Serial.println(" mm"); // mm kiirasa az eredmeny utan
  49.   }
  50.     void KijelezLED() {
  51.      digitalWrite(LED300Pin,HIGH);
  52.      digitalWrite(LED600Pin,HIGH);
  53.      digitalWrite(LED900Pin,HIGH);
  54.      digitalWrite(LEDHibaPin,LOW);
  55.      if (Tavolsag > 1 and Tavolsag < 400) {digitalWrite(LED300Pin,LOW);}
  56.      if (Tavolsag > 300 and Tavolsag < 1000 ) {digitalWrite(LED600Pin,LOW);}
  57.      if (Tavolsag > 800 and Tavolsag < 3000 ) {digitalWrite(LED900Pin,LOW);}
  58.      if (Tavolsag > 3000 or Tavolsag < 1) {digitalWrite(LEDHibaPin,HIGH);}
  59.       delay(200);
  60.   }
  61.  
  62.     void setup() {
  63.        pinMode(LED300Pin,OUTPUT);
  64.        pinMode(LED600Pin,OUTPUT);
  65.        pinMode(LED900Pin,OUTPUT);
  66.        pinMode(LEDHibaPin,OUTPUT);
  67.      pinMode(TriggerPin, OUTPUT); // Trigger lab kimenet
  68.      pinMode(EchoPin, INPUT); // Echo lab bemenet
  69.      Serial.begin(9600); // 9600 baud-sebessegu soros kommunikacios port beallitasa
  70.          digitalWrite(TriggerPin, LOW);
  71.          delay(10);
  72.          }
  73.     void loop() {
  74.       Tavmeres();
  75.       delayMicroseconds(2);
  76.        if (Tavolsag > 0 and Tavolsag <4000) {
  77.         Kiiras();
  78.         KijelezLED();
  79.      } else {
  80.        EchoTorles();
  81.      }
  82.     }
(#) benjami válasza supercharger hozzászólására (») Márc 7, 2020 /
 
Én megnézném a karakter kirajzoló függvényét, mert ha ennyire lassú akkor ott valami nagyon nincs optimalizálva.
(#) Csongig válasza asch hozzászólására (») Márc 7, 2020 /
 
Koszi!
Jatszani, probalni, tanulni egy ilyen szett jo lehet?https://a.aliexpress.com/_d6mL2NF" target="_blank" rel="nofollow" >Bővebben: Link
(#) Kovidivi válasza supercharger hozzászólására (») Márc 7, 2020 /
 
Tudnál gyorsítani a programodon.
Pl. ha a betűméret nem változik, miért küldöd el a parancsot az LCD-nek minden egyes loop futásnál? "tft.setTextSize(6);" .
Ez úgyszintén: "tft.setTextColor(DISPLAY_WHITE);". Egyszer elég lefutnia.
A hőmérséklet kiírásnál, ha pl. a 23.5°C formátumot használod, és szeretnéd 23.7°C-ra frissíteni, akkor csak annyi a dolgod, hogy az 5-ös betűt kiírod ismét a háttér színével, majd kiírod a helyére a 7-est. A teljes LCD törlést pedig el kell felejteni!
Ha a kódod pazarló, ne csodálkozz, hogy lassan fut.
Nem kell az egész kijelzőt tárolnod, csak elég a tartalmát, tehát hogy 23.5°C. Ez nem kerül 1Kb-ba, csak 3-ba
A hozzászólás módosítva: Márc 7, 2020
(#) Bell hozzászólása Márc 7, 2020 /
 
Sziasztok! Az Atmega328P PU típus tartalmaz működő Uno bootloadert, vagy csak alkalmas rá, hogy feltöltsem?
(#) sargarigo válasza Bell hozzászólására (») Márc 7, 2020 / 1
 
Csak alkalmas. Az Atmel és az Arduino két külön istálló, csak van közöttük átjárás. Feltöltöd rá magad, aztán használhatod. Ebayen láttam már előre flashelt példányokat is, ott külön jelzik ezt (pl. így).
A hozzászólás módosítva: Márc 7, 2020
(#) Kovidivi válasza Bell hozzászólására (») Márc 7, 2020 / 1
 
Vehetsz Arduino mini pro-t, ez a legolcsóbb Arduino, és felhasználhatod az AVR-t róla, a bootloader már benne van. Esetleg vehetsz olyan AVR-t, amibe már fel van töltve a bootloader (ez drágább, mint az üres). De egy programozó port sem foglal annyira sok helyet szerintem.
(#) jimmi12 hozzászólása Márc 7, 2020 /
 
Sziasztok, a linkelt kóddal sikerült beüzemelnem egy Philips ECO6-os tuner modult. Minden működik,a kérdésem illetve amiben segítséget kérnék az a következő lenne:
1. hogyan tudnám kiegészíteni a kódot úgy, hogy 5db befogott csatornát tároljon?
2. bekapcsoláskor mindig az első eltárolt csatornával induljon?
Ha jól gondolom a kapcsolást ki kell egészítenem egy nyomógombbal, ami a tárolás lenne és további 5db-al ami a tárolt csatornákhoz kell. A kód jelenleg egy Arduino Nano-n fut, ennyi szabad láb még akad. Ha valakinek ötlete és tudna segíteni azt nagyon megköszönném!
  1. /*
  2.  
  3. Simple AM/FM radio with Philips TEA5757 Radio-on-chip IC
  4.  
  5. This sketch should also work with most TEA5757-based audio systems
  6. tuner modules (found in old Philips sound systems).
  7.  
  8. TEA5757 to Arduino connections:
  9. Arduino              TEA5757
  10. A5                  MO/ST (24)
  11. A4                  Clock (27)
  12. A3                  Data (28)
  13. A2                  WR_EN (29)
  14. GND                 GND
  15.  
  16. Note:   This example uses an analog keypad with the following schematics:
  17.  
  18.                  A0
  19.                  |
  20.           2k2    |   330R        620R         1k          3k3        
  21. VCC -----\/\/\---+---\/\/\---+---\/\/\---+---\/\/\---+---\/\/\-----+----- GND
  22.                  |           |           |           |             |
  23.                  X SCAN_UP   X UP        X DOWN      X SCAN_DOWN   X BAND
  24.                  |           |           |           |             |
  25.                 GND         GND         GND         GND           GND
  26.  
  27. X = keys (N.O.)
  28.  
  29. */
  30.  
  31. #include <inttypes.h>
  32. #include <LiquidCrystal.h>
  33. #include <TEA5757.h>
  34. #include <Wire.h>
  35.  
  36.  
  37. // This example uses an analog 5-key keypad tied to A0
  38. #define KEYPAD_PIN A0
  39.  
  40. // Keypad keys
  41. #define KEY_BAND      5
  42. #define KEY_SCAN_DOWN 4
  43. #define KEY_DOWN      3
  44. #define KEY_UP        2
  45. #define KEY_SCAN_UP   1
  46. #define KEY_NONE      0
  47.  
  48. #define TNR_ERROR          2
  49. #define TNR_POOR_RECEPTION 1
  50. #define TNR_NORMAL         0
  51.  
  52.  
  53. // Initial frequencies
  54. uint16_t FMFrequency = 885;  // kHz / 100
  55. uint16_t AMFrequency = 53;   // kHZ / 10
  56. uint16_t frequency = FMFrequency;
  57.  
  58. uint8_t tunerStatus = TNR_NORMAL;
  59.  
  60. // Initial band
  61. uint8_t band = TEA5757_BAND_FM;
  62.  
  63. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  64.  
  65. TEA5757 Radio(A5, A4, A3, A2);  // MO/ST, Clock, Data, WR_EN
  66.  
  67.  
  68. /*******************************************************\
  69.  *                       getKey()                      *
  70.  * Read the (analog) keypad.                           *
  71.  * If you are using an digital (one key per input pin) *
  72.  * keypad, just this function to return the correct    *
  73.  * values                                              *
  74. \*******************************************************/
  75. uint8_t getKey(uint8_t keypadPin) {
  76.   uint16_t keypad;
  77.   uint8_t key = KEY_NONE;
  78.  
  79.   keypad = analogRead(keypadPin);
  80.  
  81.   if(keypad < 870) key = KEY_BAND;  
  82.   if(keypad < 600) key = KEY_SCAN_DOWN;  
  83.   if(keypad < 390) key = KEY_DOWN;  
  84.   if(keypad < 220) key = KEY_UP;  
  85.   if(keypad < 60)  key = KEY_SCAN_UP;
  86.  
  87.   return key;
  88. }
  89.  
  90.  
  91.  
  92. /*******************\
  93.  * Arduino setup() *
  94. \*******************/
  95. void setup() {
  96.   lcd.begin(16, 2);
  97.  
  98.   Radio.init();
  99.  
  100.   Radio.preset(frequency, band);
  101. }
  102.  
  103.  
  104. /******************\
  105.  * Arduino loop() *
  106. \******************/
  107. void loop() {
  108.   uint16_t previousFrequency;
  109.   uint8_t key = getKey(KEYPAD_PIN);
  110.   uint8_t searchDirection = 0;
  111.   int8_t delta = 0;
  112.   uint8_t i;
  113.  
  114.   lcd.setCursor(0, 0);
  115.  
  116.   // Frequency
  117.   switch(band) {
  118.     case TEA5757_BAND_FM:
  119.       lcd.print("  FM ");
  120.       if(frequency < 1000) lcd.print(' ');
  121.       lcd.print(frequency / 10);
  122.       lcd.print('.');
  123.       lcd.print(frequency % 10);
  124.       lcd.print(" MHz  ");
  125.       break;
  126.     case TEA5757_BAND_AM:
  127.       lcd.print("  AM ");
  128.       if(frequency < 100) lcd.print(' ');
  129.       lcd.print(frequency * 10);
  130.       lcd.print(" kHz   ");
  131.       break;
  132.   }
  133.  
  134.   // Status / Stereo
  135.   lcd.setCursor(0, 1);
  136.   switch(tunerStatus) {
  137.     case TNR_POOR_RECEPTION:
  138.       lcd.print("Poor Reception!!");
  139.       break;
  140.     case TNR_ERROR:
  141.       lcd.print("  Tuner Error!  ");
  142.       break;
  143.     default:
  144.       if(band == TEA5757_BAND_AM)
  145.         lcd.print("                ");
  146.       else
  147.         if(Radio.isStereo())
  148.           lcd.print("    [STEREO]    ");
  149.         else
  150.           lcd.print("    [      ]    ");
  151.   }
  152.  
  153.   if(key != KEY_NONE) { // Some key has been pressed
  154.     delay(200);
  155.     switch(key) {
  156.       case KEY_UP:        searchDirection = TEA5757_SEARCH_NONE; delta = +1; break;
  157.       case KEY_DOWN:      searchDirection = TEA5757_SEARCH_NONE; delta = -1; break;
  158.       case KEY_SCAN_UP:   searchDirection = TEA5757_SEARCH_UP;   delta = +1; break;
  159.       case KEY_SCAN_DOWN: searchDirection = TEA5757_SEARCH_DOWN; delta = -1; break;
  160.       case KEY_BAND:
  161.         switch(band) {
  162.           case TEA5757_BAND_FM:
  163.             FMFrequency = frequency;
  164.             frequency = AMFrequency;
  165.             band = TEA5757_BAND_AM;
  166.             break;
  167.           case TEA5757_BAND_AM:
  168.             AMFrequency = frequency;
  169.             frequency = FMFrequency;
  170.             band = TEA5757_BAND_FM;
  171.             break;
  172.         }
  173.         Radio.preset(frequency, band);
  174.         return;
  175.     }
  176.    
  177.     if(searchDirection == TEA5757_SEARCH_NONE) { // No search mode = manual tuning
  178.       // There is no way to detect "Poor Reception" in manual tuning mode with TEA5757
  179.       tunerStatus = TNR_NORMAL;
  180.       frequency += delta;
  181.       switch(band) {
  182.         case TEA5757_BAND_FM:
  183.           if(frequency > 1080) frequency = 885;
  184.           if(frequency < 885)  frequency = 1080;
  185.           break;
  186.         case TEA5757_BAND_AM:
  187.           if(frequency > 170) frequency = 53;
  188.           if(frequency < 53)  frequency = 170;
  189.           break;
  190.       }  
  191.       Radio.preset(frequency, band);
  192.  
  193.     } else { // Automatic tuning (search)
  194.  
  195.       previousFrequency = frequency;
  196.       // Keep reading the TEA5757 registry until get a non-zero frequency.
  197.       // According to the datasheet, the registry´s MSB should be "0" when the
  198.       // TEA5757 get tuned, but apparently it is always "1"
  199.       search:
  200.       Radio.search(band, TEA5757_LVL_4, searchDirection);
  201.       for(i = 0; i < 50; i++) {
  202.         delay(100);
  203.         frequency = Radio.getPLLFrequency();
  204.         if(frequency) { // Tuned!
  205.           i = 50; // Will exit the loop
  206.           switch(band) {
  207.             // Convert PLL frequency to "actual" frequency
  208.             case TEA5757_BAND_FM: frequency = (frequency / 8) - 107; break;
  209.             case TEA5757_BAND_AM: frequency = (frequency / 10) - 45; break;
  210.           }
  211.         }
  212.       }
  213.      
  214.       if(frequency > 2000) {
  215.         // Tuner error (not connected?): quit searching
  216.         tunerStatus = TNR_ERROR;
  217.         frequency = previousFrequency;
  218.         return;
  219.       }
  220.  
  221.       if(frequency == 0) {
  222.         // No station found (antenna problem?): quit searching
  223.         tunerStatus = TNR_POOR_RECEPTION;
  224.         frequency = previousFrequency;
  225.         Radio.preset(frequency, band);
  226.         return;
  227.       }
  228.      
  229.       if(frequency == previousFrequency) {
  230.         // Issue a pre-step and try again
  231.         frequency += delta;
  232.         Radio.preset(frequency, band);
  233.         delay(100);
  234.         goto search;
  235.       }
  236.  
  237.       tunerStatus = TNR_NORMAL;
  238.  
  239.       switch(band) {
  240.         case TEA5757_BAND_FM:
  241.           if((frequency > 1080) || (frequency < 885)) {
  242.             // Got out of bounds or found no station: go to the other end of the scale
  243.              if(searchDirection == TEA5757_SEARCH_UP)
  244.                 Radio.preset(885, TEA5757_BAND_FM);
  245.               else
  246.                 Radio.preset(1080, TEA5757_BAND_FM);
  247.               delay(100);
  248.               goto search;
  249.           }
  250.           break;
  251.         case TEA5757_BAND_AM:
  252.           if((frequency > 170) || (frequency < 53)) {
  253.             if(searchDirection == TEA5757_SEARCH_UP)
  254.               Radio.preset(53, TEA5757_BAND_AM);
  255.             else
  256.               Radio.preset(170, TEA5757_BAND_AM);
  257.             delay(100);
  258.             goto search;
  259.           }
  260.           break;
  261.       } // switch(band)
  262.  
  263.     } // else (automatic tunning)
  264.   } // if (key pressed)
  265. }
(#) KoblogPerGyok válasza jimmi12 hozzászólására (») Márc 8, 2020 /
 
Helló!

Az attól függ hogy szeretnéd hogy működjön a rendszer. Ha azt szeretnéd, hogy minden bekapcsolás után is megmaradjanak az állomások, akkor EEPROM-ba kell égetni az adatokat. Ezt megoldhatod az arduino -ban lévővel is, mert ha jól emlékszem van neki ilyen, de nem javasolnám. Inkább szerezz be egy i2c EEPROM-ot. (Kis hiba és minden loop-ban ír egyet s akkor hamar tönkremegy, mert csak 10 000 írást bír ki ugyanarra a területre. Erre találsz sok példát. Ha így jársz el, akkor a setup-ban egy tömbbe mented az ottani állomások adatait. A gombokkal meg egy változót növelsz 1-5 ig, az épp aktuális állomás adatokat akkor a tömb [valtozó] -val kinyerheted. Írni is hasonlóképpen tudsz.

Ugyanez a tömbös megoldás kell akkor is, ha nem mented eeprom-ba őket, csak addig tárolja az adatokat, míg be van kapcsolva az Arduino. Setupban egy 5 elemű tömböt definiálsz, plusz egy gomb ami a tömb indexeinek megfeleltethető lesz.

Setup

int allomasok[5] '5 elemű tömb, ha két érték tartozik egy állomáshoz akkor két elemű tömb kell


loop

ha megvan a keresett állomás frekije:

allomasok[index]=freki

az index 0-4 ig mehet, ami a nyomógombbal beállított érték lesz. 0-az első mentett állomás, 1 a második és így tovább.

Induláskor:
setupban: Aktualis freki=tomb[0]

Ekkor az elsővel indul de nem biztos, hogy abban van állomás. Inkább pluszban el kell menteni a start állomást is egy változóban és azt kiolvasni a tömbökkel együtt. Vagy az éppen hallgatott állomás tömbindexét kell még elmenteni pluszban, így mindig a legutolsónak hallgatott adóval indul. DE!!! Ekkor az EEPROM-ba el kell menteni az aktuális rádió tömb indexét DE CSAK akkor ha az változik!!! Ha nem így jársz el, akkor az eeprom hamar meghal!
A hozzászólás módosítva: Márc 8, 2020
(#) jimmi12 válasza KoblogPerGyok hozzászólására (») Márc 8, 2020 /
 
Szia, köszi, én is eepromban gondolkodtam, de a Nano belső eepromját használnám, ha már van és nem utolsó sorban spórolnék a lábakkal további terveim is vannak vele, ez az első lépés.
Induláskor a Lastallomas-al kezdene, ez jó ötlet, utána 5db nyomómb segítségével (vagy csak egy ami léptet a tárolt állomások között, ezt még átgondolom) lehetne váltani a csatornák között. Induláskor azonban meg kellene vizsgálni, hogy a Lastallomas üres-e vagy sem, ha igen akkor a 88.5mHz-el kellene indulnia. A scanup parancsra elkezd keresni a modul, ha talál adót megáll, ekkor kellene egy nyomógomb, ha tetszik a talált adó megynomom és letárolja a frekvenciát az eepromba (eeprom írás csak a gomb megnyomására lenne).
(#) KoblogPerGyok válasza jimmi12 hozzászólására (») Márc 8, 2020 /
 
Ez sem gond!

Ha el lehet dönteni működés közben, hogy a lastallomas üres-e vagy sem akkor nyert ügy. Mikor az adó hangolt akkor egy plusz változó (byte) 1 ha azon van állomás, nulla különben. A mentéskor ezt is mellé mentheted. Setup-ban kiolvas és ha 1 akkor ok, ha nulla indul a keresés.

A lényeg, hogy plusz változók mentésével ezeket simán meg lehet oldani, csak a setup-ban ki kell olvasni ezeket.

Sőt! Ha kételemű tömböt mentesz el, akkor minden tömb eleme mellé el lehet menteni ezt a plusz értéket is.
(#) asch válasza jimmi12 hozzászólására (») Márc 8, 2020 / 1
 
Van olyan eeprom API, ami először kiolvas és csak akkor írja felül, ha változott az érték. Ezzel akár periodikusan is mentheted az állapotot, a változások száma számít csak. A garantáltnál általában többet bír az eeprom, ha nem múlik élet rajta, akkor nyugodtan lehet építeni rá.
(#) jimmi12 válasza KoblogPerGyok hozzászólására (») Márc 8, 2020 /
 
Sajnos azért nem ennyire egyszerű, loopban fut az egész jelenlegi program, az egészet át kellene variálni hozzá, ez meghaladja a jelenlegi képességeimet, de azért nem adom fel!
(#) Kera_Will válasza jimmi12 hozzászólására (») Márc 8, 2020 /
 
Poweron eseten az eeprom tartalma kiolvas egy tombe.
A tömböt futas ido alatt irogatni modositani.
Tobb elemu tomb mert nem csak a frekit beirni hanem masik jelzo bit valtozott vagy nem.
Kikapcsolaskor egy port lab "megszakitasra kepes legyen" hivja meg a leallito fuggvenyt.
Ami nem csinal mast, hogy a tomb elemeit vissza irja az eepromba. De csak azokat amikben a valtozas tortent.
A tobbit nem bantja .
Pl a tomb 0. helyere a mindenkori aktualis frekit irni be.
Amint a tomb tartalma mentve lett a uC elkuldi mély alvásba ... es lekapcsolja a tápot.mindenről.
Power on esetén is ez a port ébreszthetné fel a uC-t.
(#) Rober_4 hozzászólása Márc 8, 2020 /
 
Sziasztok!
Ha kifagy az Arduino, azt hogyan tudjuk megfogni, hogy miért? A Serial.print kb szívás. Milyen lehetőségeim vannak még? Szeretném tudni, miért állt meg a program...
(#) Kera_Will válasza Rober_4 hozzászólására (») Márc 8, 2020 / 1
 
Serial print eseten hasznald line feed hexa 12 szekvenciat ... nem fog porogni a sok sok sor.
Mas lehetoseg ha van 1 2 szabad port akkor azokkal 1 1 ledet be bebillenteni akkor ha adott program reszletet eler a program.
A hozzászólás módosítva: Márc 8, 2020
Következő: »»   599 / 851
Bejelentkezés

Belépés

Hirdetés
XDT.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