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   751 / 839
(#) b_zoli válasza Bakman hozzászólására (») Okt 31, 2022 /
 
Oké, köszi! A köztes érték esetén mi fog történni? Addig nem vált, amíg el nem éri?
(#) Bakman válasza b_zoli hozzászólására (») Okt 31, 2022 /
 
Igen, addig nem vált, ez a hiszterézis lényege. Hogy az értékek jók-e, majd meglátod.
(#) b_zoli válasza Bakman hozzászólására (») Okt 31, 2022 /
 
Szuper! Köszi, javítom így.
(#) vyky válasza Josi777 hozzászólására (») Nov 1, 2022 /
 
Szia.
Köszönöm,a kondi megoldotta a problémát.
(#) don_peter hozzászólása Nov 1, 2022 /
 
Srácok, van egy program, amelyben a PWM frekijét szeretném megtudni.
Az MCU típusa: Atmega328P
A beállítás:
  1. TCCR1B = TCCR1B & B11111000 | B00000001; // Set PWM frequency for D9 & D10:

Ennyiből ez látható?
Sajnos több kódrész nem áll rendelkezésre, ami a beállításokat firtatná, vagy is sanszos, hogy a többi az alapértelmezett beállításon van. Az adatlapon túl vagyok, de nekem nem világos a beállítás. Azt nézem, hogy nincs osztó beállítva vagy is teljes sebességgel megy, ami vicces lenne PWM esetén.
A kód forrása itt elérhető: Bővebben: Link
Előre is köszi.
(#) Massawa hozzászólása Nov 1, 2022 /
 
Egy kérdés a szakiktol.
Van egy fütésszabályzo berendezésem. Eredetile, csak egy helyen mért hömérséklet alapján kezelte a fütésrendszerben a padlofütést, de közben kiderült, hogy a szakemberek valami nagyon elnéztek. 6 honapos szenvedés után megtalálták a hibát, igy át lett alakitva a fütésszabályozás, se sajnos a padlofütés nem lett jobb. Igy most megint én probálom kiegésziteni a profi rendszert.
Az uj berendezés egy második termosztatot kapott, egy idözitö orát ( programozhato mikor fütsön) egy bemenet, egy másik meg azt figyeli, hogy a gázkazán mikor füti a bojlert. ( kapcsolja be a keringetö pumpát. Az arduino két keringetö pumpát kapcsol, az egyik a bojlerben keringeti a fütövizet, a másik meg a padlofütés keringetö szivattyuját kezeli.
Az alapfeladat a következö.
Ha az ora bekapcsol, akkor az arduino megméri a bojlerben tárol viz hömérsékletét, s ha az több mint pl 45 fok akkor a fütövizet elkezdi keringetni a bojleren át.
A másik termosztat meg méri a padlofütéshez elérö fütövizet. Ott az nem lehet több mint 34 fok, külölnben a padlofütés lezár, azaz a forro viz nem kerül a rendszerbe.
Eddig kb 4-5 állapotot számoltam össze, melyik lenne a profibb program megoldás, simán megirni a programot bevinni a változokat meg az összefüggéseket, vagy jobb lenne állapot kezelövel ( state machine) kezelni a dolgokat.
Kösz az ötleteket. Szerintem meg tudom irni mindkét változatot.
(#) don_peter válasza Massawa hozzászólására (») Nov 1, 2022 /
 
Mivel elmélet így itt nem számít, hogy ez milyen MCU-ra íródik.

A tartály, gondolom valami nagyobb puffer tartály lehet, én mindenképpen vagy több hőmérőt helyeznék bele a tartályba függőlegesen, mert a víz képes a rétegződésre. Vagy időnként független a hőmérséklettől (főként ha egy helyen mérsz) meg keverném a vizet, hogy elegyedjen.

A másik része, hogy lehet kapni olyan szelepet, amely 35 foknál melegebb vizet nem enged át, tehát mikor fűtést indítód elsőnek a padlófűtést vizét keringetve melegíti fel a rendszer egészen addig, ameddig el nem éri a kívánt hőmérsékletet, majd a padlófűtés keringető leáll és fűti tovább a tartályt, ameddig szeretnéd. A köztes állapotra nincs ötletem, mert ha túl nagy a tartály, akkor lehet csak sokára hűl le a víz és a padlófűtés nem tud beindulni. Vagy 2 tartályt használsz. (utóbbit láttam már élesben is)
(#) Massawa válasza don_peter hozzászólására (») Nov 1, 2022 /
 
A tartály 600 literes, de nem a hidraulikus rendszerrel van a gond. Az mind adott és éntizedekig müködött, csak az uj kazán nem kepes kezelni a keverö szelepet (csak nyitni meg zárni tudta, de azt ki kellett iktatni, mert igy használhatatlan. Olyan szelepet meg már vagy 20 éve nem gyártanak, igy egyetlen uj kazán sem tudja kezelni, de ezt késön vették észre a szerelök. A régi kazán proporcionalisan nyitotta és több höérzékelövel kezelte a primér körben a viz hömérsékletét.
A padlofütés egységben benne van a gyári hömérseklet vezérlés, de eredetileg a keringetö szivattyú egyfolytában ment. Ezt szeretném most redukálni és levásztani az uj kazán vezérléséröl,: mert az használhatatlan erre a feladatra..

Engem gyakorlatilag csak most a programirás érdekelt
(#) Rober_4 hozzászólása Nov 1, 2022 /
 
Sziasztok!
Egy Arduino Due-t szeretnék összehozni ezzel:PCM5102
Elvileg i2s-en kéne kommunikálniuk.
Ehhez elvileg van egy program itt:
ArduinoDueHifi
Viszont a bekötésre és a konfigurálásra semmi ötletem sincs.
Bármilyen segítséget köszönök!
(#) Josi777 válasza don_peter hozzászólására (») Nov 1, 2022 / 1
 
31,4 kHz
(#) don_peter válasza Josi777 hozzászólására (») Nov 1, 2022 /
 
Köszi.. Közben meglett éppen a válasz megtekintése előtt 1 perccel. Nem magamtól jöttem rá, szóval így + megerősítés..

Massawa: akkor mi a kérdés? Ha csak programozni kell, akkor könnyebb a dolog, hiszen csak írsz egyet és tesztelés, majd ha nem tetszik optimalizálász vagy írsz egy másmilyent. De elég nagy a hisztérzis csak hosszútávon fogod tudni tesztelni.
A hozzászólás módosítva: Nov 1, 2022
(#) zosza18 válasza Massawa hozzászólására (») Nov 1, 2022 /
 
Szia!

Szerintem állapotgéppel jobb lesz a progid a fűtés vezérlésre.
Én mindig azzal csinálok mindent amit lehet.
(#) Massawa válasza zosza18 hozzászólására (») Nov 1, 2022 /
 
Kösz, nem vagyok nagyon profi az arduinoban ( évekig csak ASMben tudtam programozni) ezért bizonytalan voltam melyik a jobbik stilus.
(#) kapu48 válasza Rober_4 hozzászólására (») Nov 2, 2022 / 1
 
Szerintem a DUE nem tudja meghajtani ezt a DAC-ot! Ezért nem találsz hozzá alkalmazást.
Próbálkozz inkább ESP32 modullal meg hajtani, ahhoz találsz AUDIO.lib-et. Jól használható PCM5102-vel!

Talán itt kapsz segítséget: Bővebben: PCM5102 test
A hozzászólás módosítva: Nov 2, 2022
(#) vargham válasza kapu48 hozzászólására (») Nov 2, 2022 /
 
Idézet:
„Szerintem a DUE nem tudja meghajtani ezt a DAC-ot!”

Miért nem? Van benne I2S.
(#) kapu48 válasza vargham hozzászólására (») Nov 2, 2022 /
 
Mivel érdekelt a téma, ezért az elmúlt napon keresgéltem a neten.
És nem találtam biztató eredményeket, csak segítség kéréseket, hogy zajos a DUE-n külső DAC-os alkalmazás. De megoldást nem találtak rá.

Ha te ismersz működő arduinoDUE+MPCM5102-re alkalmazást? Ismertethetnéd az elérhetőségét!
Szívesen kipróbálnám.
Mivel AUDIO alkalmazásoknál Nem elég a DMA+I2S, hanem ki is kel azokat közben szolgálni elég gyorsan, küllőmben elég csúnya hangzást kapunk.
Bár az ESP32-es most olcsóbb mint a DUE. És található hozzá pár AUDIO alkalmazás MPCM5102-sel. Ezért én ezt választanám!
(#) vargham válasza kapu48 hozzászólására (») Nov 2, 2022 /
 
Nem, nem ismerek más(ok) által megírt, kész megoldást. Van benne megfelelő interfész, elvileg meg lehet írni. A sebesség érdekes kérdés. Ha a mikrokontroller elég is lenne, az Arduino környezet eléggé lerontja.
(#) sirály12 válasza kapu48 hozzászólására (») Nov 2, 2022 /
 
Nem tudom ezt ismered-e: Bővebben: Link
(#) Rober_4 válasza kapu48 hozzászólására (») Nov 2, 2022 /
 
Köszi, még sosem próbáltam az Esp32-őt. Van olyan számítási kapacitása, illetve sebessége mint a Due-nak? Illetve Serial port illetve i2c az LCD-hez? Egyébként köszi a segítséget!
(#) Rober_4 válasza sirály12 hozzászólására (») Nov 2, 2022 /
 
Sajnos szerintem ilyen modult készen nem kapok, illetve a bekötésről továbbra is hiányosak az infóim a képek alapján. Mindenesetre működni látszik az MPCM5202-vel. Én is tettem fel egy linket az eredeti kérdésemnél, ahol szoftveresen megoldották a dolgot. Sajnos a bekötésről ott sincsenek információim. Viszont ez a MPCM5202 kapható kereskedelmi forgalomban, ami nagy előnyt jelent minden más nem kapható alkatrésszel szemben.
(#) kapu48 válasza Rober_4 hozzászólására (») Nov 3, 2022 /
 
Minden felsorolt I/O megtalálható rajta: Bővebben: ESP32 Pinout

Bővebben: Wiki

Ajánlom az:
Bővebben: Link

Idézet:
ESP32-S3
Kétmagos Xtensa LX7 CPU, akár 240 MHz-ig [10]
Hozzáadott utasítások a gépi tanulási alkalmazások felgyorsításához
512 KiB SRAM, 384 KiB ROM és 16 KiB RTC SRAM
WiFi 2,4 GHz (IEEE 802.11 b/g/n) [11]
Bluetooth 5 (LE)
44 programozható GPIO
USB OTG”
A hozzászólás módosítva: Nov 3, 2022
(#) kapu48 válasza Rober_4 hozzászólására (») Nov 3, 2022 /
 
És a I2S bekötések lehetnek mivel a belső DAC-ot nem használod:
  1. #define Bit_Clock_BCLK 27
  2. #define Word_Select_WS 26
  3. #define Serial_Data_SD 25

De ez sem kötelező, állítólag szabadon választhatsz!

Bővebben: Példa
A hozzászólás módosítva: Nov 3, 2022
(#) kapu48 válasza Rober_4 hozzászólására (») Nov 3, 2022 /
 
A teljesítményt illetően, a 2 Coret függetlenül programozhatod, egyszere 2 szálon futhatnak a feladatok.
Pl.: Core0-on a I2S hang vezérlés, a Core1-en az összes többi feladat.
Bővebben: ESP32 Dual Core Programming with Arduino IDE
(#) kapu48 válasza Rober_4 hozzászólására (») Nov 3, 2022 /
 
Ez neked való project:
Bővebben: Simple_WiFi_Radio

Itt SPI LCD-t használ, szerintem az gyorsabb mint az I2C vezérléses.
Előny a sok tömörítési formátum lejátszása. Ha már SPI ekkor mehet rá SD kártya foglalat is, a legtöbb LCD-n már rajta szokott lenni.
(#) Rober_4 válasza kapu48 hozzászólására (») Nov 4, 2022 /
 
Nagyon nagyon köszönöm, megnézem holnap, ha lesz 2 percem!
(#) sirály12 hozzászólása Nov 5, 2022 /
 
Üdv.

Egy olyan kérdésem lenne, hogy arduino alatt kezelgetek egy Arduino Due panelecskét.
Ezzel egyetemben fejlesztettem egy saját panelre egy kis projektet, ahol a due-tól több lábat használok. A due-ra sajnos nincs kivezetve az összes láb, és persze a nem használt lábak nincsenek is lekezelve. A kérdésem a következő: ha a variant.ccp-be beírom a kihagyott lábakat, akkor az működni fog? Sima dikitális kimenetekről van szó. Pl. a (93)PC11-es láb.

Pl.:
  1. { PIOC, PIO_PC11,           ID_PIOC, PIO_OUTPUT_0, PIO_DEFAULT, PIN_ATTR_DIGITAL,                  NO_ADC, NO_ADC, NOT_ON_PWM,  NOT_ON_TIMER }, // PIN 38


Ha jól gondolom, akkor ez elé kellene betennem:
  1. // END
  2.   { NULL, 0, 0, PIO_NOT_A_PIN, PIO_DEFAULT, 0, NO_ADC, NO_ADC, NOT_ON_PWM, NOT_ON_TIMER }


És ekkor milyen számot fog kapni a port? Ez ami nem teljesen világos nekem.

Mindennemű segítséget köszönök.
(#) csurgay válasza sirály12 hozzászólására (») Nov 5, 2022 /
 
Nem tudom segít-e Neked, de hirtelen ezt találtam:

https://arduino.stackexchange.com/questions/84615/accessing-physica...no-ide
(#) sirály12 válasza csurgay hozzászólására (») Nov 5, 2022 / 1
 
Köszönöm a linket. Ez valamennyire megerősített, hogy jó úton járok.
Kreáltam egy saját boardot az arduino alatt, ezen megpróbálom összehozni, és így a már meglévő boardot sem bántom.
(#) szikorapéter hozzászólása Nov 8, 2022 /
 
Sziasztok.
Akadt egy kis problémám az alábbi programban.
Már minden úgy működik ahogy kell (bár az enkóder még érzékeny, néha kicsit ugrál?), viszont 330Khz felett valami baj van mert összekuszálódik a kimenő jelem.
Addig tű stabil szinusz, háromszög, négyszög megvan, viszont 330Khz felett beállítva olyan mintha folyamatosan változtatná 1Hz és 12,5Mhz között a jelsebességet a szkópon összevisszaság látszik csak.

A modulom AD9833 , az alaplap eredeti arduino uno 328P procival , kijelzőnek I2C-s 4x20-as Hdxxx kijelző.

Remélem valaki észreveszi a hibát amit nem látok.

  1. #include <Wire.h>
  2. #include <SPI.h>
  3. #include <LiquidCrystal_I2C.h>
  4. #define cols 20
  5. #define rows 4
  6. LiquidCrystal_I2C lcd(0x27,20,4);
  7. char *Blank;
  8.  
  9. #define bMode 0x2
  10. #define bDiv2 0x8
  11. #define bOpbiten 0x20
  12. #define bSleep12 0x40
  13. #define bSleep1 0x80
  14. #define bReset 0x100
  15. #define bHLB 0x1000
  16. #define bB28 0x2000
  17. #define bCntrl_reg 0x0
  18. #define bFreq_reg0 0x4000
  19. #define bFreq_reg1 0x8000
  20. #define bPhase_reg 0xC000
  21.  
  22. unsigned long Freq;
  23. unsigned long FreqStep;
  24. int Phase;
  25. enum eWaveForm {wfSin, wfTri, wfSqr, wfSqr2};
  26. eWaveForm WaveForm;
  27.  
  28. #define ShowScrollBar 1    
  29. #define ScrollLongCaptions 1
  30. #define ScrollDelay 500    
  31. #define BacklightDelay 2000000
  32. #define ReturnFromMenu 1    
  33.  
  34. enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
  35.                mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
  36.               };
  37.  
  38.  
  39. #define pin_CLK 3
  40. #define pin_DT  4
  41. #define pin_Btn 5
  42.  
  43. unsigned long CurrentTime, PrevEncoderTime;
  44. enum eEncoderState {eNone, eLeft, eRight, eButton};
  45. eEncoderState EncoderState;
  46. int EncoderA, EncoderB, EncoderAPrev, counter;
  47. bool ButtonPrev;
  48.  
  49. eEncoderState GetEncoderState();
  50. void LCDBacklight(byte v = 2);
  51. eMenuKey DrawMenu(eMenuKey Key);
  52.  
  53. byte ScrollUp[8]  = {0x4, 0xa, 0x11, 0x1f};
  54. byte ScrollDown[8]  = {0x0, 0x0, 0x0, 0x0, 0x1f, 0x11, 0xa, 0x4};
  55.  
  56. byte ItemsOnPage = rows;    
  57. unsigned long BacklightOffTime = 0;
  58. unsigned long ScrollTime = 0;
  59. byte ScrollPos;
  60. byte CaptionMaxLength;
  61.  
  62. struct sMenuItem {
  63.   eMenuKey  Parent;      
  64.   eMenuKey  Key;          
  65.   char      *Caption;    
  66.   void      (*Handler)();
  67. };
  68.  
  69. sMenuItem Menu[] = {
  70.   {mkNull, mkRoot, "Menu", NULL},
  71.     {mkRoot, mkSetFreq, "Freki beallitas", NULL},
  72.     {mkRoot, mkSetPhase, "Fazisszog beallit.", NULL},
  73.     {mkRoot, mkForm, "Jelalak beallitas", NULL},
  74.       {mkForm, mkSin, "Szinusz", NULL},
  75.       {mkForm, mkTri, "Haromszog", NULL},
  76.       {mkForm, mkSquare, "Negyszog", NULL},
  77.       {mkForm, mkSquareDiv2, "Negyszog F/2", NULL},
  78.       {mkForm, mkBack, "Vissza", NULL},
  79.     {mkRoot, mkInc, "Freki lepcso beall.", NULL},
  80.       {mkInc, mkInc1, "1 HZ", NULL},
  81.       {mkInc, mkInc10, "10 HZ", NULL},
  82.       {mkInc, mkInc100, "100 HZ", NULL},
  83.       {mkInc, mkInc1000, "1000 HZ", NULL},
  84.       {mkInc, mkBack, "Vissza", NULL},
  85.     {mkRoot, mkAbout, "Amugy...", NULL},
  86.     {mkRoot, mkBack, "Vissza", NULL}
  87. };
  88.  
  89. const int MenuLength = sizeof(Menu) / sizeof(Menu[0]);
  90.  
  91. void LCDBacklight(byte v) {
  92.   if (v == 0) {
  93.     BacklightOffTime = millis();
  94.     lcd.noBacklight();
  95.   }
  96.   else if (v == 1) {
  97.     BacklightOffTime = millis() + BacklightDelay;
  98.     lcd.backlight();
  99.   }
  100.   else {
  101.     if (BacklightOffTime < millis())
  102.       lcd.noBacklight();
  103.     else
  104.       lcd.backlight();
  105.   }
  106. }
  107.  
  108. eMenuKey DrawMenu(eMenuKey Key) {
  109.   eMenuKey Result;
  110.   int k, l, Offset, CursorPos, y;
  111.   sMenuItem **SubMenu = NULL;
  112.   bool NeedRepaint;
  113.   String S;
  114.   l = 0;
  115.   LCDBacklight(1);
  116.  
  117.   for (byte i = 0; i < MenuLength; i++) {
  118.     if (Menu[i].Key == Key) {
  119.       k = i;
  120.     }
  121.     else if (Menu[i].Parent == Key) {
  122.       l++;
  123.       SubMenu = (sMenuItem**) realloc (SubMenu, l * sizeof(void*));
  124.       SubMenu[l - 1] = &Menu[i];
  125.     }
  126.   }
  127.  
  128.   if (l == 0) {
  129.     if ((ReturnFromMenu == 0) and (Menu[k].Handler != NULL)) (*Menu[k].Handler)();
  130.     LCDBacklight(1);
  131.     return Key;
  132.   }
  133.  
  134.  
  135.   CursorPos = 0;
  136.   Offset = 0;
  137.   ScrollPos = 0;
  138.   NeedRepaint = 1;
  139.   do {
  140.     if (NeedRepaint) {
  141.       NeedRepaint = 0;
  142.       lcd.clear();
  143.       y = 0;
  144.       for (int i = Offset; i < min(l, Offset + ItemsOnPage); i++) {
  145.         lcd.setCursor(1, y++);
  146.         lcd.print(String(SubMenu[i]->Caption).substring(0, CaptionMaxLength));
  147.       }
  148.       lcd.setCursor(0, CursorPos);
  149.       lcd.print(">");
  150.       if (ShowScrollBar) {
  151.         if (Offset > 0) {
  152.           lcd.setCursor(cols - 1, 0);
  153.           lcd.write(0);
  154.         }
  155.         if (Offset + ItemsOnPage < l) {
  156.           lcd.setCursor(cols - 1, ItemsOnPage - 1);
  157.           lcd.write(1);
  158.         }
  159.       }
  160.     }
  161.     EncoderState = GetEncoderState();
  162.     switch (EncoderState) {
  163.       case eLeft: {
  164.          
  165.           LCDBacklight(1);
  166.           ScrollTime = millis() + ScrollDelay * 5;
  167.           if (CursorPos > 0) {  
  168.             if ((ScrollLongCaptions) and (ScrollPos)) {
  169.              
  170.               lcd.setCursor(1, CursorPos);
  171.               lcd.print(Blank);
  172.               lcd.setCursor(1, CursorPos);
  173.               lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
  174.               ScrollPos = 0;
  175.             }
  176.            
  177.             lcd.setCursor(0, CursorPos--);
  178.             lcd.print(" ");
  179.             lcd.setCursor(0, CursorPos);
  180.             lcd.print(">");
  181.           }
  182.           else if (Offset > 0) {
  183.            
  184.             Offset--;
  185.             NeedRepaint = 1;
  186.           }
  187.           break;
  188.         }
  189.       case eRight: {
  190.          
  191.           LCDBacklight(1);
  192.           ScrollTime = millis() + ScrollDelay * 5;
  193.           if (CursorPos < min(l, ItemsOnPage) - 1) {
  194.             if ((ScrollLongCaptions) and (ScrollPos)) {
  195.               lcd.setCursor(1, CursorPos);
  196.               lcd.print(Blank);
  197.               lcd.setCursor(1, CursorPos);
  198.               lcd.print(String(SubMenu[Offset + CursorPos]->Caption).substring(0, CaptionMaxLength));
  199.               ScrollPos = 0;
  200.             }
  201.             lcd.setCursor(0, CursorPos++);
  202.             lcd.print(" ");
  203.             lcd.setCursor(0, CursorPos);
  204.             lcd.print(">");
  205.           }
  206.           else {
  207.            
  208.             if (Offset + CursorPos + 1 < l) {
  209.               Offset++;
  210.               NeedRepaint = 1;
  211.             }
  212.           }
  213.           break;
  214.         }
  215.       case eButton: {
  216.          
  217.           LCDBacklight(1);
  218.           ScrollTime = millis() + ScrollDelay * 5;
  219.           if (SubMenu[CursorPos + Offset]->Key == mkBack) {
  220.             free(SubMenu);
  221.             return mkBack;
  222.           }
  223.           Result = DrawMenu(SubMenu[CursorPos + Offset]->Key);
  224.           if ((Result != mkBack) and (ReturnFromMenu)) {
  225.             free(SubMenu);
  226.             return Result;
  227.           }
  228.           NeedRepaint = 1;
  229.           break;
  230.         }
  231.       case eNone: {
  232.           if (ScrollLongCaptions) {
  233.            
  234.             S = SubMenu[CursorPos + Offset]->Caption;
  235.             if (S.length() > CaptionMaxLength)
  236.             {
  237.               if (ScrollTime < millis())
  238.               {
  239.                 ScrollPos++;
  240.                 if (ScrollPos == S.length() - CaptionMaxLength)
  241.                   ScrollTime = millis() + ScrollDelay * 2;
  242.                 else if (ScrollPos > S.length() - CaptionMaxLength)
  243.                 {
  244.                   ScrollPos = 0;
  245.                   ScrollTime = millis() + ScrollDelay * 5;
  246.                 }
  247.                 else
  248.                   ScrollTime = millis() + ScrollDelay;
  249.                 lcd.setCursor(1, CursorPos);
  250.                 lcd.print(Blank);
  251.                 lcd.setCursor(1, CursorPos);
  252.                 lcd.print(S.substring(ScrollPos, ScrollPos + CaptionMaxLength));
  253.               }
  254.             }
  255.           }
  256.           LCDBacklight();
  257.         }
  258.     }
  259.   } while (1);
  260. }
  261.  
  262.  
  263. void setup() {
  264.   pinMode(pin_CLK, INPUT);
  265.   pinMode(pin_DT,  INPUT);
  266.   pinMode(pin_Btn, INPUT_PULLUP);
  267.   SPI.begin();
  268.   //lcd.begin();
  269.   lcd.init();
  270.   lcd.backlight();
  271.   CaptionMaxLength = cols - 1;
  272.   Blank = (char*) malloc(cols * sizeof(char));
  273.   for (byte i = 0; i < CaptionMaxLength; i++)
  274.     Blank[i] = ' ';
  275.   if (ShowScrollBar) {
  276.     CaptionMaxLength--;
  277.     lcd.createChar(0, ScrollUp);
  278.     lcd.createChar(1, ScrollDown);
  279.   }
  280.   Blank[CaptionMaxLength] = 0;
  281.   FreqStep = 1;
  282.   WaveForm = wfSin;
  283.   WriteAD9833(bCntrl_reg | bReset | bB28);
  284.   SetFrequency(100);
  285.   SetPhase(0);
  286.   WriteAD9833(bCntrl_reg | bB28);
  287.   LCDRepaint();
  288.   LCDBacklight(1);
  289. }
  290.  
  291. void loop() {
  292.   unsigned long F;
  293.  
  294.   switch (GetEncoderState()) {
  295.     case eNone: {
  296.         LCDBacklight();
  297.         return;
  298.       }
  299.     case eLeft: {
  300.         LCDBacklight(1);
  301.         if (Freq == 1) return;
  302.         if (Freq > FreqStep)
  303.           SetFrequency(Freq - FreqStep);
  304.         else
  305.           SetFrequency(1);
  306.         break;
  307.       }
  308.     case eRight: {
  309.         LCDBacklight(1);
  310.         if (Freq == 12500000) return;
  311.         if (Freq + FreqStep <= 12500000)
  312.           SetFrequency(Freq + FreqStep);
  313.         else
  314.           SetFrequency(12500000);
  315.         break;
  316.       }
  317.     case eButton: {
  318.         LCDBacklight(1);
  319.         switch (DrawMenu(mkRoot)) {
  320.           case mkSetFreq: {
  321.               F = InputFreq();
  322.               while ((F > 12500000) or (F < 1)) {
  323.                 lcd.clear();
  324.                 lcd.print("Fuggveny generator");
  325.                 lcd.setCursor(0, 1);
  326.                 lcd.print(" 1Hz tol egeszen");
  327.                 lcd.setCursor(0, 2);
  328.                 lcd.print("12.5Mhz -ig");
  329.                 while (GetEncoderState() == eNone);
  330.                 F = InputFreq();
  331.               }
  332.               if (F != Freq)
  333.                 SetFrequency(F);
  334.               break;
  335.             }
  336.           case mkSetPhase:   {
  337.               SetPhase(InputPhase());
  338.               break;
  339.             }
  340.           case mkSin:        {
  341.               SetForm(wfSin);
  342.               break;
  343.             }
  344.           case mkTri:        {
  345.               SetForm(wfTri);
  346.               break;
  347.             }
  348.           case mkSquare:     {
  349.               SetForm(wfSqr);
  350.               break;
  351.             }
  352.           case mkSquareDiv2: {
  353.               SetForm(wfSqr2);
  354.               break;
  355.             }
  356.           case mkInc1:    {    
  357.               FreqStep = 1;
  358.               break;
  359.             }
  360.           case mkInc10:   {
  361.               FreqStep = 10;  
  362.               break;
  363.             }
  364.           case mkInc100:  {
  365.               FreqStep = 100;
  366.               break;
  367.             }
  368.           case mkInc1000: {
  369.               FreqStep = 1000;
  370.               break;
  371.             }
  372.           case mkAbout: {
  373.               lcd.clear();
  374.               lcd.print("AD9833 F. generator");
  375.               lcd.setCursor(0, 1);
  376.               lcd.print("      Zikha");
  377.               while (GetEncoderState() == eNone){
  378.                 LCDBacklight();
  379.               }
  380.               LCDBacklight(1);
  381.               break;
  382.             }
  383.         }
  384.  
  385.         LCDRepaint();
  386.         return;
  387.       }
  388.   }
  389.  
  390.   lcd.setCursor(0, 0);
  391.   lcd.print(Blank);
  392.   lcd.setCursor(0, 0);
  393.   lcd.print("Freki:  ");
  394.   lcd.print(Freq);
  395.   lcd.print("Hz");
  396. }
  397.  
  398.  
  399. void LCDRepaint() {
  400.   lcd.clear();
  401.   lcd.setCursor(0, 0);
  402.   lcd.print("Freki:  ");
  403.   lcd.print(Freq);
  404.   lcd.print("Hz");
  405.   lcd.setCursor(0, 1);
  406.   lcd.print("Fazis: ");
  407.   lcd.print( Phase);
  408.   lcd.print(" fok");
  409.   lcd.setCursor(0, 3);
  410.   lcd.print("AM modulacio max 80%");
  411.   lcd.setCursor(0, 2);
  412.   lcd.print("Forma:  ");
  413.   switch (WaveForm) {
  414.     case wfSin: {
  415.         lcd.print("Szinusz");
  416.         break;
  417.       }
  418.     case wfTri: {
  419.         lcd.print("Haromszog");
  420.         break;
  421.       }
  422.     case wfSqr: {
  423.         lcd.print("Negyszog");
  424.         break;
  425.       }
  426.     case wfSqr2: {
  427.         lcd.print("Negyszog F/2");
  428.         break;
  429.       }
  430.   }
  431. }
  432.  
  433.  
  434. eEncoderState GetEncoderState() {
  435.  
  436.   eEncoderState Result = eNone;
  437.   CurrentTime = millis();
  438.   if (CurrentTime >= (PrevEncoderTime + 5)) {
  439.     PrevEncoderTime = CurrentTime;
  440.     if (digitalRead(pin_Btn) == LOW ) {
  441.       if (ButtonPrev) {
  442.         Result = eButton;
  443.         ButtonPrev = 0;
  444.       }
  445.     }
  446.     else {
  447.       ButtonPrev = 1;
  448.       EncoderA = digitalRead(pin_DT);
  449.       EncoderB = digitalRead(pin_CLK);
  450.       if ((!EncoderA) && (EncoderAPrev)) {
  451.         if (EncoderB) Result = eRight;    
  452.         else          Result = eLeft;      
  453.       }
  454.       EncoderAPrev = EncoderA;
  455.     }
  456.   }
  457.   return Result;
  458. }
  459.  
  460.  
  461. unsigned long InputFreq() {
  462.   unsigned long F = Freq;
  463.   int Positions[] = {4, 5, 7, 8, 9, 11, 12, 13};
  464.   int Digits[8];
  465.   int p = 0;
  466.   lcd.clear();
  467.   lcd.setCursor(0, 2);
  468.   lcd.print("Maximum freki 12Mhz");
  469.   lcd.setCursor(2, 0);
  470.   lcd.print("Kimeneti Freki:");
  471.   lcd.setCursor(14, 1);
  472.   lcd.print("Hz");
  473.  
  474.   for (int i = 7; i >= 0; i--) {
  475.     Digits[i] = F % 10;
  476.     lcd.setCursor(Positions[i], 1);
  477.     lcd.print(Digits[i]);
  478.     F = F / 10;
  479.   }
  480.   lcd.setCursor(3, 3);
  481.   lcd.print("Kesz    Kilep");
  482.   lcd.setCursor(Positions[0], 1);
  483.   lcd.cursor();
  484.  
  485.  
  486.   while (1)
  487.   {
  488.     EncoderState = GetEncoderState();
  489.     switch (EncoderState) {
  490.       case eNone: {
  491.           LCDBacklight();
  492.           continue;
  493.         }
  494.       case eLeft: {
  495.           LCDBacklight(1);
  496.           if (p == 0) continue;
  497.           if (p == 9) {
  498.             lcd.setCursor(10, 3); lcd.print(' ');
  499.             lcd.setCursor(2, 3);  lcd.print('>');
  500.             p--;
  501.             continue;
  502.           }
  503.           if (p == 8) {
  504.             lcd.setCursor(2, 3); lcd.print(' ');
  505.             p--;
  506.             lcd.setCursor(Positions[p], 1);
  507.             lcd.cursor();
  508.             continue;
  509.           }
  510.          
  511.           p--;
  512.           lcd.setCursor(Positions[p], 1);
  513.           continue;;
  514.         }
  515.       case eRight: {
  516.           LCDBacklight(1);
  517.           if (p == 9) continue;
  518.           if (p == 8) {
  519.             lcd.setCursor(2, 3); lcd.print(' ');
  520.             lcd.setCursor(10, 3); lcd.print('>');
  521.             p++;
  522.             continue;
  523.           }
  524.           if (p == 7) {
  525.             lcd.noCursor();
  526.             lcd.setCursor(2, 3); lcd.print('>');
  527.             p++;
  528.             continue;
  529.           }
  530.          
  531.           p++;
  532.           lcd.setCursor(Positions[p], 1);
  533.           continue;;
  534.         }
  535.       case eButton: {
  536.           LCDBacklight(1);
  537.           if (p == 9) {
  538.             lcd.noCursor();
  539.             return Freq;
  540.           }
  541.           if (p == 8) {
  542.             lcd.noCursor();
  543.             F = 0;
  544.             for (int i = 0; i < 8; i++)
  545.               F = F * 10 + Digits[i];
  546.             return F;
  547.           }
  548.          
  549.           EncoderState = eNone;
  550.           lcd.setCursor(Positions[p], 1);
  551.           lcd.blink();
  552.           while (EncoderState != eButton)
  553.           {
  554.             EncoderState = GetEncoderState();
  555.             switch (EncoderState) {
  556.               case eNone: {
  557.                   LCDBacklight();
  558.                   continue;
  559.                 }
  560.               case eLeft: {
  561.                   LCDBacklight(1);
  562.                   if (Digits[p] == 0) continue;
  563.                   lcd.setCursor(Positions[p], 1);
  564.                   lcd.print(--Digits[p]);
  565.                   lcd.setCursor(Positions[p], 1);
  566.                   continue;
  567.                 }
  568.               case eRight: {
  569.                   LCDBacklight(1);
  570.                   if (Digits[p] == 9) continue;
  571.                   lcd.setCursor(Positions[p], 1);
  572.                   lcd.print(++Digits[p]);
  573.                   lcd.setCursor(Positions[p], 1);
  574.                   continue;
  575.                 }
  576.             }
  577.           }
  578.           LCDBacklight(1);
  579.           lcd.noBlink();
  580.           continue;
  581.         }
  582.     }
  583.   }
  584. }
  585.  
  586. int InputPhase() {
  587.   int w = Phase;
  588.   lcd.clear();
  589.   lcd.setCursor(1, 0);
  590.   lcd.print("Kimeno fazis fordit");
  591.   lcd.setCursor(8, 1);
  592.   lcd.print(w);
  593.   lcd.print("Fok");
  594.   while (1) {
  595.     EncoderState = GetEncoderState();
  596.     switch (EncoderState) {
  597.       case eNone: {
  598.           LCDBacklight();
  599.           continue;
  600.         }
  601.       case eButton: {
  602.           LCDBacklight(1);
  603.           return w;
  604.       }
  605.       case eLeft: {
  606.           LCDBacklight(1);
  607.           if (w > 0) w--;
  608.           break;
  609.         }
  610.       case eRight: {
  611.           LCDBacklight(1);
  612.           if (w < 360) w++;
  613.           break;
  614.         }
  615.     }
  616.     lcd.setCursor(8, 1);
  617.     lcd.print(w);
  618.     lcd.print("Fok  ");
  619.   }
  620. }
  621.  
  622.  
  623. void SetFrequency(unsigned long val) {
  624.   Freq = val;
  625.   unsigned long FreqData = round((float) val * 10.73741 + 0.5);
  626.   WriteAD9833(FreqData & 0x3FFF | bFreq_reg0);
  627.   WriteAD9833((FreqData >> 14) | bFreq_reg0);
  628. }
  629.  
  630.  
  631. void SetPhase(int val) {
  632.   Phase = val;
  633.   unsigned long PhaseData = round (float(val) * 11.37777 + 0.5);
  634.   WriteAD9833(PhaseData | bPhase_reg);
  635. }
  636.  
  637. void SetForm(eWaveForm val) {
  638.   WaveForm = val;
  639.   int16_t CntrlData;
  640.   switch (val) {
  641.     case wfSin: {
  642.         CntrlData = 0;
  643.         break;
  644.       }
  645.     case wfTri: {
  646.         CntrlData = bMode;
  647.         break;
  648.       }
  649.     case wfSqr: {
  650.         CntrlData = bOpbiten | bDiv2 | bSleep12;
  651.         break;
  652.       }
  653.     case wfSqr2: {
  654.         CntrlData = bOpbiten | bSleep12;
  655.         break;
  656.       }
  657.   }
  658.   WriteAD9833(CntrlData | bCntrl_reg | bB28);
  659. }
  660.  
  661.  
  662. void WriteAD9833(uint16_t Data) {
  663.   SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE2));
  664.   digitalWrite(SS, LOW);
  665.   delayMicroseconds(1);
  666.   SPI.transfer16(Data);
  667.   digitalWrite(SS, HIGH);
  668.   SPI.endTransaction();
  669. }
(#) asch válasza szikorapéter hozzászólására (») Nov 8, 2022 /
 
Nem ismerem ezeket a kütyüket, de ránézésre itt van a bibi:
  1. WriteAD9833(FreqData & 0x3FFF | bFreq_reg0);
  2.       WriteAD9833((FreqData >> 14) | bFreq_reg0);

Az alsó és a felső részletet is a 0-ás regiszterbe írod be.
Következő: »»   751 / 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