Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   6 / 197
(#) tufatofu hozzászólása Jan 18, 2024
Sziasztok!
Járt már hasonlóképpen valaki?
Vettem az asszonynak karácsonykor üzletben egy Xiaomi Redmi note 12 telefont, mert a fiam azt mondta, hogy ezeket már telefonnak lehet nevezni. 4.-én már vissza is vittem a boltba mert nem volt hajlandó tölteni semmiféle módon.
Szerintetek jobb lett volna akkor elállni a vásárlástól? Mi a gyakorlat ilyenkor? Megpróbálják megkókányolni, mert ez nekem nem tűnt olyan könnyen szétszedhetőnek. A bolt meddig ülhet egy ilyen "javításon", ill. mikor köteles kicserélni egy újra?
Köszönöm a válaszokat!
(#) Massawa válasza Massawa hozzászólására (») Jan 11, 2024
Egy ujabb fejlemény ( erröl nem is tudtam), hogy a SW hibáját elöször a posta ( bank) alkalmazottjaira kenték és kb 700 alkalmazottat büntettek meg. A bank alkalmazottajait ezért, mert a SW hiányt jelzett sok számlán amit lopásnak minösitettek.
Most a parlament dönt arrol, hogy kegyelmet és kártalanitást kapnak, de több mint 10 éves büntetett priusz rengeteg embert közülük csödbe vitt. ( egyszerü alkalmazottaktol bankfiok igazgatoig mindenki elöfordul a listán).
Egy szoftware hiba miatt.
(#) Massawa válasza sargarigo hozzászólására (») Jan 10, 2024
Mit tud a kuncsaft tenni, amikor átveri a bank (illetve magát a bankot is átveri valaki más)?
Ha meg marad valami apropénze biztos, hogy átmegy máshova, de ha nem marad semmi csak fizethetlen hitel akkor mi van?
Talán meg emlékszünk a devizahitelekre.
Külföldön ez sokkal gyakoribb, nem ritkán éjjel nappal jönnek a financiális mézesmadzagok, és sajnos mindig van egy réteg aki ész nélkül ráragad.
Ha meg baj van, láthatod az esetben is, 36 évvel késöbb kerülsz sorra a kártéritésre. És azt sem tudjuk ki mennyit kap vissza, általában soha nem annyit amit vesztett.
Nem ritkán a pénzügyek sajnos piramis játék szerüen épülnek fel, és gyakran annyira alattomosan, hogy még nagy és megbizhatonak tartott bankok is a vesztesek közé kerülnek. Föleg az angolszász világban a bank filozofia nagyon eltér a nálunk megszokottol. Ott bizonyos összeg felett a kuncsaft „befektet“ , ami mindig rizikoval jár.
(#) Massawa válasza majkimester hozzászólására (») Jan 10, 2024
Azért figyelhetnél jobban az irottakra.

1. a SW-t 36 évvel ezelött kezdték használni. ( kb 1988)
2. Többször merült fel közben, hogy valami nincs rendben. (valoszinü a banknak is)
3. a cég egyfolytában tagadott 2003-ig ( visszaélt az eröfölénnyel), amikor sikerült bebizonyitani a hibát.

Te gondolod, hogy idöközben nem voltak upgradek stb. söt valoszinü, hogy a HW is közben (többször) cserélödött, mégsem történt semmi. És valoszinü nem a kuncsaft reklamált, hanem a bank meg végül valoszinüleg egy megbizott, szintén SW specialista cég, akik be tudták bizonyitani a hibát.

( látod mi történik hasonlo esetekben a repülögépekkel, autokkal, vonatokkal stb. Az utolso csavarig szétszedik, és mindent tüzetesen átviszgálnak, még azt is kideritik, ki huzta az utolso vonalat a rajzokra és levonják a konzekvenciát. Ilyesmit eddig nem igen hallottunk, ha a SW-ben fordul elö a hiba.)
A hozzászólás módosítva: Jan 10, 2024
(#) img válasza xxxyyy hozzászólására (») Jan 10, 2024
Egyetértek, szintén zenész.

https://forum.vcfed.org/index.php?threads/486-l2-cache-not-working.1241500/
A hozzászólás módosítva: Jan 10, 2024
(#) majkimester válasza Massawa hozzászólására (») Jan 9, 2024
Idézet:
„Ezekszerint a szoftware fejlesztök valahogy nem felelösek a munkájuk minösegéért.”

Komolyabb helyeken a szoftvert megrendelő ügyfél, jelen esetben a bank saját maga végez(tet) egy UAT-t (User Acceptance Test) Ennek célja, hogy a valós környezetben bebizonyítani, hogy a sw a követelményeknek maradéktalanul megfelel. Ha az nem történt meg vagy nem elég alaposan akkor a bank hibázott. Ha az UAT eredményét a bank elfogadta, akkor ő bizonyíthatóan elismerte, hogy a sw megfelel a követelményeknek. Ez után kár mutogatni a sw fejlesztőre.
A hozzászólás módosítva: Jan 9, 2024
(#) Massawa hozzászólása Jan 9, 2024
Angol barátaim meselik, hogy mi történt az utobbi 36 evben.
Az egyik neves bank ( fiokjai voltak minden településen) egy rossz szoftwaret használt. A szoftver gyártoja évekig tagadta, hogy hibás lenne. A betétesek ezrei vesztették el a pénzüket.
Mintegy 20 éve a hatoságok bebizonyitották, hogy valoban hiba van a szoftwareben, és kényszeritették a neves közismert céget a javitásra.
Most jutott el a biroság a kártalanitàsra ( már aki meg él a károsultak közül), de érdekes modon senkit nem vontak felelöségre. Pedig sokan vesztették nemcsak a pénzüket, de a házukat lakásukat is.
Ezekszerint a szoftware fejlesztök valahogy nem felelösek a munkájuk minösegéért.
(#) Udvari Zsombor válasza Régi motoros hozzászólására (») Jan 6, 2024
Gondolj bele, a fényérzékelő nem tudja megkülönböztetni, hogy körülötte van fény vagy a saját fényét érzékeli, tehát normális, hogy kivárja a beállított időtartamot, míg lekapcsol.
"This is a feature, not a bug."
(#) asch válasza andyka hozzászólására (») Jan 5, 2024
Bocs, közben megnéztem a linkelt leírást is. Ő huntingnak nevezi a jelenséget és ír róla, hogy előfordulhat és hogy kell javítani:
"note that when used as a servo or speed control, you will experience hunting if the gain is too high, and/or if the feedback caps (C1 and C2) are too small (the arrangement shown below didn't require the caps). Hunting means that the servo will 'hunt' for the correct setting, but will overshoot and undershoot continuously"
Tehát vagy a gain túl nagy, vagy a C1 C2 túl kicsi.

>Három huzalja van: gnd és két + szál, egyik forgatja erre, a másik meg arra
Belül mi lehet benne? Hogy működik?

Azért nem biztos, hogy jó ötlet az analóg szabályozás, mert esetleg kis eltérésre folyni fog áram, de épp nem indul be a motor és feleslegesen melegítheti a szabályzó. Persze ha nem ég le, akkor mindegy. Meg nem is vagyok teljesen biztos benne, hogy előállhat ez a helyzet. Analóg rendszereken szerintem sokkal nehezebb hibát keresni, és például jelen helyzetben nehezebb beállítani a lengés mentes szabályozást is.
(#) glaci hozzászólása Dec 30, 2023
Sziasztok!
Működik a rendszer, de van azért hibája. Előfordul, hogy be se lép a while(1) részbe, csak esetenként a második bekapcsolásra. Van úgy, hogy megáll (lefagy) a 400ms késleltetés után és nem folytatódik a végtelen ciklus.

  1. /*PIC16F887  8MHz belső oszcillátor
  2. KÖZELEDÉS ÉRZÉKELŐ HC-SR04 ultrasonic szenzorral
  3.  
  4. */
  5.  
  6.  // LCD module connections
  7. sbit LCD_RS at RD2_bit;
  8. sbit LCD_EN at RD3_bit;
  9. sbit LCD_D4 at RD4_bit;
  10. sbit LCD_D5 at RD5_bit;
  11. sbit LCD_D6 at RD6_bit;
  12. sbit LCD_D7 at RD7_bit;
  13.  
  14. sbit LCD_RS_Direction at TRISD2_bit;
  15. sbit LCD_EN_Direction at TRISD3_bit;
  16. sbit LCD_D4_Direction at TRISD4_bit;
  17. sbit LCD_D5_Direction at TRISD5_bit;
  18. sbit LCD_D6_Direction at TRISD6_bit;
  19. sbit LCD_D7_Direction at TRISD7_bit;
  20. // End LCD module connections
  21. //változók
  22.   int a;
  23.   char txt[7];
  24.  
  25. void main()
  26. {  
  27.   OSCCON=0x70;
  28.   C1ON_bit=0;
  29.   C2ON_bit=0;
  30.   INTCON.GIE=0;
  31.   ANSEL=0;
  32.   ANSELH=0;
  33.   TRISB = 0b00010000;           //RB4 bemenet PIN (ECHO)
  34.   TRISD=  0b00000000;            //minden RD kapu kimenet
  35.   Lcd_Init();
  36.   Lcd_Cmd(_LCD_CLEAR);          // Clear display
  37.   Lcd_Cmd(_LCD_CURSOR_OFF);     // Cursor off
  38.   PORTB.F0=0;                   //trig kimeneti jel
  39.   //PORTB.F4=0;
  40.     Lcd_Out(1,1,"HC-SR4");
  41.     Delay_ms(2000);
  42.     Lcd_Cmd(_LCD_CLEAR);
  43.     T1CON = 0x10;
  44.  
  45.    while(1)
  46.   {  
  47.     TMR1H = 0;
  48.     TMR1L = 0;
  49.  
  50.     PORTB.F0 = 1;               //TRIGGER HIGH
  51.     Delay_us(10);               //10uS Delay
  52.     PORTB.F0 = 0;               //TRIGGER LOW
  53.     while(!PORTB.F4);           //várjuk az echo jelet high
  54.     T1CON.F0 = 1;               //Timer Starts
  55.     while(PORTB.F4);            //várjuk az echo jel végét LOW
  56.     T1CON.F0 = 0;               //Timer Stops
  57.  
  58.     a = (TMR1L | (TMR1H<<8));   //Reads Timer Value
  59.     a = a/58.82;                //Converts Time to Distance
  60.     a = a + 1;                  //Distance Calibration
  61.  
  62.     if(a>=2 && a<=400)          //Check whether the result is valid or not
  63.     {
  64.       Lcd_Out(1,1,"itt vagyok");
  65.       IntToStr(a,txt);
  66.       Ltrim(txt);
  67.       Lcd_Cmd(_LCD_CLEAR);
  68.       Lcd_Out(1,1,"Distance = ");
  69.       Lcd_Out(1,12,txt);
  70.       Lcd_Out(1,15,"cm");
  71.     }
  72.     else
  73.     {
  74.       Lcd_Cmd(_LCD_CLEAR);
  75.       Lcd_Out(1,1,"Out of Range");
  76.     }
  77.    
  78.     Delay_ms(400);
  79.        // Lcd_Cmd(_LCD_CLEAR);
  80.     Lcd_Out(2,1,"itt vagyok6");
  81.   }
  82.  
  83. }
(#) glaci hozzászólása Dec 29, 2023
Sziasztok!
Mint az előbbi kérdésemben elővezettem, sok a tudatlanságom!
Most hogy az idők rendben vannak a kérdés az, hogy miért nem lép ki while(!PORTB.F4); ciklusból a program, pedig a feltétel változik.

/*PIC16F887 8MHz belső oszcillátor
KÖZELEDÉS ÉRZÉKELŐ HC-SR04 ultrasonic szenzorral

*/

// LCD module connections
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
//változók
int a;
char txt[7];

void main()
{
OSCCON=0b01110101;
TRISB = 0b00010000; //RB4 bemenet PIN (ECHO)
TRISD= 0b00000000; //minden RD kapu kimenet
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
PORTB.F0=0; //trig kimeneti jel
//PORTB.F4=0;
Lcd_Out(1,1,"HC-SR4");
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
T1CON = 0x10;

while(1)
{
TMR1H = 0;
TMR1L = 0;

PORTB.B0 = 1; //TRIGGER HIGH
Delay_us(10); //10uS Delay
PORTB.B0 = 0; //TRIGGER LOW

Lcd_Out(1,1,"itt vagyok");
while(!PORTB.F4); //Waiting for Echo

T1CON.F0 = 1; //Timer Starts
while(PORTB.F4); //Waiting for Echo goes LOW
T1CON.F0 = 0; //Timer Stops

a = (TMR1L | (TMR1H<<8)); //Reads Timer Value
a = a/58.82; //Converts Time to Distance
a = a + 1; //Distance Calibration
if(a>=2 && a<=400) //Check whether the result is valid or not
{
IntToStr(a,txt);
Ltrim(txt);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Distance = ");
Lcd_Out(1,12,txt);
Lcd_Out(1,15,"cm");
}
else
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Out of Range");
}

Delay_ms(400);
}

}
  1.  
A hozzászólás módosítva: Dec 29, 2023
(#) Frankye hozzászólása Dec 27, 2023
Sziasztok!
Nemrégiben gépcsere volt nálam, a régi XP-s Win cserére került Win10-re. Ezzel együtt a korábbi Flowcode-om is megszánt létezni. Letöltöttem a díjmentes verziót, ez azonban nem hozza létre a kívánt hex-et. Az alábbi hibaüzenetet dobja:
Idézet:
„You do not have a valid licence to perform this action”

(Amennyiben a HEX-be fordítást választom.)
Hogyan lehet ezt kiküszöbölni?
Előre is köszönöm a választ!
(#) Laslie válasza asch hozzászólására (») Dec 13, 2023
Ezt csináltam, a leírások alapján:
  1. #include <SPI.h>
  2. #include <SD.h>
  3. #include "TMRpcm.h"
  4. #include "LowPower.h"
  5.  
  6. const int chipSelect = 10;
  7. const int wakeUpPin = 2;
  8. const int fetPin = 3;
  9. int buttonState = 0;
  10.  
  11. TMRpcm tmrpcm;
  12. File root;
  13.  
  14. void wakeUp() {
  15.   buttonState = HIGH;
  16.   detachInterrupt(digitalPinToInterrupt(wakeUpPin));
  17. }
  18.  
  19. void initSDCard() {
  20.   while (!Serial);
  21.     Serial.print("Initializing SD card...");
  22.  
  23.   if (!SD.begin(chipSelect)) {
  24.     Serial.println("initialization failed. Things to check:");
  25.     Serial.println("1. is a card inserted?");
  26.     Serial.println("2. is your wiring correct?");
  27.     Serial.println("3. did you change the chipSelect pin to match your shield or module?");
  28.     Serial.println("note: press reset or reopen this serial monitor after fixing your issue!");
  29.     while (true);
  30.   }
  31.  
  32.   Serial.println("initialization done.");
  33.   root = SD.open("/");  
  34.   tmrpcm.speakerPin = 9;
  35.   tmrpcm.setVolume(5);
  36.   tmrpcm.quality(1);
  37. }
  38.  
  39. void setup() {
  40.   Serial.begin(9600);
  41.   pinMode(wakeUpPin, INPUT);
  42.   pinMode(fetPin, OUTPUT);
  43.   digitalWrite(fetPin, LOW);
  44. }
  45.  
  46. void loop() {
  47.   buttonState = LOW;
  48.   attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, RISING);
  49.   LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  50.   if (buttonState == HIGH) {
  51.     initSDCard();
  52.     digitalWrite(fetPin, HIGH);
  53.     tmrpcm.play("DINGDONG.WAV");
  54.     digitalWrite(fetPin, LOW);
  55.   }
  56. }
(#) sargarigo válasza vill hozzászólására (») Dec 13, 2023
Nem próbáltam, nézd meg! Gondolatot ébreszteni..
  1. #include <Wire.h>
  2. #include <Adafruit_BMP180.h>
  3. Adafruit_BMP180 bmp;
  4.  
  5. const int relayPin = 8; // A relé csatlakoztatásának pinje
  6.  
  7. float previousTemperature = 0.0;
  8.  
  9. void setup() {
  10.   Serial.begin(9600);
  11.  
  12.   if (!bmp.begin()) {
  13.     Serial.println("Could not find a valid BMP180 sensor, check wiring!");
  14.     while (1);
  15.   }
  16.  
  17.   pinMode(relayPin, OUTPUT);
  18. }
  19.  
  20. void loop() {
  21.   float currentTemperature = bmp.readTemperature();
  22.  
  23.   Serial.print("Current Temperature: ");
  24.   Serial.print(currentTemperature);
  25.   Serial.println(" °C");
  26.  
  27.   delay(600000); // 10 perc várakozás
  28.  
  29.   float newTemperature = bmp.readTemperature();
  30.  
  31.   Serial.print("New Temperature: ");
  32.   Serial.print(newTemperature);
  33.   Serial.println(" °C");
  34.  
  35.   if (newTemperature > currentTemperature) {
  36.     digitalWrite(relayPin, HIGH); // A relé bekapcsol
  37.     Serial.println("Relay ON");
  38.   } else {
  39.     digitalWrite(relayPin, LOW); // A relé kikapcsol
  40.     Serial.println("Relay OFF");
  41.   }
  42.  
  43.   previousTemperature = newTemperature;
  44. }
A hozzászólás módosítva: Dec 13, 2023
(#) bbb válasza img hozzászólására (») Dec 11, 2023
Az SSDMP programot ajánlották hozzá, ami hajlandó is megszólítani, mint RTS5735DL vezérlő. Viszont amit találna magának B47R memóriatípust, arra jön a hiba:
Idézet:
„Step 00 Generate Config -> Fail nand_support_list -> NandType : B47R, bank*.ram file -> NandType : B72B, Config mismatch”

Illetve másik SSDMP verzió már RM1135-ként is kezeli, de a memóriára ugyan ez a panasza.
A hozzászólás módosítva: Dec 11, 2023
(#) Laslie hozzászólása Dec 11, 2023
Sziasztok!

Szeretnék készíteni egy csengőt. (Tudom, hogy lehet kapni, de az nem olyan, mert ebben ugye ott a hobbi meg a kihívás. )

Szóval a kapcsolás a következő:
- Arduino Nano
- SD kártya
- nyomógomb
- FET az LM386 táp kapcsolásához
- LM386-ra épülő erősítő
(Mellékelem a kapcsolási rajzot)

A programot sikerült összeraknom (természetesen nem magam találtam ki. Google a barátom. )
Működik is, ha megnyomom a gombot, akkor lejátssza a wav fájlt. Eddig jó, de szeretném úgy módosítani a programot, hogy az Ardu-t szeretném elaltatni, majd ha a nyomógombot megnyomom, akkor feléledve játssza le a wav fájlt, majd ha vége, akkor ismét menjen aludni.
Na itt kezdődik a problémám. A kódot módosítva el is megy alvásba a CPU, majd a gomb megnyomására csak zúgást lehet hallani a hangszóróból.
Végig próbáltam már egy csomó példakódot, természetesen a doksit is elolvastam, és abból is próbáltam információt szerezni, de a helyzet nem változott.

A kérdésem az lenne, hogy miként tudnám a CPU-t elaltatni, majd a gomb megnyomására lejátszani a wav fájlt? Ebben kérnék segítséget. Előre is köszönöm.

Íme a működő kód:
  1. #include <SPI.h>
  2. #include <SD.h>
  3. #include "TMRpcm.h"
  4.  
  5. const int chipSelect = 10;
  6. const int buttonPin = 2;
  7. const int fetPin = 3;
  8. int buttonState = 0;
  9.  
  10. TMRpcm tmrpcm;
  11. File root;
  12.  
  13. void initSDCard() {
  14.   while (!Serial);
  15.     Serial.print("Initializing SD card...");
  16.  
  17.   if (!SD.begin(chipSelect)) {
  18.     Serial.println("initialization failed. Things to check:");
  19.     Serial.println("1. is a card inserted?");
  20.     Serial.println("2. is your wiring correct?");
  21.     Serial.println("3. did you change the chipSelect pin to match your shield or module?");
  22.     Serial.println("note: press reset or reopen this serial monitor after fixing your issue!");
  23.     while (true);
  24.   }
  25.  
  26.   Serial.println("initialization done.");
  27.   root = SD.open("/");
  28.   tmrpcm.speakerPin = 9;
  29.   tmrpcm.setVolume(5);
  30.   tmrpcm.quality(1);
  31. }
  32.  
  33. void setup() {
  34.   Serial.begin(9600);
  35.   initSDCard();
  36.   pinMode(buttonPin, INPUT);
  37.   pinMode(fetPin, OUTPUT);
  38.   digitalWrite(fetPin, LOW);
  39. }
  40.  
  41. void loop() {
  42.   buttonState = digitalRead(buttonPin);
  43.   if (buttonState == HIGH) {
  44.     digitalWrite(fetPin, HIGH);
  45.     tmrpcm.play("DINGDONG.WAV");
  46.     digitalWrite(fetPin, LOW);
  47.   }
  48. }
A hozzászólás módosítva: Dec 11, 2023
(#) pucuka válasza tönöpö hozzászólására (») Dec 9, 2023
Azt még eel kéne dönteni, hogy a háromfázisú gép szinkron, vagy aszinkron.
Szinkron motornál (állandó mágnesek vannak benne, általában a forgórészben) csak a frekvenciától függ a fordulatszám, ha túlterhelés hatására kiesik a szinkronból, akkor megáll. Aszinkron motornál csökken a fordulatszám a terhelés hatására, vagy a motoráram (feszültség) hatására, mert nő a slip, de ez is csak a billenő nyomatékig.
Kapcsolásom ugyan nincsen, de emlékeim szerint egyszer találtam egy kapcsolást a Microchip cég egyik AN xxx (application note) -jában. Elő kéne bányásznod.
(#) Tie hozzászólása Dec 2, 2023
Sziasztok,

Egy kis segítségre lenne szükségem, nem bírok magamtól rájönni a dolog nyitjára.
Összeraktam a kazánvezérlő PLC-m programját, gyönyörűen teszi is a dolgát, viszont szeretnék még belerakni egy kis funkciót. Nagyjából sejtem, hogy hogyan kéne, de nem bírom összerakni hogy tényleg működjön is.

Van ugyebár 6 bemenetem:
I00 - Földszinti szobatermosztát
I01 - Emeleti szobatermosztát
I02 - Puffer hőmérséklet a tetejénél (egy digitális termosztát 30+5fokra állítva [30 fok, 5 fok hiszterézissel, azaz 35 foknál BEkapcsol, 30 foknál KIkapcsol)
I03 - Puffer hőmérséklet az alsó harmadánál (ugyanolyan digit termosztát 30+25 fokra állítva, 55foknál BEkapcsol, 30 foknál KIkapcsol)
I04 - Bojler hőmérséklet (harmadik ugyanolyan digit termosztát, a bojlerben lévő hmv hőmérsékletét figyel)
I05 - ATMOS kazánszivattyú üzem - Azt figyeli, hogy jár-e az Atmos faelgázosító kazán szivattyúja (ha jár, akkor nem indítjuk a gázkazánt, mer' minek, hiszen éppen tüzelek a faelgázosítóban)

És van 4 darab kimenetem:
Q02 - Földszinti padlófűtés szivattyú indítása
Q03 - Emeleti padlófűtés szivattyú indítása
Q04 - Gázkazán váltószelep átállítása a puffer felől a bojler felé
Q05 - Gázkazán indítása

Az alap logika az alábbi:

- Ha bármelyik szobatermosztát kér hőt a házban, ÉS nem ég a tűz az ATMOS szivattyúban, akkor elindítjuk a gázkazánt. Ha ég a tűz az ATMOSban, akkor a gázkazán nem indul el, mer minek.

- Ha a pufferen a felső termosztát 35 foknál melegebbet mér, akkor elindítjuk a padlófűtés szivattyúkat, alatta leállítjuk őket, hogy ne hűtsék ki a padlót, ha valamiért mégsincs semmilyen fűtés (leég a faelgázosító, a gázkazánt kikapcsoltam, és elfogyott a pufferből a melegvíz)

- Ha a pufferen az alsó termosztát melegebbet mér, mint 55 fok, akkor leállítjuk a gázkazánt, hogy ne fűtsünk túl. Ha az alsó termosztát visszahűl 30 fok alá, újraindul a gázkazán, mert a termosztáton magán így állítottam be a hiszterézist

- Ha a bojler termosztát jelez, mert hideg a HMV a bojlerben, ÉS a puffer tele van melegvízzel (felső és alsó termosztát EGYSZERRE ON), VAGY üzemel az ATMOS, akkor megengedjük a gázkazánnak, hogy fűtsön a bojlerbe, azaz Gázkazán indítás ON, ÉS Gázkazán váltószelep ON.
Azért csináltam így a logikát, mert a ház fűtése a prioritás, és ha a pufferben van 500 liter 55 fokos víz, arról simán elmegy a két szint még két órát, a bojlert meg max fél óra alatt felfűti a gázkazán. Ha a pufferben kevés a melegvíz, akkor a gázkazán a házat fűti. és persze, ha ég a tűz az ATMOS-ban, akkor persze nyugodtan fűthet a gázkazán a bojlerre

Ezt a logikát jeleneleg a PLC 8 állapottal kezeli le, csatoltam a képeket.
PLC01 - alapállapot, semmi nem on.
PLC02 - bármelyik szobatermosztát kér hőt, ÉS nem ég az Atmos = elindul a gázkazán
PLC03 - elkezd telni a puffer felül, indulhatnak a padlószivattyúk is
PLC04 - A puffer 3/4-ig tele van 55 fokos vízzel, leáll a gázkazán, a szivattyúk továbbra is tolják a vizet a padlóba
PLC05 - A bojler kér hőt, de a puffer nincs tele = a gázkazán továbbra is üzemel, de nem állítjuk át a váltószelepet, továbbra is a pufferbe fűt
PLC06 - Puffer tele, bojler is kér hőt = gázkazán üzemel, váltószelep átvált a bojler felé
PLC07 - Puffer nincs tele, DE megy az Atmos (azaz a faelgázosítóval fűtöm a házat) ÉS kér a bojler hőt = indulhat a gázkazán, és átváltjuk a váltószelepet
PLC08 - Ég a tűz az Atmosban, bojler nem kér hőt, gázkazán letiltva.

Ez így tök jó. Viszont azt szeretném még belefaragni a programba, hogy a gázkazán csak akkor induljon ÚJRA amikor nem ég az ATMOS - vagy azért, mert be se gyújtottam, vagy azért, mert már leégett - amikor a puffer TELJESEN kihűl, azaz amikor kihúzta belőle a padlófűtés az összes melegvizet.

Azért szeretném ezt elérni, mert sokszor előfordul, hogy leég az ATMOS, a puffer felül 85 fokos, alul viszont csak 35, de a ház már csak egy óráig kér hőt, azaz tök felesleges ráfűteni a pufferre a gázkazánnal, mert a benne lévő 3-400 liter 85 fokos víz még bőven elég.

Jelen állapotban a gázkazán beindul, ha az alsó puffer termosztát 30 foknál hidegebbet mér, és nem indul el, ha 55 foknál melegebbet.

Azért is jó lenne ez a funkció, mert ha nem gyújtok be az ATMOSba, és csak a gázkazán fűt, akkor is csak akkor indulna újra, miután a felső puffer termosztát is lehűlt. Ezzel lehetne spórolni elég sokat, mert így az van, hogy amíg kér a ház hőt, és a pufi nincs tele, megy a gázkazán, aztán mikor lekapcsolnak a szobatermosztátok, ott állok 5-600 liter 55 fokos vízzel tök fölöslegesen. Ezt a felesges fűtést lehetne megspórolni, ha a gázkazán csak akkor indulna be újra, mikor az egész puffer újra csak 30 fokos.

Azon gondolkoztam, hogy valami olyan funkcióblokkot kéne berakni a puffer termosztátok jelei után, hogy "lefutó él figyelés", és azt összerakni egy ÉS blokkba, azaz a gázkazánt akkor indítjuk el, ha mindkét puffer termosztáton történt lefutó él, azaz BE-ről KI-kapcsolódtak, MINDKETTŐ. Azaz csak akkor, amikor a felső is lehűlt. De ezt nem sikerült sehogyse összeraknom eddig.

Az APB PLC-m ilyen funkcióblokkokat tud, ebből kéne megoldani valahogy:

ÉS
ANDL (kimenet akkor kapcsol, ha MINDEGYIK bemenet logikai 1 értéket vesz fel, ÉS a bemenetek közül egy az előző ciklusban NEM volt bekapcsolva)
VAGY
not (negálás, jelfordítás)
KIZÁRÓ VAGY
Negált ÉS
NANDL (a kimenet abban az esetben kapcsol, ha EGY bemenet logikai értéke 0, és az előző ciklusban MINDEN bemenet logikai 1 értékű volt)
Negált VAGY
VAGY felfutóü él figyeléssel
VAGY lefutó él figyeléssel (Ha legalább egy bemenet értéke egyről nullára vált, akkor a kimenet logikai 1 értéket vesz fel)

Tud még mindenféle mást is, mint pl TOND (Bekapcsolás késleltető), PONS (impulzus adó), SPBL (impulzus relé), BLNK (ütemadó), meg mindenféle egyebet is, de elvileg az alapokkal meg kéne tudni csinálni, nem?

Az első gondolatom az volt, hogy mindkét puffer termosztát jele után teszek egy "VAGY lefutó él figyeléssel" blokkot, amikbe semmi más nem lesz bekötve, csak maga a termosztát jele, és azokat összehozom egy ÉS blokkba, és ezzel megszakítom a gázkazán indítás előtti logikai sort.
Össze is raktam, kipróbáltam a szimulációban, de nem volt jó.

Na meg ugye, az is kell, hogy elsőre elinduljon a gázkazán, mert ha ez az alapállapot, akkor sose fog elindulni a gázkazán ELSŐRE, hiszen előtte nem történt a pufferben lefutó él egyik termosztáton se.

Tudnátok segíteni, hogy hogy kéne összerakjam ezt a plusz funkciót?
(#) Suba53 válasza proba hozzászólására (») Nov 28, 2023
Szerintem nem power bank modullal kellene megoldani, hanem inkább LiIon töltő modullal.
Azon az akku csatlakozón állandóan megvan a 3,7 - 4,2 V a töltöttségtől függően.
Az akku kivezetésre egy kis stepup konverter, ami az 5V-ot adja a kütyünek.

A power bank elsődleges funkciója a kimenet biztosítása, tehát ha a kimenet terhelve van, akkor nem tud tölteni. ( Ugyanaz az induktív kör van mindkét funkcióra. )
A hozzászólás módosítva: Nov 28, 2023
(#) diamik hozzászólása Nov 27, 2023
Sziasztok,

kutakodtam a neten és kicsit elbizonytalanodtam. Mielőtt bárki leszólna, inkább felvetem a dolgot, mint hogy rosszul tudjam. Sokszor volt, hogy magát tudományosnak beállító oldal butaságokat ír (ez most majd itt kiderül )

Egy és háromfázisú hálózatokról olvasgattam. Szembe jött ez a cikk: Why 3-Phase Power?

A cikk azt írja, hogy 3-fázisú hálózaton idézem angolul
Idézet:
„It clearly shows that the value of electric power in a three phase system is 1.732 (value of √3) times bigger than the power transmitted in a single phase supply system.”
Aki nem tudna angolul, ez kb. azt jelenti, hogy az egyfázishoz képest 1.732-vel nagyobb teljesítményt tudunk szállítani.

Ugyan nem ír se fázis se vonali feszültségről, de nekem úgy tűnik keveri a két fogalmat (csillag láncolás esetén Uf=Uv/gyök(3), illetve If = Iv nemde?

Vagy már csak este van nekem...
(#) segítő hozzászólása Nov 26, 2023
Audio note I zero erősítő (ECL82) kapcsolását keresem. Blokkvázlat is elegendő.
A hozzászólás módosítva: Nov 26, 2023
(#) shany válasza Karesz 50 hozzászólására (») Nov 26, 2023
Az alábbiakat próbáltam, egy visszacsatoló hálózat tagjaiként ( tehát az osztó mindkét tagja ):
MELF preciziós ellenállások ( 1206 méretű ):
Vishay Beyschlag MMA0204 ± 0.1% ± 15ppm/°C
Vishay Draloric SMM0204 ± 0.1% ± 25ppm/K
Welwyn WRM0204 TCR ± 15ppm/°C

preciziós SMD ellenállás ( 1206 méretű ):
Panasonic ERA8A ± 0.1% ± 10ppm/°K

Ezek között is jelentős hangzásbeli különbséget tapasztaltam.

Valamint ugyanitt furatszereltet bepróbáltam:
Audio note Tantalum 1W
Yageo MF0207 0,6W

Más pozíciókban pl.:
Allen Bradley carbon composite, Takman carbon composite, Takman fémréteg, Vishay VAR, Vishay Beyschlag, R534, stb

Sokféle hifista-diyerek számára gyártott mitikus alkatrész létezik, mindenféle csodás hangi tulajdonsággal....többnyire valamilyen sajátos, ilyen-olyan hangkarakterrel

Ha a - talán konszenzusosan - "legjobb" furatszerelt ellenállást keressük, akkor az egyik - műszaki szempontból is extrém jó - a Vishay VAR lehet:
https://foilresistors.com/docs/63140/var.pdf
A hozzászólás módosítva: Nov 26, 2023
(#) hadhazik válasza asch hozzászólására (») Nov 22, 2023
  1. uint32_t start1Millis = 5000; //Soros portra kiírja az akku adatait.
  2. uint32_t start2Millis = 4000; //Soros portra és displayre kiírja LoRa packetet.
  3. uint32_t start3Millis = 3000; //Soros portra kiírja displayinfot.
  4. uint32_t start4Millis = 2000; //Displayre kiírja GPS kordinátákat.
  5. uint32_t start5Millis = 1000; //Displayre kiírja GPS idő és magasság adatokat.

Hogyan írjam 2>5>4>2 sorrendhez?
Displayen most 4 secenként változik, 2>5>4>5>4>5>4>2 sorrendben.

Baudrate: 115200

  1. ```cpp
  2. #include <LoRa.h>
  3. #include <TinyGPS++.h>
  4. #include "boards.h"
  5. TinyGPSPlus gps;
  6. #if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
  7. #error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
  8. #endif
  9. uint32_t start1Millis = 5000; //Soros portra kiírja az akku adatait.
  10. uint32_t start2Millis = 4000; //Soros portra és displayre kiírja LoRa packetet.
  11. uint32_t start3Millis = 3000; //Soros portra kiírja displayinfot.
  12. uint32_t start4Millis = 2000; //Displayre kiírja GPS kordinátákat.
  13. uint32_t start5Millis = 1000; //Displayre kiírja GPS idő és magasság adatokat.
  14. void setup()
  15. {
  16.   initBoard();
  17.   delay(1500);
  18.    Serial.println("LoRa Receiver");
  19.  
  20.     LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
  21.     if (!LoRa.begin(LoRa_frequency)) {
  22.         Serial.println("Starting LoRa failed!");
  23.         while (1);
  24.     }
  25.     Serial.println(F("DeviceExample.ino"));
  26.     Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  27.     Serial.print(F("Testing TinyGPS++ library v. "));
  28.     Serial.println(TinyGPSPlus::libraryVersion());
  29.     Serial.println(F("by Mikal Hart"));
  30.     Serial.println();  
  31. }
  32. void loop()
  33. {
  34.  const long periodMillis=4000;
  35.  if (( (signed long)(millis()-start1Millis))>0)
  36.     {
  37.         Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
  38.         Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
  39.         Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
  40.         Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
  41.         Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
  42.         Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
  43.         // The battery percentage may be inaccurate at first use, the PMU will automatically
  44.         // learn the battery curve and will automatically calibrate the battery percentage
  45.         // after a charge and discharge cycle
  46.         if (PMU->isBatteryConnect())
  47.         {
  48.             Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
  49.         }
  50.         Serial.println();
  51.         start1Millis += periodMillis;
  52.     }
  53.     if (pmuInterrupt)
  54.     {
  55.         pmuInterrupt = false;
  56.         // Get PMU Interrupt Status register
  57.         uint32_t status = PMU->getIrqStatus();
  58.         Serial.print("STATUS => HEX:");
  59.         Serial.print(status, HEX);
  60.         Serial.print(" BIN:");
  61.         Serial.println(status, BIN);
  62.         if (PMU->isVbusInsertIrq()) {
  63.             Serial.println("isVbusInsert");
  64.         }
  65.         if (PMU->isVbusRemoveIrq()) {
  66.             Serial.println("isVbusRemove");
  67.         }
  68.         if (PMU->isBatInsertIrq()) {
  69.             Serial.println("isBatInsert");
  70.         }
  71.         if (PMU->isBatRemoveIrq()) {
  72.             Serial.println("isBatRemove");
  73.         }
  74.         if (PMU->isPekeyShortPressIrq()) {
  75.             Serial.println("isPekeyShortPress");
  76.         }
  77.         if (PMU->isPekeyLongPressIrq()) {
  78.             Serial.println("isPekeyLongPress");
  79.         }
  80.         if (PMU->isBatChagerDoneIrq()) {
  81.             Serial.println("isBatChagerDone");
  82.         }
  83.         if (PMU->isBatChagerStartIrq()) {
  84.             Serial.println("isBatChagerStart");
  85.         }
  86.         // Clear PMU Interrupt Status register
  87.         PMU->clearIrqStatus();
  88.     }
  89.   if (( (signed long)(millis()-start2Millis))>0)
  90.    {
  91.     // try to parse packet
  92.     int packetSize = LoRa.parsePacket();
  93.     if (packetSize)
  94.     {
  95.         // received a packet
  96.         Serial.print("Received packet ");
  97.         String recv = "";
  98.         // read packet
  99.         while (LoRa.available())
  100.         {
  101.             recv += (char)LoRa.read();
  102.         }
  103.         Serial.println(recv);
  104.         // print RSSI of packet
  105.         Serial.print("' with RSSI: ");
  106.         Serial.println(LoRa.packetRssi());      
  107.      #ifdef HAS_DISPLAY      
  108.         if (u8g2)
  109.         {      
  110.             u8g2->clearBuffer();
  111.             char buf[256];
  112.             u8g2->drawStr(0, 12, "Received OK!");
  113.             u8g2->setCursor(0, 25);
  114.             u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
  115.             u8g2->println(" mV");
  116.             snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
  117.             u8g2->drawStr(0, 40, buf);
  118.             snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
  119.             u8g2->drawStr(0, 56, buf);
  120.             while ( u8g2->nextPage() );
  121.             u8g2->sendBuffer();
  122.             u8g2->setFont(u8g2_font_fur11_tf);
  123.         start2Millis += periodMillis;
  124.         }
  125.     }
  126.     #endif
  127.    }
  128.      // This sketch displays information every time a new sentence is correctly encoded.
  129.     while (Serial1.available() > 0)
  130.         if (gps.encode(Serial1.read()))
  131.   if (( (signed long)(millis()-start3Millis))>0)      
  132.             {
  133.             displayInfo();
  134.          start3Millis += periodMillis;
  135.             }
  136.   if (( (signed long)(millis()-start4Millis))>0)
  137.   {                      
  138.     #ifdef HAS_DISPLAY
  139.     if (u8g2)
  140.     {
  141.         u8g2->clearBuffer();
  142.         do
  143.         {
  144.             u8g2->setCursor(0, 16);
  145.             u8g2->println( "Location.lat:");
  146.             u8g2->setCursor(0, 32);
  147.             u8g2->print(gps.location.lat(), 6);
  148.             u8g2->println(" deg");
  149.             u8g2->setCursor(0, 48);
  150.             u8g2->println( "Location.lng:");
  151.             u8g2->setCursor(0, 64);
  152.             u8g2->print(gps.location.lng(), 6);
  153.             u8g2->println(" deg");            
  154.         } while ( u8g2->nextPage() );
  155.         u8g2->sendBuffer();
  156.         u8g2->setFont(u8g2_font_fur11_tf);        
  157.     }
  158.          start4Millis += periodMillis;  
  159.          #endif      
  160.   }
  161.   if (( (signed long)(millis()-start5Millis))>0)
  162.    {
  163.     #ifdef HAS_DISPLAY
  164.     if (u8g2)
  165.     {
  166.         u8g2->clearBuffer();
  167.         do
  168.         {
  169.             u8g2->setCursor(0, 16);
  170.             u8g2->print( "Hour:     ");
  171.             u8g2->println(gps.time.hour());
  172.             u8g2->setCursor(0, 32);
  173.             u8g2->print("minute:  ");
  174.             u8g2->println(gps.time.minute());
  175.             u8g2->setCursor(0, 48);
  176.             u8g2->print( "second:  ");
  177.             u8g2->println(gps.time.second());
  178.             u8g2->setCursor(0, 64);
  179.             u8g2->print("altitude: ");
  180.             u8g2->println(gps.altitude.meters());            
  181.         }
  182.         while ( u8g2->nextPage() );
  183.         u8g2->sendBuffer();
  184.         u8g2->setFont(u8g2_font_fur11_tf);
  185.         start5Millis += periodMillis;
  186.      }
  187.        #endif
  188.    }
  189.     if (millis() > 5000 && gps.charsProcessed() < 10)
  190.     {
  191.         Serial.println(F("No GPS detected: check wiring."));
  192.         while (true);
  193.     }
  194. }
  195. void displayInfo()
  196. {
  197.     Serial.print(F("Location: "));
  198.     if (gps.location.isValid())
  199.     {
  200.         Serial.print(gps.location.lat(), 6);
  201.         Serial.print(F(","));
  202.         Serial.print(gps.location.lng(), 6);
  203.     } else
  204.     {
  205.         Serial.print(F("INVALID"));
  206.     }
  207.  
  208.     Serial.print(F("  Date/Time: "));
  209.     if (gps.date.isValid())
  210.     {
  211.         Serial.print(gps.date.month());
  212.         Serial.print(F("/"));
  213.         Serial.print(gps.date.day());
  214.         Serial.print(F("/"));
  215.         Serial.print(gps.date.year());
  216.     } else
  217.     {
  218.         Serial.print(F("INVALID"));
  219.     }
  220.  
  221.     Serial.print(F(" "));
  222.     if (gps.time.isValid())
  223.     {
  224.         if (gps.time.hour() < 10) Serial.print(F("0"));
  225.         Serial.print(gps.time.hour());
  226.         Serial.print(F(":"));
  227.         if (gps.time.minute() < 10) Serial.print(F("0"));
  228.         Serial.print(gps.time.minute());
  229.         Serial.print(F(":"));
  230.         if (gps.time.second() < 10) Serial.print(F("0"));
  231.         Serial.print(gps.time.second());
  232.         Serial.print(F("."));
  233.         if (gps.time.centisecond() < 10) Serial.print(F("0"));
  234.         Serial.print(gps.time.centisecond());
  235.     } else
  236.     {
  237.         Serial.print(F("INVALID"));
  238.     }
  239.  
  240.     Serial.println();
  241. }
  242. ```
A hozzászólás módosítva: Nov 22, 2023
(#) hadhazik válasza hadhazik hozzászólására (») Nov 22, 2023
  1. ```cpp
  2. #include <LoRa.h>
  3. #include <TinyGPS++.h>
  4. #include "boards.h"
  5. TinyGPSPlus gps;
  6. #if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
  7. #error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
  8. #endif
  9. uint32_t start1Millis; //Soros portra kiírja az akku adatait.
  10. uint32_t start2Millis; //Soros portra és displayre kiírja LoRa packetet
  11. uint32_t start3Millis; //Soros portra kiírja displayinfot, displayre kiírja GPS kordinátákat.
  12. uint32_t start4Millis; //Displayre kiírja GPS idő és magasság adatokat.
  13. void setup()
  14. {
  15.   initBoard();
  16.   delay(1500);
  17.    Serial.println("LoRa Receiver");
  18.  
  19.     LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
  20.     if (!LoRa.begin(LoRa_frequency)) {
  21.         Serial.println("Starting LoRa failed!");
  22.         while (1);
  23.     }
  24.     Serial.println(F("DeviceExample.ino"));
  25.     Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  26.     Serial.print(F("Testing TinyGPS++ library v. "));
  27.     Serial.println(TinyGPSPlus::libraryVersion());
  28.     Serial.println(F("by Mikal Hart"));
  29.     Serial.println();  
  30. }
  31. void loop()
  32. {
  33.  const long periodMillis=4000;
  34.  if (( (signed long)(millis()-start1Millis))>0)
  35.     {
  36.         Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
  37.         Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
  38.         Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
  39.         Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
  40.         Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
  41.         Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
  42.         // The battery percentage may be inaccurate at first use, the PMU will automatically
  43.         // learn the battery curve and will automatically calibrate the battery percentage
  44.         // after a charge and discharge cycle
  45.         if (PMU->isBatteryConnect())
  46.         {
  47.             Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
  48.         }
  49.         Serial.println();
  50.         start1Millis += periodMillis;
  51.     }
  52.     if (pmuInterrupt)
  53.     {
  54.         pmuInterrupt = false;
  55.         // Get PMU Interrupt Status register
  56.         uint32_t status = PMU->getIrqStatus();
  57.         Serial.print("STATUS => HEX:");
  58.         Serial.print(status, HEX);
  59.         Serial.print(" BIN:");
  60.         Serial.println(status, BIN);
  61.         if (PMU->isVbusInsertIrq()) {
  62.             Serial.println("isVbusInsert");
  63.         }
  64.         if (PMU->isVbusRemoveIrq()) {
  65.             Serial.println("isVbusRemove");
  66.         }
  67.         if (PMU->isBatInsertIrq()) {
  68.             Serial.println("isBatInsert");
  69.         }
  70.         if (PMU->isBatRemoveIrq()) {
  71.             Serial.println("isBatRemove");
  72.         }
  73.         if (PMU->isPekeyShortPressIrq()) {
  74.             Serial.println("isPekeyShortPress");
  75.         }
  76.         if (PMU->isPekeyLongPressIrq()) {
  77.             Serial.println("isPekeyLongPress");
  78.         }
  79.         if (PMU->isBatChagerDoneIrq()) {
  80.             Serial.println("isBatChagerDone");
  81.         }
  82.         if (PMU->isBatChagerStartIrq()) {
  83.             Serial.println("isBatChagerStart");
  84.         }
  85.         // Clear PMU Interrupt Status register
  86.         PMU->clearIrqStatus();
  87.     }
  88.   if (( (signed long)(millis()-start2Millis))>0)
  89.    {
  90.     // try to parse packet
  91.     int packetSize = LoRa.parsePacket();
  92.     if (packetSize)
  93.     {
  94.         // received a packet
  95.         Serial.print("Received packet ");
  96.         String recv = "";
  97.         // read packet
  98.         while (LoRa.available())
  99.         {
  100.             recv += (char)LoRa.read();
  101.         }
  102.         Serial.println(recv);
  103.         // print RSSI of packet
  104.         Serial.print("' with RSSI: ");
  105.         Serial.println(LoRa.packetRssi());      
  106.      #ifdef HAS_DISPLAY      
  107.         if (u8g2)
  108.         {      
  109.             u8g2->clearBuffer();
  110.             char buf[256];
  111.             u8g2->drawStr(0, 12, "Received OK!");
  112.             u8g2->setCursor(0, 25);
  113.             u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
  114.             u8g2->println(" mV");
  115.             snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
  116.             u8g2->drawStr(0, 40, buf);
  117.             snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
  118.             u8g2->drawStr(0, 56, buf);
  119.             while ( u8g2->nextPage() );
  120.             u8g2->sendBuffer();
  121.             u8g2->setFont(u8g2_font_fur11_tf);
  122.         start2Millis += periodMillis;
  123.         }
  124.     }
  125.     #endif
  126.    }
  127.      // This sketch displays information every time a new sentence is correctly encoded.
  128.     while (Serial1.available() > 0)
  129.         if (gps.encode(Serial1.read()))
  130.   if (( (signed long)(millis()-start3Millis))>0)      
  131.             {
  132.             displayInfo();
  133.                 #ifdef HAS_DISPLAY
  134.     if (u8g2)
  135.     {
  136.         u8g2->clearBuffer();
  137.         do
  138.         {
  139.             u8g2->setCursor(0, 16);
  140.             u8g2->println( "Location.lat:");
  141.             u8g2->setCursor(0, 32);
  142.             u8g2->print(gps.location.lat(), 6);
  143.             u8g2->println(" deg");
  144.             u8g2->setCursor(0, 48);
  145.             u8g2->println( "Location.lng:");
  146.             u8g2->setCursor(0, 64);
  147.             u8g2->print(gps.location.lng(), 6);
  148.             u8g2->println(" deg");            
  149.         } while ( u8g2->nextPage() );
  150.         u8g2->sendBuffer();
  151.         u8g2->setFont(u8g2_font_fur11_tf);        
  152.     }
  153.          #endif
  154.         start3Millis += periodMillis +4000;        
  155.             }
  156.   if (( (signed long)(millis()-start4Millis))>0)
  157.    {
  158.     #ifdef HAS_DISPLAY
  159.     if (u8g2)
  160.     {
  161.         u8g2->clearBuffer();
  162.         do
  163.         {
  164.             u8g2->setCursor(0, 16);
  165.             u8g2->print( "Hour:     ");
  166.             u8g2->println(gps.time.hour());
  167.             u8g2->setCursor(0, 32);
  168.             u8g2->print("minute:  ");
  169.             u8g2->println(gps.time.minute());
  170.             u8g2->setCursor(0, 48);
  171.             u8g2->print( "second:  ");
  172.             u8g2->println(gps.time.second());
  173.             u8g2->setCursor(0, 64);
  174.             u8g2->print("altitude: ");
  175.             u8g2->println(gps.altitude.meters());            
  176.         }
  177.         while ( u8g2->nextPage() );
  178.         u8g2->sendBuffer();
  179.         u8g2->setFont(u8g2_font_fur11_tf);
  180.         start4Millis += periodMillis;
  181.      }
  182.        #endif
  183.    }
  184.     if (millis() > 5000 && gps.charsProcessed() < 10)
  185.     {
  186.         Serial.println(F("No GPS detected: check wiring."));
  187.         while (true);
  188.     }
  189. }
  190. void displayInfo()
  191. {
  192.     Serial.print(F("Location: "));
  193.     if (gps.location.isValid())
  194.     {
  195.         Serial.print(gps.location.lat(), 6);
  196.         Serial.print(F(","));
  197.         Serial.print(gps.location.lng(), 6);
  198.     } else
  199.     {
  200.         Serial.print(F("INVALID"));
  201.     }
  202.  
  203.     Serial.print(F("  Date/Time: "));
  204.     if (gps.date.isValid())
  205.     {
  206.         Serial.print(gps.date.month());
  207.         Serial.print(F("/"));
  208.         Serial.print(gps.date.day());
  209.         Serial.print(F("/"));
  210.         Serial.print(gps.date.year());
  211.     } else
  212.     {
  213.         Serial.print(F("INVALID"));
  214.     }
  215.  
  216.     Serial.print(F(" "));
  217.     if (gps.time.isValid())
  218.     {
  219.         if (gps.time.hour() < 10) Serial.print(F("0"));
  220.         Serial.print(gps.time.hour());
  221.         Serial.print(F(":"));
  222.         if (gps.time.minute() < 10) Serial.print(F("0"));
  223.         Serial.print(gps.time.minute());
  224.         Serial.print(F(":"));
  225.         if (gps.time.second() < 10) Serial.print(F("0"));
  226.         Serial.print(gps.time.second());
  227.         Serial.print(F("."));
  228.         if (gps.time.centisecond() < 10) Serial.print(F("0"));
  229.         Serial.print(gps.time.centisecond());
  230.     } else
  231.     {
  232.         Serial.print(F("INVALID"));
  233.     }
  234.  
  235.     Serial.println();
  236. }
  237. ```


A displayen 8 sec-ént kiírja a GPS időt, a GPS kordináták és a LoRa packet közben együtt, vagy egyedül.
(#) hadhazik válasza asch hozzászólására (») Nov 22, 2023
  1. ```cpp
  2. #include <LoRa.h>
  3. #include <TinyGPS++.h>
  4. #include "boards.h"
  5. TinyGPSPlus gps;
  6. #if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
  7. #error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
  8. #endif
  9. uint32_t start1Millis; //Soros portra kiírja az akku adatait.
  10. uint32_t start2Millis; //Soros portra és displayre kiírja LoRa packetet
  11. uint32_t start3Millis; //Soros portra kiírja displayinfot.
  12. uint32_t start4Millis; //Displayre kiírja GPS kordinátákat.
  13. uint32_t start5Millis; //Displayre kiírja GPS idő és magasság adatokat.
  14. void setup()
  15. {
  16.   initBoard();
  17.   delay(1500);
  18.    Serial.println("LoRa Receiver");
  19.  
  20.     LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
  21.     if (!LoRa.begin(LoRa_frequency)) {
  22.         Serial.println("Starting LoRa failed!");
  23.         while (1);
  24.     }
  25.     Serial.println(F("DeviceExample.ino"));
  26.     Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  27.     Serial.print(F("Testing TinyGPS++ library v. "));
  28.     Serial.println(TinyGPSPlus::libraryVersion());
  29.     Serial.println(F("by Mikal Hart"));
  30.     Serial.println();  
  31. }
  32. void loop()
  33. {
  34.  const long periodMillis=4000;
  35.  if (( (signed long)(millis()-start1Millis))>0)
  36.     {
  37.         Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
  38.         Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
  39.         Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
  40.         Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
  41.         Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
  42.         Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
  43.         // The battery percentage may be inaccurate at first use, the PMU will automatically
  44.         // learn the battery curve and will automatically calibrate the battery percentage
  45.         // after a charge and discharge cycle
  46.         if (PMU->isBatteryConnect())
  47.         {
  48.             Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
  49.         }
  50.         Serial.println();
  51.         start1Millis += periodMillis;
  52.     }
  53.     if (pmuInterrupt)
  54.     {
  55.         pmuInterrupt = false;
  56.         // Get PMU Interrupt Status register
  57.         uint32_t status = PMU->getIrqStatus();
  58.         Serial.print("STATUS => HEX:");
  59.         Serial.print(status, HEX);
  60.         Serial.print(" BIN:");
  61.         Serial.println(status, BIN);
  62.         if (PMU->isVbusInsertIrq()) {
  63.             Serial.println("isVbusInsert");
  64.         }
  65.         if (PMU->isVbusRemoveIrq()) {
  66.             Serial.println("isVbusRemove");
  67.         }
  68.         if (PMU->isBatInsertIrq()) {
  69.             Serial.println("isBatInsert");
  70.         }
  71.         if (PMU->isBatRemoveIrq()) {
  72.             Serial.println("isBatRemove");
  73.         }
  74.         if (PMU->isPekeyShortPressIrq()) {
  75.             Serial.println("isPekeyShortPress");
  76.         }
  77.         if (PMU->isPekeyLongPressIrq()) {
  78.             Serial.println("isPekeyLongPress");
  79.         }
  80.         if (PMU->isBatChagerDoneIrq()) {
  81.             Serial.println("isBatChagerDone");
  82.         }
  83.         if (PMU->isBatChagerStartIrq()) {
  84.             Serial.println("isBatChagerStart");
  85.         }
  86.         // Clear PMU Interrupt Status register
  87.         PMU->clearIrqStatus();
  88.     }
  89.   if (( (signed long)(millis()-start2Millis))>0)
  90.    {
  91.     // try to parse packet
  92.     int packetSize = LoRa.parsePacket();
  93.     if (packetSize)
  94.     {
  95.         // received a packet
  96.         Serial.print("Received packet ");
  97.         String recv = "";
  98.         // read packet
  99.         while (LoRa.available())
  100.         {
  101.             recv += (char)LoRa.read();
  102.         }
  103.         Serial.println(recv);
  104.         // print RSSI of packet
  105.         Serial.print("' with RSSI: ");
  106.         Serial.println(LoRa.packetRssi());      
  107.      #ifdef HAS_DISPLAY      
  108.         if (u8g2)
  109.         {      
  110.             u8g2->clearBuffer();
  111.             char buf[256];
  112.             u8g2->drawStr(0, 12, "Received OK!");
  113.             u8g2->setCursor(0, 25);
  114.             u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
  115.             u8g2->println(" mV");
  116.             snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
  117.             u8g2->drawStr(0, 40, buf);
  118.             snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
  119.             u8g2->drawStr(0, 56, buf);
  120.             while ( u8g2->nextPage() );
  121.             u8g2->sendBuffer();
  122.             u8g2->setFont(u8g2_font_fur11_tf);
  123.         start2Millis += periodMillis;
  124.         }
  125.     }
  126.     #endif
  127.    }
  128.      // This sketch displays information every time a new sentence is correctly encoded.
  129.     while (Serial1.available() > 0)
  130.         if (gps.encode(Serial1.read()))
  131.   if (( (signed long)(millis()-start3Millis))>0)      
  132.             {
  133.             displayInfo();
  134.         start3Millis += periodMillis;
  135.             }
  136.   if (( (signed long)(millis()-start4Millis))>0)
  137.    {
  138.     #ifdef HAS_DISPLAY
  139.     if (u8g2)
  140.     {
  141.         u8g2->clearBuffer();
  142.         do
  143.         {
  144.             u8g2->setCursor(0, 16);
  145.             u8g2->println( "Location.lat:");
  146.             u8g2->setCursor(0, 32);
  147.             u8g2->print(gps.location.lat(), 6);
  148.             u8g2->println(" deg");
  149.             u8g2->setCursor(0, 48);
  150.             u8g2->println( "Location.lng:");
  151.             u8g2->setCursor(0, 64);
  152.             u8g2->print(gps.location.lng(), 6);
  153.             u8g2->println(" deg");            
  154.         } while ( u8g2->nextPage() );
  155.         u8g2->sendBuffer();
  156.         u8g2->setFont(u8g2_font_fur11_tf);
  157.         start4Millis += periodMillis;
  158.     }
  159.          #endif
  160.    }
  161.   if (( (signed long)(millis()-start5Millis))>0)
  162.    {
  163.     #ifdef HAS_DISPLAY
  164.     if (u8g2)
  165.     {
  166.         u8g2->clearBuffer();
  167.         do
  168.         {
  169.             u8g2->setCursor(0, 16);
  170.             u8g2->print( "Hour:     ");
  171.             u8g2->println(gps.time.hour());
  172.             u8g2->setCursor(0, 32);
  173.             u8g2->print("minute:  ");
  174.             u8g2->println(gps.time.minute());
  175.             u8g2->setCursor(0, 48);
  176.             u8g2->print( "second:  ");
  177.             u8g2->println(gps.time.second());
  178.             u8g2->setCursor(0, 64);
  179.             u8g2->print("altitude: ");
  180.             u8g2->println(gps.altitude.meters());            
  181.         }
  182.         while ( u8g2->nextPage() );
  183.         u8g2->sendBuffer();
  184.         u8g2->setFont(u8g2_font_fur11_tf);
  185.         start5Millis += periodMillis;
  186.      }
  187.        #endif
  188.    }
  189.     if (millis() > 5000 && gps.charsProcessed() < 10)
  190.     {
  191.         Serial.println(F("No GPS detected: check wiring."));
  192.         while (true);
  193.     }
  194. }
  195. void displayInfo()
  196. {
  197.     Serial.print(F("Location: "));
  198.     if (gps.location.isValid())
  199.     {
  200.         Serial.print(gps.location.lat(), 6);
  201.         Serial.print(F(","));
  202.         Serial.print(gps.location.lng(), 6);
  203.     } else
  204.     {
  205.         Serial.print(F("INVALID"));
  206.     }
  207.  
  208.     Serial.print(F("  Date/Time: "));
  209.     if (gps.date.isValid())
  210.     {
  211.         Serial.print(gps.date.month());
  212.         Serial.print(F("/"));
  213.         Serial.print(gps.date.day());
  214.         Serial.print(F("/"));
  215.         Serial.print(gps.date.year());
  216.     } else
  217.     {
  218.         Serial.print(F("INVALID"));
  219.     }
  220.  
  221.     Serial.print(F(" "));
  222.     if (gps.time.isValid())
  223.     {
  224.         if (gps.time.hour() < 10) Serial.print(F("0"));
  225.         Serial.print(gps.time.hour());
  226.         Serial.print(F(":"));
  227.         if (gps.time.minute() < 10) Serial.print(F("0"));
  228.         Serial.print(gps.time.minute());
  229.         Serial.print(F(":"));
  230.         if (gps.time.second() < 10) Serial.print(F("0"));
  231.         Serial.print(gps.time.second());
  232.         Serial.print(F("."));
  233.         if (gps.time.centisecond() < 10) Serial.print(F("0"));
  234.         Serial.print(gps.time.centisecond());
  235.     } else
  236.     {
  237.         Serial.print(F("INVALID"));
  238.     }
  239.  
  240.     Serial.println();
  241. }
  242. ```


Displayen 2-es fut, 5-ös után 4-es bevillan, (5,4 3x), soros porton 1-es és 3-as fut, majd 2-es.
(#) hadhazik válasza hadhazik hozzászólására (») Nov 20, 2023
Alakul, viszont egyre hosszabb intervallumokban frissül, lehet state lesz a jobb megoldás, vagy a millis is újraindítható?
  1. ```cpp
  2. #include <LoRa.h>
  3. #include <TinyGPS++.h>
  4. #include "boards.h"
  5. TinyGPSPlus gps;
  6. #if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
  7. #error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
  8. #endif
  9. uint32_t start1Millis;
  10. uint32_t start2Millis;
  11. uint32_t start3Millis;
  12. uint32_t start4Millis;
  13. uint32_t start5Millis;
  14. void setup()
  15. {
  16.   initBoard();
  17.   delay(1500);
  18.    Serial.println("LoRa Receiver");
  19.  
  20.     LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
  21.     if (!LoRa.begin(LoRa_frequency)) {
  22.         Serial.println("Starting LoRa failed!");
  23.         while (1);
  24.     }
  25.     Serial.println(F("DeviceExample.ino"));
  26.     Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  27.     Serial.print(F("Testing TinyGPS++ library v. "));
  28.     Serial.println(TinyGPSPlus::libraryVersion());
  29.     Serial.println(F("by Mikal Hart"));
  30.     Serial.println();  
  31. }
  32. void loop()
  33. {
  34.     if (millis() > start1Millis)
  35.     {
  36.         Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
  37.         Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
  38.         Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
  39.         Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
  40.         Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
  41.         Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
  42.         // The battery percentage may be inaccurate at first use, the PMU will automatically
  43.         // learn the battery curve and will automatically calibrate the battery percentage
  44.         // after a charge and discharge cycle
  45.         if (PMU->isBatteryConnect())
  46.         {
  47.             Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
  48.         }
  49.         Serial.println();
  50.         start1Millis += millis() + 10;
  51.     }
  52.     if (pmuInterrupt)
  53.     {
  54.         pmuInterrupt = false;
  55.         // Get PMU Interrupt Status register
  56.         uint32_t status = PMU->getIrqStatus();
  57.         Serial.print("STATUS => HEX:");
  58.         Serial.print(status, HEX);
  59.         Serial.print(" BIN:");
  60.         Serial.println(status, BIN);
  61.         if (PMU->isVbusInsertIrq()) {
  62.             Serial.println("isVbusInsert");
  63.         }
  64.         if (PMU->isVbusRemoveIrq()) {
  65.             Serial.println("isVbusRemove");
  66.         }
  67.         if (PMU->isBatInsertIrq()) {
  68.             Serial.println("isBatInsert");
  69.         }
  70.         if (PMU->isBatRemoveIrq()) {
  71.             Serial.println("isBatRemove");
  72.         }
  73.         if (PMU->isPekeyShortPressIrq()) {
  74.             Serial.println("isPekeyShortPress");
  75.         }
  76.         if (PMU->isPekeyLongPressIrq()) {
  77.             Serial.println("isPekeyLongPress");
  78.         }
  79.         if (PMU->isBatChagerDoneIrq()) {
  80.             Serial.println("isBatChagerDone");
  81.         }
  82.         if (PMU->isBatChagerStartIrq()) {
  83.             Serial.println("isBatChagerStart");
  84.         }
  85.         // Clear PMU Interrupt Status register
  86.         PMU->clearIrqStatus();
  87.     }
  88. if(millis()> start2Millis)
  89. {
  90.     // try to parse packet
  91.     int packetSize = LoRa.parsePacket();
  92.     if (packetSize)
  93.     {
  94.         // received a packet
  95.         Serial.print("Received packet ");
  96.         String recv = "";
  97.         // read packet
  98.         while (LoRa.available())
  99.         {
  100.             recv += (char)LoRa.read();
  101.         }
  102.         Serial.println(recv);
  103.         // print RSSI of packet
  104.         Serial.print("' with RSSI: ");
  105.         Serial.println(LoRa.packetRssi());      
  106. #ifdef HAS_DISPLAY      
  107.         if (u8g2)
  108.         {      
  109.             u8g2->clearBuffer();
  110.             char buf[256];
  111.             u8g2->drawStr(0, 12, "Received OK!");
  112.             u8g2->setCursor(0, 25);
  113.             u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
  114.             u8g2->println(" mV");
  115.             snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
  116.             u8g2->drawStr(0, 40, buf);
  117.             snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
  118.             u8g2->drawStr(0, 56, buf);
  119.             while ( u8g2->nextPage() );
  120.             u8g2->sendBuffer();
  121.             u8g2->setFont(u8g2_font_fur11_tf);
  122.             start2Millis += millis() + 20;
  123.         }
  124.     }
  125. #endif
  126. }
  127.      // This sketch displays information every time a new sentence is correctly encoded.
  128.     while (Serial1.available() > 0)
  129.         if (gps.encode(Serial1.read()))
  130.  if(millis()> start3Millis)      
  131.             {
  132.             displayInfo();
  133.             start3Millis += millis() + 30;
  134.             }
  135. if(millis()> start4Millis)
  136. {
  137. #ifdef HAS_DISPLAY
  138.     if (u8g2)
  139.     {
  140.         u8g2->clearBuffer();
  141.         do
  142.         {
  143.             u8g2->setCursor(0, 16);
  144.             u8g2->println( "Location.lat:");
  145.             u8g2->setCursor(0, 32);
  146.             u8g2->print(gps.location.lat(), 6);
  147.             u8g2->println(" deg");
  148.             u8g2->setCursor(0, 48);
  149.             u8g2->println( "Location.lng:");
  150.             u8g2->setCursor(0, 64);
  151.             u8g2->print(gps.location.lng(), 6);
  152.             u8g2->println(" deg");            
  153.         } while ( u8g2->nextPage() );
  154.         u8g2->sendBuffer();
  155.         u8g2->setFont(u8g2_font_fur11_tf);
  156.             start4Millis += millis() + 40;
  157.     }
  158. #endif
  159. }
  160. if(millis()> start5Millis)
  161. {
  162.   #ifdef HAS_DISPLAY
  163.     if (u8g2)
  164.     {
  165.         u8g2->clearBuffer();
  166.         do
  167.         {
  168.             u8g2->setCursor(0, 16);
  169.             u8g2->print( "Hour:     ");
  170.             u8g2->println(gps.time.hour());
  171.             u8g2->setCursor(0, 32);
  172.             u8g2->print("minute:  ");
  173.             u8g2->println(gps.time.minute());
  174.             u8g2->setCursor(0, 48);
  175.             u8g2->print( "second:  ");
  176.             u8g2->println(gps.time.second());
  177.             u8g2->setCursor(0, 64);
  178.             u8g2->print("altitude: ");
  179.             u8g2->println(gps.altitude.meters());            
  180.         }
  181.         while ( u8g2->nextPage() );
  182.         u8g2->sendBuffer();
  183.         u8g2->setFont(u8g2_font_fur11_tf);
  184.             start5Millis += millis() + 50;
  185.     }
  186. #endif
  187. }
  188.     if (millis() > 5000 && gps.charsProcessed() < 10)
  189.     {
  190.         Serial.println(F("No GPS detected: check wiring."));
  191.         while (true);
  192.     }
  193. }
  194. void displayInfo()
  195. {
  196.     Serial.print(F("Location: "));
  197.     if (gps.location.isValid())
  198.     {
  199.         Serial.print(gps.location.lat(), 6);
  200.         Serial.print(F(","));
  201.         Serial.print(gps.location.lng(), 6);
  202.     } else
  203.     {
  204.         Serial.print(F("INVALID"));
  205.     }
  206.  
  207.     Serial.print(F("  Date/Time: "));
  208.     if (gps.date.isValid())
  209.     {
  210.         Serial.print(gps.date.month());
  211.         Serial.print(F("/"));
  212.         Serial.print(gps.date.day());
  213.         Serial.print(F("/"));
  214.         Serial.print(gps.date.year());
  215.     } else
  216.     {
  217.         Serial.print(F("INVALID"));
  218.     }
  219.  
  220.     Serial.print(F(" "));
  221.     if (gps.time.isValid())
  222.     {
  223.         if (gps.time.hour() < 10) Serial.print(F("0"));
  224.         Serial.print(gps.time.hour());
  225.         Serial.print(F(":"));
  226.         if (gps.time.minute() < 10) Serial.print(F("0"));
  227.         Serial.print(gps.time.minute());
  228.         Serial.print(F(":"));
  229.         if (gps.time.second() < 10) Serial.print(F("0"));
  230.         Serial.print(gps.time.second());
  231.         Serial.print(F("."));
  232.         if (gps.time.centisecond() < 10) Serial.print(F("0"));
  233.         Serial.print(gps.time.centisecond());
  234.     } else
  235.     {
  236.         Serial.print(F("INVALID"));
  237.     }
  238.  
  239.     Serial.println();
  240. }
  241. ```
A hozzászólás módosítva: Nov 20, 2023
(#) hadhazik válasza hadhazik hozzászólására (») Nov 20, 2023
Lilygo
Megérkezett és megfelelő kódok is elérhetők hozzá.
Külön-külön a Lora, és GPS, akkumulátor kód működik, együtt nem, kezdődhet az összefésülés.
Először egyedi delay(); időzítésekkel néztem, a GPS folyamatosan működik, ha displayre kiíratom a LoRa csomagot nem írja ki, esetleg minimális időzítéssel néha. Gondolom a csomagok elkapásával van gond, hogyan is tároljam őket a folyamatos vétel fenntartásához?
A kód helyfoglalása bámulatosan kevés területet emészt fel, ez talán betudható a külön tárolt boards és utilities fájloknak.
A cél a displayre kiírás GPS és LoRa adatokkal + telep feszültség:

  1. #include <LoRa.h>
  2. #include <TinyGPS++.h>
  3. #include "boards.h"
  4. TinyGPSPlus gps;
  5. #if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
  6. #error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
  7. #endif
  8. uint32_t startMillis;
  9. void setup()
  10. {
  11.   initBoard();
  12.   delay(1500);
  13.    Serial.println("LoRa Receiver");
  14.  
  15.     LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
  16.     if (!LoRa.begin(LoRa_frequency)) {
  17.         Serial.println("Starting LoRa failed!");
  18.         while (1);
  19.     }
  20.     Serial.println(F("DeviceExample.ino"));
  21.     Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
  22.     Serial.print(F("Testing TinyGPS++ library v. "));
  23.     Serial.println(TinyGPSPlus::libraryVersion());
  24.     Serial.println(F("by Mikal Hart"));
  25.     Serial.println();  
  26. }
  27. void loop()
  28. {
  29.     if (millis() > startMillis)
  30.     {
  31.         Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
  32.         Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
  33.         Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
  34.         Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
  35.         Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
  36.         Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
  37.         // The battery percentage may be inaccurate at first use, the PMU will automatically
  38.         // learn the battery curve and will automatically calibrate the battery percentage
  39.         // after a charge and discharge cycle
  40.         if (PMU->isBatteryConnect())
  41.         {
  42.             Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
  43.         }
  44.         Serial.println();
  45.         startMillis += millis() + 1000;
  46.     }
  47.     if (pmuInterrupt)
  48.     {
  49.         pmuInterrupt = false;
  50.         // Get PMU Interrupt Status register
  51.         uint32_t status = PMU->getIrqStatus();
  52.         Serial.print("STATUS => HEX:");
  53.         Serial.print(status, HEX);
  54.         Serial.print(" BIN:");
  55.         Serial.println(status, BIN);
  56.         if (PMU->isVbusInsertIrq()) {
  57.             Serial.println("isVbusInsert");
  58.         }
  59.         if (PMU->isVbusRemoveIrq()) {
  60.             Serial.println("isVbusRemove");
  61.         }
  62.         if (PMU->isBatInsertIrq()) {
  63.             Serial.println("isBatInsert");
  64.         }
  65.         if (PMU->isBatRemoveIrq()) {
  66.             Serial.println("isBatRemove");
  67.         }
  68.         if (PMU->isPekeyShortPressIrq()) {
  69.             Serial.println("isPekeyShortPress");
  70.         }
  71.         if (PMU->isPekeyLongPressIrq()) {
  72.             Serial.println("isPekeyLongPress");
  73.         }
  74.         if (PMU->isBatChagerDoneIrq()) {
  75.             Serial.println("isBatChagerDone");
  76.         }
  77.         if (PMU->isBatChagerStartIrq()) {
  78.             Serial.println("isBatChagerStart");
  79.         }
  80.         // Clear PMU Interrupt Status register
  81.         PMU->clearIrqStatus();
  82.     }
  83.     //delay(3000);
  84.     // try to parse packet
  85.     int packetSize = LoRa.parsePacket();
  86.     if (packetSize)
  87.     {
  88.         // received a packet
  89.         //Serial.print("Received packet ");
  90.         String recv = "";
  91.         // read packet
  92.         while (LoRa.available())
  93.         {
  94.             recv += (char)LoRa.read();
  95.         }
  96.         //Serial.println(recv);
  97.         // print RSSI of packet
  98.         //Serial.print("' with RSSI: ");
  99.         //Serial.println(LoRa.packetRssi());
  100.         delay(10);
  101. #ifdef HAS_DISPLAY      
  102.         if (u8g2)
  103.         {      
  104.             u8g2->clearBuffer();
  105.             char buf[256];
  106.             u8g2->drawStr(0, 12, "Received OK!");
  107.             u8g2->setCursor(0, 25);
  108.             u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
  109.             u8g2->println(" mV");
  110.             snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
  111.             u8g2->drawStr(0, 40, buf);
  112.             snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
  113.             u8g2->drawStr(0, 56, buf);
  114.             while ( u8g2->nextPage() );
  115.             u8g2->sendBuffer();
  116.             u8g2->setFont(u8g2_font_fur11_tf);
  117.         }
  118.     }
  119. #endif
  120.      // This sketch displays information every time a new sentence is correctly encoded.
  121.     while (Serial1.available() > 0)
  122.         if (gps.encode(Serial1.read()))
  123.             displayInfo();
  124.             delay(1000);
  125. /*#ifdef HAS_DISPLAY
  126.     if (u8g2)
  127.     {
  128.         u8g2->clearBuffer();
  129.         do
  130.         {
  131.             u8g2->setCursor(0, 16);
  132.             u8g2->println( "Location.lat:");
  133.             u8g2->setCursor(0, 32);
  134.             u8g2->print(gps.location.lat(), 6);
  135.             u8g2->println(" deg");
  136.             u8g2->setCursor(0, 48);
  137.             u8g2->println( "Location.lng:");
  138.             u8g2->setCursor(0, 64);
  139.             u8g2->print(gps.location.lng(), 6);
  140.             u8g2->println(" deg");            
  141.         } while ( u8g2->nextPage() );
  142.         u8g2->sendBuffer();
  143.         u8g2->setFont(u8g2_font_fur11_tf);
  144.         delay(10);
  145.     }
  146. #endif
  147. #ifdef HAS_DISPLAY
  148.     if (u8g2)
  149.     {
  150.         u8g2->clearBuffer();
  151.         do
  152.         {
  153.             u8g2->setCursor(0, 16);
  154.             u8g2->print( "Hour:     ");
  155.             u8g2->println(gps.time.hour());
  156.             u8g2->setCursor(0, 32);
  157.             u8g2->print("minute:  ");
  158.             u8g2->println(gps.time.minute());
  159.             u8g2->setCursor(0, 48);
  160.             u8g2->print( "second:  ");
  161.             u8g2->println(gps.time.second());
  162.             u8g2->setCursor(0, 64);
  163.             u8g2->print("altitude: ");
  164.             u8g2->println(gps.altitude.meters());            
  165.         }
  166.         while ( u8g2->nextPage() );
  167.         u8g2->sendBuffer();
  168.         u8g2->setFont(u8g2_font_fur11_tf);
  169.         delay(3000);
  170.     }
  171. #endif*/
  172.     if (millis() > 5000 && gps.charsProcessed() < 10)
  173.     {
  174.         Serial.println(F("No GPS detected: check wiring."));
  175.         while (true);
  176.     }
  177. }
  178. void displayInfo()
  179. {
  180.     Serial.print(F("Location: "));
  181.     if (gps.location.isValid())
  182.     {
  183.         Serial.print(gps.location.lat(), 6);
  184.         Serial.print(F(","));
  185.         Serial.print(gps.location.lng(), 6);
  186.     } else
  187.     {
  188.         Serial.print(F("INVALID"));
  189.     }
  190.  
  191.     Serial.print(F("  Date/Time: "));
  192.     if (gps.date.isValid())
  193.     {
  194.         Serial.print(gps.date.month());
  195.         Serial.print(F("/"));
  196.         Serial.print(gps.date.day());
  197.         Serial.print(F("/"));
  198.         Serial.print(gps.date.year());
  199.     } else
  200.     {
  201.         Serial.print(F("INVALID"));
  202.     }
  203.  
  204.     Serial.print(F(" "));
  205.     if (gps.time.isValid())
  206.     {
  207.         if (gps.time.hour() < 10) Serial.print(F("0"));
  208.         Serial.print(gps.time.hour());
  209.         Serial.print(F(":"));
  210.         if (gps.time.minute() < 10) Serial.print(F("0"));
  211.         Serial.print(gps.time.minute());
  212.         Serial.print(F(":"));
  213.         if (gps.time.second() < 10) Serial.print(F("0"));
  214.         Serial.print(gps.time.second());
  215.         Serial.print(F("."));
  216.         if (gps.time.centisecond() < 10) Serial.print(F("0"));
  217.         Serial.print(gps.time.centisecond());
  218.     } else
  219.     {
  220.         Serial.print(F("INVALID"));
  221.     }
  222.  
  223.     Serial.println();
  224. }


boards
  1. String rssi = "RSSI --";
  2. String packSize = "--";
  3. String packet ;
  4. String message = "";
  5. #include <Arduino.h>
  6. #include <SPI.h>
  7. #include <Wire.h>
  8. #include "utilities.h"
  9. #ifdef HAS_DISPLAY
  10. #include <U8g2lib.h>
  11. #ifndef DISPLAY_MODEL
  12. #define DISPLAY_MODEL U8G2_SSD1306_128X64_NONAME_F_HW_I2C
  13. #endif
  14. DISPLAY_MODEL *u8g2 = nullptr;
  15. #endif
  16. #ifndef OLED_WIRE_PORT
  17. #define OLED_WIRE_PORT Wire
  18. #endif
  19. #if defined(HAS_PMU)
  20. #include "XPowersLib.h"
  21. XPowersLibInterface *PMU = NULL;
  22. #ifndef PMU_WIRE_PORT
  23. #define PMU_WIRE_PORT   Wire
  24. #endif
  25. bool pmuInterrupt;
  26. void setPmuFlag()
  27. {
  28.     pmuInterrupt = true;
  29. }
  30. bool initPMU()
  31. {
  32.     if (!PMU)
  33.     {
  34.         PMU = new XPowersAXP2101(PMU_WIRE_PORT);
  35.         if (!PMU->init()) {
  36.             Serial.println("Warning: Failed to find AXP2101 power management");
  37.             delete PMU;
  38.             PMU = NULL;
  39.         } else {
  40.             Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU");
  41.         }
  42.     }
  43.  
  44.     if (!PMU) {
  45.         PMU = new XPowersAXP192(PMU_WIRE_PORT);
  46.         if (!PMU->init()) {
  47.             Serial.println("Warning: Failed to find AXP192 power management");
  48.             delete PMU;
  49.             PMU = NULL;
  50.         } else {
  51.             Serial.println("AXP192 PMU init succeeded, using AXP192 PMU");
  52.         }
  53.     }
  54.  
  55.     if (!PMU) {
  56.         return false;
  57.     }
  58.  
  59.     PMU->setChargingLedMode(XPOWERS_CHG_LED_BLINK_1HZ);
  60.  
  61.     pinMode(PMU_IRQ, INPUT_PULLUP);
  62.     attachInterrupt(PMU_IRQ, setPmuFlag, FALLING);
  63.  
  64.     if (PMU->getChipModel() == XPOWERS_AXP192) {
  65.  
  66.         PMU->setProtectedChannel(XPOWERS_DCDC3);
  67.  
  68.         // lora
  69.         PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300);
  70.         // gps
  71.         PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300);
  72.         // oled
  73.         PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300);
  74.  
  75.         PMU->enablePowerOutput(XPOWERS_LDO2);
  76.         PMU->enablePowerOutput(XPOWERS_LDO3);
  77.  
  78.         //protected oled power source
  79.         PMU->setProtectedChannel(XPOWERS_DCDC1);
  80.         //protected esp32 power source
  81.         PMU->setProtectedChannel(XPOWERS_DCDC3);
  82.         // enable oled power
  83.         PMU->enablePowerOutput(XPOWERS_DCDC1);
  84.  
  85.         //disable not use channel
  86.         PMU->disablePowerOutput(XPOWERS_DCDC2);
  87.  
  88.         PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ);
  89.  
  90.         PMU->enableIRQ(XPOWERS_AXP192_VBUS_REMOVE_IRQ |
  91.                        XPOWERS_AXP192_VBUS_INSERT_IRQ |
  92.                        XPOWERS_AXP192_BAT_CHG_DONE_IRQ |
  93.                        XPOWERS_AXP192_BAT_CHG_START_IRQ |
  94.                        XPOWERS_AXP192_BAT_REMOVE_IRQ |
  95.                        XPOWERS_AXP192_BAT_INSERT_IRQ |
  96.                        XPOWERS_AXP192_PKEY_SHORT_IRQ
  97.                       );
  98.  
  99.     } else if (PMU->getChipModel() == XPOWERS_AXP2101) {
  100.  
  101. #if defined(CONFIG_IDF_TARGET_ESP32)
  102.         //Unuse power channel
  103.         PMU->disablePowerOutput(XPOWERS_DCDC2);
  104.         PMU->disablePowerOutput(XPOWERS_DCDC3);
  105.         PMU->disablePowerOutput(XPOWERS_DCDC4);
  106.         PMU->disablePowerOutput(XPOWERS_DCDC5);
  107.         PMU->disablePowerOutput(XPOWERS_ALDO1);
  108.         PMU->disablePowerOutput(XPOWERS_ALDO4);
  109.         PMU->disablePowerOutput(XPOWERS_BLDO1);
  110.         PMU->disablePowerOutput(XPOWERS_BLDO2);
  111.         PMU->disablePowerOutput(XPOWERS_DLDO1);
  112.         PMU->disablePowerOutput(XPOWERS_DLDO2);
  113.  
  114.         // GNSS RTC PowerVDD 3300mV
  115.         PMU->setPowerChannelVoltage(XPOWERS_VBACKUP, 3300);
  116.         PMU->enablePowerOutput(XPOWERS_VBACKUP);
  117.  
  118.         //ESP32 VDD 3300mV
  119.         // ! No need to set, automatically open , Don't close it
  120.         // PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300);
  121.         // PMU->setProtectedChannel(XPOWERS_DCDC1);
  122.         PMU->setProtectedChannel(XPOWERS_DCDC1);
  123.  
  124.         // LoRa VDD 3300mV
  125.         PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300);
  126.         PMU->enablePowerOutput(XPOWERS_ALDO2);
  127.  
  128.         //GNSS VDD 3300mV
  129.         PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
  130.         PMU->enablePowerOutput(XPOWERS_ALDO3);
  131.  
  132. #endif /*CONFIG_IDF_TARGET_ESP32*/
  133.  
  134.  
  135. #if defined(LILYGO_TBeamS3_SUPREME_V3_0)
  136.  
  137.         //t-beam m.2 inface
  138.         //gps
  139.         PMU->setPowerChannelVoltage(XPOWERS_ALDO4, 3300);
  140.         PMU->enablePowerOutput(XPOWERS_ALDO4);
  141.  
  142.         // lora
  143.         PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
  144.         PMU->enablePowerOutput(XPOWERS_ALDO3);
  145.  
  146.         // In order to avoid bus occupation, during initialization, the SD card and QMC sensor are powered off and restarted
  147.         if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()) {
  148.             Serial.println("Power off and restart ALDO BLDO..");
  149.             PMU->disablePowerOutput(XPOWERS_ALDO1);
  150.             PMU->disablePowerOutput(XPOWERS_ALDO2);
  151.             PMU->disablePowerOutput(XPOWERS_BLDO1);
  152.             delay(250);
  153.         }
  154.  
  155.         // Sensor
  156.         PMU->setPowerChannelVoltage(XPOWERS_ALDO1, 3300);
  157.         PMU->enablePowerOutput(XPOWERS_ALDO1);
  158.  
  159.         PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300);
  160.         PMU->enablePowerOutput(XPOWERS_ALDO2);
  161.  
  162.         //Sdcard
  163.  
  164.         PMU->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
  165.         PMU->enablePowerOutput(XPOWERS_BLDO1);
  166.  
  167.         PMU->setPowerChannelVoltage(XPOWERS_BLDO2, 3300);
  168.         PMU->enablePowerOutput(XPOWERS_BLDO2);
  169.  
  170.         //face m.2
  171.         PMU->setPowerChannelVoltage(XPOWERS_DCDC3, 3300);
  172.         PMU->enablePowerOutput(XPOWERS_DCDC3);
  173.  
  174.         PMU->setPowerChannelVoltage(XPOWERS_DCDC4, XPOWERS_AXP2101_DCDC4_VOL2_MAX);
  175.         PMU->enablePowerOutput(XPOWERS_DCDC4);
  176.  
  177.         PMU->setPowerChannelVoltage(XPOWERS_DCDC5, 3300);
  178.         PMU->enablePowerOutput(XPOWERS_DCDC5);
  179.  
  180.  
  181.         //not use channel
  182.         PMU->disablePowerOutput(XPOWERS_DCDC2);
  183.         // PMU->disablePowerOutput(XPOWERS_DCDC4);
  184.         // PMU->disablePowerOutput(XPOWERS_DCDC5);
  185.         PMU->disablePowerOutput(XPOWERS_DLDO1);
  186.         PMU->disablePowerOutput(XPOWERS_DLDO2);
  187.         PMU->disablePowerOutput(XPOWERS_VBACKUP);
  188.  
  189.         // Set constant current charge current limit
  190.         PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA);
  191.  
  192.         // Set charge cut-off voltage
  193.         PMU->setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2);
  194.  
  195.         // Disable all interrupts
  196.         PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ);
  197.         // Clear all interrupt flags
  198.         PMU->clearIrqStatus();
  199.         // Enable the required interrupt function
  200.         PMU->enableIRQ(
  201.             XPOWERS_AXP2101_BAT_INSERT_IRQ    | XPOWERS_AXP2101_BAT_REMOVE_IRQ      |   //BATTERY
  202.             XPOWERS_AXP2101_VBUS_INSERT_IRQ   | XPOWERS_AXP2101_VBUS_REMOVE_IRQ     |   //VBUS
  203.             XPOWERS_AXP2101_PKEY_SHORT_IRQ    | XPOWERS_AXP2101_PKEY_LONG_IRQ       |   //POWER KEY
  204.             XPOWERS_AXP2101_BAT_CHG_DONE_IRQ  | XPOWERS_AXP2101_BAT_CHG_START_IRQ       //CHARGE
  205.             // XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ | XPOWERS_AXP2101_PKEY_POSITIVE_IRQ   |   //POWER KEY
  206.         );
  207. #endif
  208.     }
  209.     PMU->enableSystemVoltageMeasure();
  210.     PMU->enableVbusVoltageMeasure();
  211.     PMU->enableBattVoltageMeasure();
  212.     // It is necessary to disable the detection function of the TS pin on the board
  213.     // without the battery temperature detection function, otherwise it will cause abnormal charging
  214.     PMU->disableTSPinMeasure();
  215.     Serial.printf("=========================================\n");
  216.     if (PMU->isChannelAvailable(XPOWERS_DCDC1))
  217.     {
  218.         Serial.printf("DC1  : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_DCDC1)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_DCDC1));
  219.     }
  220.     if (PMU->isChannelAvailable(XPOWERS_DCDC2))
  221.     {
  222.         Serial.printf("DC2  : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_DCDC2)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_DCDC2));
  223.     }
  224.     if (PMU->isChannelAvailable(XPOWERS_DCDC3))
  225.     {
  226.         Serial.printf("DC3  : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_DCDC3)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_DCDC3));
  227.     }
  228.     if (PMU->isChannelAvailable(XPOWERS_DCDC4))
  229.     {
  230.         Serial.printf("DC4  : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_DCDC4)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_DCDC4));
  231.     }
  232.     if (PMU->isChannelAvailable(XPOWERS_DCDC5))
  233.     {
  234.         Serial.printf("DC5  : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_DCDC5)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_DCDC5));
  235.     }
  236.     if (PMU->isChannelAvailable(XPOWERS_LDO2)) {
  237.         Serial.printf("LDO2 : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_LDO2)   ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_LDO2));
  238.     }
  239.     if (PMU->isChannelAvailable(XPOWERS_LDO3))
  240.     {
  241.         Serial.printf("LDO3 : %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_LDO3)   ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_LDO3));
  242.     }
  243.     if (PMU->isChannelAvailable(XPOWERS_ALDO1))
  244.     {
  245.         Serial.printf("ALDO1: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_ALDO1)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_ALDO1));
  246.     }
  247.     if (PMU->isChannelAvailable(XPOWERS_ALDO2))
  248.     {
  249.         Serial.printf("ALDO2: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_ALDO2)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_ALDO2));
  250.     }
  251.     if (PMU->isChannelAvailable(XPOWERS_ALDO3)) {
  252.         Serial.printf("ALDO3: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_ALDO3)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_ALDO3));
  253.     }
  254.     if (PMU->isChannelAvailable(XPOWERS_ALDO4))
  255.     {
  256.         Serial.printf("ALDO4: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_ALDO4)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_ALDO4));
  257.     }
  258.     if (PMU->isChannelAvailable(XPOWERS_BLDO1))
  259.     {
  260.         Serial.printf("BLDO1: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_BLDO1)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_BLDO1));
  261.     }
  262.     if (PMU->isChannelAvailable(XPOWERS_BLDO2))
  263.     {
  264.         Serial.printf("BLDO2: %s   Voltage: %04u mV \n",  PMU->isPowerChannelEnable(XPOWERS_BLDO2)  ? "+" : "-",  PMU->getPowerChannelVoltage(XPOWERS_BLDO2));
  265.     }
  266.     Serial.printf("=========================================\n");
  267.     // Set the time of pressing the button to turn off
  268.     PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S);
  269.     uint8_t opt = PMU->getPowerKeyPressOffTime();
  270.     Serial.print("PowerKeyPressOffTime:");
  271.     switch (opt)
  272.     {
  273.     case XPOWERS_POWEROFF_4S: Serial.println("4 Second");
  274.         break;
  275.     case XPOWERS_POWEROFF_6S: Serial.println("6 Second");
  276.         break;
  277.     case XPOWERS_POWEROFF_8S: Serial.println("8 Second");
  278.         break;
  279.     case XPOWERS_POWEROFF_10S: Serial.println("10 Second");
  280.         break;
  281.     default:
  282.         break;
  283.     }
  284.     return true;
  285. }
  286. void disablePeripherals()
  287. {
  288. }
  289. #else
  290. #define initPMU()
  291. #define disablePeripherals()
  292. #endif
  293. SPIClass SDSPI(HSPI);
  294. void initBoard()
  295. {
  296.     Serial.begin(115200);
  297.     Serial.println("initBoard");
  298.     SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
  299.     Wire.begin(I2C_SDA, I2C_SCL);
  300. #ifdef I2C1_SDA
  301.     Wire1.begin(I2C1_SDA, I2C1_SCL);
  302. #endif
  303. #ifdef RADIO_TCXO_EN_PIN
  304.     pinMode(RADIO_TCXO_EN_PIN, OUTPUT);
  305.     digitalWrite(RADIO_TCXO_EN_PIN, HIGH);
  306. #endif
  307. #ifdef HAS_GPS
  308.     Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
  309. #endif
  310. #if OLED_RST
  311.     pinMode(OLED_RST, OUTPUT);
  312.     digitalWrite(OLED_RST, HIGH); delay(20);
  313.     digitalWrite(OLED_RST, LOW);  delay(20);
  314.     digitalWrite(OLED_RST, HIGH); delay(20);
  315. #endif
  316.     initPMU();
  317. #ifdef BOARD_LED
  318.     /*
  319.     * T-BeamV1.0, V1.1 LED defaults to low level as trun on,
  320.     * so it needs to be forced to pull up
  321.     * * * * */
  322. #if LED_ON == LOW
  323.     gpio_hold_dis(GPIO_NUM_4);
  324. #endif
  325.     pinMode(BOARD_LED, OUTPUT);
  326.     digitalWrite(BOARD_LED, LED_ON);
  327. #endif
  328. #ifdef HAS_DISPLAY
  329.     Wire.beginTransmission(0x3C);
  330.     if (Wire.endTransmission() == 0)
  331.     {
  332.         Serial.println("Started OLED");
  333.         u8g2 = new DISPLAY_MODEL(U8G2_R0, U8X8_PIN_NONE);
  334.         u8g2->begin();
  335.         u8g2->clearBuffer();
  336.         u8g2->setFlipMode(0);
  337.         u8g2->setFontMode(1); // Transparent
  338.         u8g2->setDrawColor(1);
  339.         u8g2->setFontDirection(0);
  340.         u8g2->firstPage();
  341.         do {
  342.             u8g2->setFont(u8g2_font_inb19_mr);
  343.             u8g2->drawStr(0, 30, "LilyGo");
  344.             u8g2->drawHLine(2, 35, 47);
  345.             u8g2->drawHLine(3, 36, 47);
  346.             u8g2->drawVLine(45, 32, 12);
  347.             u8g2->drawVLine(46, 33, 12);
  348.             u8g2->setFont(u8g2_font_inb19_mf);
  349.             u8g2->drawStr(58, 60, "LoRa");
  350.         } while ( u8g2->nextPage() );
  351.         u8g2->sendBuffer();
  352.         u8g2->setFont(u8g2_font_fur11_tf);
  353.         delay(3000);
  354.     }
  355. #endif
  356. #ifdef HAS_DISPLAY
  357.     if (u8g2)
  358.     {
  359.         u8g2->clearBuffer();
  360.         do
  361.         {
  362.             u8g2->setCursor(0, 16);
  363.             u8g2->println( "BattVoltage:");
  364.             u8g2->setCursor(0, 32);
  365.             u8g2->print(PMU->getBattVoltage());
  366.             u8g2->println("mV");
  367.         } while ( u8g2->nextPage() );
  368.         u8g2->sendBuffer();
  369.         u8g2->setFont(u8g2_font_fur11_tf);
  370.         delay(3000);
  371.     }
  372. #endif
  373. }


utilities
  1. #pragma once
  2. #define LILYGO_TBeam_V1_X
  3. #ifndef LoRa_frequency
  4. #define LoRa_frequency      433E6
  5. #endif
  6. #if defined(LILYGO_TBeam_V1_X)
  7. #define GPS_RX_PIN                  34
  8. #define GPS_TX_PIN                  12
  9. #define BUTTON_PIN                  38
  10. #define BUTTON_PIN_MASK             GPIO_SEL_38
  11. #define I2C_SDA                     21
  12. #define I2C_SCL                     22
  13. #define PMU_IRQ                     35
  14.  
  15. #define RADIO_SCLK_PIN               5
  16. #define RADIO_MISO_PIN              19
  17. #define RADIO_MOSI_PIN              27
  18. #define RADIO_CS_PIN                18
  19. #define RADIO_DIO0_PIN               26
  20. #define RADIO_RST_PIN               23
  21. #define RADIO_DIO1_PIN              33
  22. #define RADIO_BUSY_PIN              32
  23.  
  24. #define BOARD_LED                   4
  25. #define LED_ON                      LOW
  26. #define LED_OFF                     HIGH
  27.  
  28. #define GPS_BAUD_RATE               9600
  29. #define HAS_GPS
  30. #define HAS_DISPLAY                 //Optional, bring your own board, no OLED !!
  31. #define HAS_PMU
  32.  
  33. #else
  34. #error "For the first use, please define the board version and model in <utilities. h>"
  35. #endif
(#) sirály12 válasza Ge Lee hozzászólására (») Nov 15, 2023
Hogy hozzak gyártói ajánlást is:
https://www.nxp.com/docs/en/application-note/AN4428.pdf

"The balancing is active during the charging period,
to maintain an equal state of charge (SOC) for each cell at the end of charge. The application is used daily,
so that different discharges due to the different leakage currents of the cells are not important. The
balancing is active in the discharge period too, so this circuit maintains an equal discharge for each cell,
both strong and weak. The energy from the strong cells is transferred into the weak cells."

Tehát töltés és merítés közben is aktív a ballancer, mert ekkor garantálható, hogy a cellák nem másznak el egymástól!
(#) Bakman válasza Karoly1981 hozzászólására (») Nov 12, 2023
Ne szedd szét jobban, felesleges. Az IP5306-os IC egy Powerbank IC és nem tudja egyszerre tölteni a hozzá kapcsolt akkut és energiával is ellátni a lámpát/USB aljzatot. Nincs mit tenni, ez ilyen. Kicsit bővebben: Bővebben: Link.
(#) Ferkógyerek válasza fecus hozzászólására (») Nov 7, 2023
Szia!
Én építettem kondenzátorost, igaz nem szuperkondikból csak simákból.
340mF/35V lett a végső kondi bank. Kb 20-25V-ról már teljesen jól használható volt.
FETeknek AUIRFS8408-akat használtam 5db párhuzamban. Mégis tönkrement az ötből kettő.
Ennyire kis feszültségnél nem fogod tudni a készülék eredő ellenállását elég alacsonyan tartani a megfelelő működéshez.
A hozzászólás módosítva: Nov 7, 2023
Következő: »»   6 / 197
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