|
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!
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.
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.
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
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
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.
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."
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.
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.
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=0x70;
C1ON_bit=0;
C2ON_bit=0;
INTCON.GIE=0;
ANSEL=0;
ANSELH=0;
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.F0 = 1; //TRIGGER HIGH
Delay_us(10); //10uS Delay
PORTB.F0 = 0; //TRIGGER LOW
while(!PORTB.F4); //várjuk az echo jelet high
T1CON.F0 = 1; //Timer Starts
while(PORTB.F4); //várjuk az echo jel végét 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
{
Lcd_Out(1,1,"itt vagyok");
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);
// Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(2,1,"itt vagyok6");
}
}
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);
}
}
A hozzászólás módosítva: Dec 29, 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!
Ezt csináltam, a leírások alapján:
#include <SPI.h>
#include <SD.h>
#include "TMRpcm.h"
#include "LowPower.h"
const int chipSelect = 10;
const int wakeUpPin = 2;
const int fetPin = 3;
int buttonState = 0;
TMRpcm tmrpcm;
File root;
void wakeUp() {
buttonState = HIGH;
detachInterrupt(digitalPinToInterrupt(wakeUpPin));
}
void initSDCard() {
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("note: press reset or reopen this serial monitor after fixing your issue!");
while (true);
}
Serial.println("initialization done.");
root = SD.open("/");
tmrpcm.speakerPin = 9;
tmrpcm.setVolume(5);
tmrpcm.quality(1);
}
void setup() {
Serial.begin(9600);
pinMode(wakeUpPin, INPUT);
pinMode(fetPin, OUTPUT);
digitalWrite(fetPin, LOW);
}
void loop() {
buttonState = LOW;
attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, RISING);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
if (buttonState == HIGH) {
initSDCard();
digitalWrite(fetPin, HIGH);
tmrpcm.play("DINGDONG.WAV");
digitalWrite(fetPin, LOW);
}
}
Nem próbáltam, nézd meg! Gondolatot ébreszteni..
#include <Wire.h>
const int relayPin = 8; // A relé csatlakoztatásának pinje
float previousTemperature = 0.0;
void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial. println("Could not find a valid BMP180 sensor, check wiring!");
while (1);
}
pinMode(relayPin, OUTPUT);
}
void loop() {
float currentTemperature = bmp.readTemperature();
Serial.print("Current Temperature: ");
Serial.print(currentTemperature);
Serial.println(" °C");
delay(600000); // 10 perc várakozás
float newTemperature = bmp.readTemperature();
Serial.print("New Temperature: ");
Serial.print(newTemperature);
Serial.println(" °C");
if (newTemperature > currentTemperature) {
digitalWrite(relayPin, HIGH); // A relé bekapcsol
Serial.println("Relay ON");
} else {
digitalWrite(relayPin, LOW); // A relé kikapcsol
Serial.println("Relay OFF");
}
previousTemperature = newTemperature;
}
A hozzászólás módosítva: Dec 13, 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
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:
#include <SPI.h>
#include <SD.h>
#include "TMRpcm.h"
const int chipSelect = 10;
const int buttonPin = 2;
const int fetPin = 3;
int buttonState = 0;
TMRpcm tmrpcm;
File root;
void initSDCard() {
while (!Serial);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("1. is a card inserted?");
Serial.println("2. is your wiring correct?");
Serial.println("3. did you change the chipSelect pin to match your shield or module?");
Serial.println("note: press reset or reopen this serial monitor after fixing your issue!");
while (true);
}
Serial.println("initialization done.");
root = SD.open("/");
tmrpcm.speakerPin = 9;
tmrpcm.setVolume(5);
tmrpcm.quality(1);
}
void setup() {
Serial.begin(9600);
initSDCard();
pinMode(buttonPin, INPUT);
pinMode(fetPin, OUTPUT);
digitalWrite(fetPin, LOW);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(fetPin, HIGH);
tmrpcm.play("DINGDONG.WAV");
digitalWrite(fetPin, LOW);
}
}
A hozzászólás módosítva: Dec 11, 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?
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
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...
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
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
uint32_t start1Millis = 5000; //Soros portra kiírja az akku adatait.
uint32_t start2Millis = 4000; //Soros portra és displayre kiírja LoRa packetet.
uint32_t start3Millis = 3000; //Soros portra kiírja displayinfot.
uint32_t start4Millis = 2000; //Displayre kiírja GPS kordinátákat.
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
```cpp
#include <LoRa.h>
#include <TinyGPS++.h>
#include "boards.h"
TinyGPSPlus gps;
#if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
#error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
#endif
uint32_t start1Millis = 5000; //Soros portra kiírja az akku adatait.
uint32_t start2Millis = 4000; //Soros portra és displayre kiírja LoRa packetet.
uint32_t start3Millis = 3000; //Soros portra kiírja displayinfot.
uint32_t start4Millis = 2000; //Displayre kiírja GPS kordinátákat.
uint32_t start5Millis = 1000; //Displayre kiírja GPS idő és magasság adatokat.
void setup()
{
initBoard();
delay(1500);
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
const long periodMillis=4000;
if (( (signed long)(millis()-start1Millis))>0)
{
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
// The battery percentage may be inaccurate at first use, the PMU will automatically
// learn the battery curve and will automatically calibrate the battery percentage
// after a charge and discharge cycle
if (PMU->isBatteryConnect())
{
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
}
Serial.println();
start1Millis += periodMillis;
}
if (pmuInterrupt)
{
pmuInterrupt = false;
// Get PMU Interrupt Status register
uint32_t status = PMU->getIrqStatus();
Serial.print("STATUS => HEX:");
Serial.print(status, HEX);
Serial.print(" BIN:");
Serial.println(status, BIN);
if (PMU->isVbusInsertIrq()) {
Serial.println("isVbusInsert");
}
if (PMU->isVbusRemoveIrq()) {
Serial.println("isVbusRemove");
}
if (PMU->isBatInsertIrq()) {
Serial.println("isBatInsert");
}
if (PMU->isBatRemoveIrq()) {
Serial.println("isBatRemove");
}
if (PMU->isPekeyShortPressIrq()) {
Serial.println("isPekeyShortPress");
}
if (PMU->isPekeyLongPressIrq()) {
Serial.println("isPekeyLongPress");
}
if (PMU->isBatChagerDoneIrq()) {
Serial.println("isBatChagerDone");
}
if (PMU->isBatChagerStartIrq()) {
Serial.println("isBatChagerStart");
}
// Clear PMU Interrupt Status register
PMU->clearIrqStatus();
}
if (( (signed long)(millis()-start2Millis))>0)
{
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
Serial.print("Received packet ");
String recv = "";
// read packet
while (LoRa.available())
{
recv += (char)LoRa.read();
}
Serial.println(recv);
// print RSSI of packet
Serial.print("' with RSSI: ");
Serial.println(LoRa.packetRssi());
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->setCursor(0, 25);
u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
u8g2->println(" mV");
snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
u8g2->drawStr(0, 56, buf);
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start2Millis += periodMillis;
}
}
#endif
}
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial1.available() > 0)
if (gps.encode(Serial1.read()))
if (( (signed long)(millis()-start3Millis))>0)
{
displayInfo();
start3Millis += periodMillis;
}
if (( (signed long)(millis()-start4Millis))>0)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "Location.lat:");
u8g2->setCursor(0, 32);
u8g2->print(gps.location.lat(), 6);
u8g2->println(" deg");
u8g2->setCursor(0, 48);
u8g2->println( "Location.lng:");
u8g2->setCursor(0, 64);
u8g2->print(gps.location.lng(), 6);
u8g2->println(" deg");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
}
start4Millis += periodMillis;
#endif
}
if (( (signed long)(millis()-start5Millis))>0)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->print( "Hour: ");
u8g2->println(gps.time.hour());
u8g2->setCursor(0, 32);
u8g2->print("minute: ");
u8g2->println(gps.time.minute());
u8g2->setCursor(0, 48);
u8g2->print( "second: ");
u8g2->println(gps.time.second());
u8g2->setCursor(0, 64);
u8g2->print("altitude: ");
u8g2->println(gps.altitude.meters());
}
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start5Millis += periodMillis;
}
#endif
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
} else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
```
A hozzászólás módosítva: Nov 22, 2023
```cpp
#include <LoRa.h>
#include <TinyGPS++.h>
#include "boards.h"
TinyGPSPlus gps;
#if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
#error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
#endif
uint32_t start1Millis; //Soros portra kiírja az akku adatait.
uint32_t start2Millis; //Soros portra és displayre kiírja LoRa packetet
uint32_t start3Millis; //Soros portra kiírja displayinfot, displayre kiírja GPS kordinátákat.
uint32_t start4Millis; //Displayre kiírja GPS idő és magasság adatokat.
void setup()
{
initBoard();
delay(1500);
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
const long periodMillis=4000;
if (( (signed long)(millis()-start1Millis))>0)
{
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
// The battery percentage may be inaccurate at first use, the PMU will automatically
// learn the battery curve and will automatically calibrate the battery percentage
// after a charge and discharge cycle
if (PMU->isBatteryConnect())
{
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
}
Serial.println();
start1Millis += periodMillis;
}
if (pmuInterrupt)
{
pmuInterrupt = false;
// Get PMU Interrupt Status register
uint32_t status = PMU->getIrqStatus();
Serial.print("STATUS => HEX:");
Serial.print(status, HEX);
Serial.print(" BIN:");
Serial.println(status, BIN);
if (PMU->isVbusInsertIrq()) {
Serial.println("isVbusInsert");
}
if (PMU->isVbusRemoveIrq()) {
Serial.println("isVbusRemove");
}
if (PMU->isBatInsertIrq()) {
Serial.println("isBatInsert");
}
if (PMU->isBatRemoveIrq()) {
Serial.println("isBatRemove");
}
if (PMU->isPekeyShortPressIrq()) {
Serial.println("isPekeyShortPress");
}
if (PMU->isPekeyLongPressIrq()) {
Serial.println("isPekeyLongPress");
}
if (PMU->isBatChagerDoneIrq()) {
Serial.println("isBatChagerDone");
}
if (PMU->isBatChagerStartIrq()) {
Serial.println("isBatChagerStart");
}
// Clear PMU Interrupt Status register
PMU->clearIrqStatus();
}
if (( (signed long)(millis()-start2Millis))>0)
{
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
Serial.print("Received packet ");
String recv = "";
// read packet
while (LoRa.available())
{
recv += (char)LoRa.read();
}
Serial.println(recv);
// print RSSI of packet
Serial.print("' with RSSI: ");
Serial.println(LoRa.packetRssi());
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->setCursor(0, 25);
u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
u8g2->println(" mV");
snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
u8g2->drawStr(0, 56, buf);
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start2Millis += periodMillis;
}
}
#endif
}
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial1.available() > 0)
if (gps.encode(Serial1.read()))
if (( (signed long)(millis()-start3Millis))>0)
{
displayInfo();
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "Location.lat:");
u8g2->setCursor(0, 32);
u8g2->print(gps.location.lat(), 6);
u8g2->println(" deg");
u8g2->setCursor(0, 48);
u8g2->println( "Location.lng:");
u8g2->setCursor(0, 64);
u8g2->print(gps.location.lng(), 6);
u8g2->println(" deg");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
}
#endif
start3Millis += periodMillis +4000;
}
if (( (signed long)(millis()-start4Millis))>0)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->print( "Hour: ");
u8g2->println(gps.time.hour());
u8g2->setCursor(0, 32);
u8g2->print("minute: ");
u8g2->println(gps.time.minute());
u8g2->setCursor(0, 48);
u8g2->print( "second: ");
u8g2->println(gps.time.second());
u8g2->setCursor(0, 64);
u8g2->print("altitude: ");
u8g2->println(gps.altitude.meters());
}
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start4Millis += periodMillis;
}
#endif
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
} else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
```
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.
```cpp
#include <LoRa.h>
#include <TinyGPS++.h>
#include "boards.h"
TinyGPSPlus gps;
#if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
#error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
#endif
uint32_t start1Millis; //Soros portra kiírja az akku adatait.
uint32_t start2Millis; //Soros portra és displayre kiírja LoRa packetet
uint32_t start3Millis; //Soros portra kiírja displayinfot.
uint32_t start4Millis; //Displayre kiírja GPS kordinátákat.
uint32_t start5Millis; //Displayre kiírja GPS idő és magasság adatokat.
void setup()
{
initBoard();
delay(1500);
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
const long periodMillis=4000;
if (( (signed long)(millis()-start1Millis))>0)
{
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
// The battery percentage may be inaccurate at first use, the PMU will automatically
// learn the battery curve and will automatically calibrate the battery percentage
// after a charge and discharge cycle
if (PMU->isBatteryConnect())
{
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
}
Serial.println();
start1Millis += periodMillis;
}
if (pmuInterrupt)
{
pmuInterrupt = false;
// Get PMU Interrupt Status register
uint32_t status = PMU->getIrqStatus();
Serial.print("STATUS => HEX:");
Serial.print(status, HEX);
Serial.print(" BIN:");
Serial.println(status, BIN);
if (PMU->isVbusInsertIrq()) {
Serial.println("isVbusInsert");
}
if (PMU->isVbusRemoveIrq()) {
Serial.println("isVbusRemove");
}
if (PMU->isBatInsertIrq()) {
Serial.println("isBatInsert");
}
if (PMU->isBatRemoveIrq()) {
Serial.println("isBatRemove");
}
if (PMU->isPekeyShortPressIrq()) {
Serial.println("isPekeyShortPress");
}
if (PMU->isPekeyLongPressIrq()) {
Serial.println("isPekeyLongPress");
}
if (PMU->isBatChagerDoneIrq()) {
Serial.println("isBatChagerDone");
}
if (PMU->isBatChagerStartIrq()) {
Serial.println("isBatChagerStart");
}
// Clear PMU Interrupt Status register
PMU->clearIrqStatus();
}
if (( (signed long)(millis()-start2Millis))>0)
{
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
Serial.print("Received packet ");
String recv = "";
// read packet
while (LoRa.available())
{
recv += (char)LoRa.read();
}
Serial.println(recv);
// print RSSI of packet
Serial.print("' with RSSI: ");
Serial.println(LoRa.packetRssi());
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->setCursor(0, 25);
u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
u8g2->println(" mV");
snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
u8g2->drawStr(0, 56, buf);
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start2Millis += periodMillis;
}
}
#endif
}
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial1.available() > 0)
if (gps.encode(Serial1.read()))
if (( (signed long)(millis()-start3Millis))>0)
{
displayInfo();
start3Millis += periodMillis;
}
if (( (signed long)(millis()-start4Millis))>0)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "Location.lat:");
u8g2->setCursor(0, 32);
u8g2->print(gps.location.lat(), 6);
u8g2->println(" deg");
u8g2->setCursor(0, 48);
u8g2->println( "Location.lng:");
u8g2->setCursor(0, 64);
u8g2->print(gps.location.lng(), 6);
u8g2->println(" deg");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start4Millis += periodMillis;
}
#endif
}
if (( (signed long)(millis()-start5Millis))>0)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->print( "Hour: ");
u8g2->println(gps.time.hour());
u8g2->setCursor(0, 32);
u8g2->print("minute: ");
u8g2->println(gps.time.minute());
u8g2->setCursor(0, 48);
u8g2->print( "second: ");
u8g2->println(gps.time.second());
u8g2->setCursor(0, 64);
u8g2->print("altitude: ");
u8g2->println(gps.altitude.meters());
}
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start5Millis += periodMillis;
}
#endif
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
} else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
```
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.
Alakul, viszont egyre hosszabb intervallumokban frissül, lehet state lesz a jobb megoldás, vagy a millis is újraindítható?
```cpp
#include <LoRa.h>
#include <TinyGPS++.h>
#include "boards.h"
TinyGPSPlus gps;
#if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
#error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
#endif
uint32_t start1Millis;
uint32_t start2Millis;
uint32_t start3Millis;
uint32_t start4Millis;
uint32_t start5Millis;
void setup()
{
initBoard();
delay(1500);
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
if (millis() > start1Millis)
{
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
// The battery percentage may be inaccurate at first use, the PMU will automatically
// learn the battery curve and will automatically calibrate the battery percentage
// after a charge and discharge cycle
if (PMU->isBatteryConnect())
{
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
}
Serial.println();
start1Millis += millis() + 10;
}
if (pmuInterrupt)
{
pmuInterrupt = false;
// Get PMU Interrupt Status register
uint32_t status = PMU->getIrqStatus();
Serial.print("STATUS => HEX:");
Serial.print(status, HEX);
Serial.print(" BIN:");
Serial.println(status, BIN);
if (PMU->isVbusInsertIrq()) {
Serial.println("isVbusInsert");
}
if (PMU->isVbusRemoveIrq()) {
Serial.println("isVbusRemove");
}
if (PMU->isBatInsertIrq()) {
Serial.println("isBatInsert");
}
if (PMU->isBatRemoveIrq()) {
Serial.println("isBatRemove");
}
if (PMU->isPekeyShortPressIrq()) {
Serial.println("isPekeyShortPress");
}
if (PMU->isPekeyLongPressIrq()) {
Serial.println("isPekeyLongPress");
}
if (PMU->isBatChagerDoneIrq()) {
Serial.println("isBatChagerDone");
}
if (PMU->isBatChagerStartIrq()) {
Serial.println("isBatChagerStart");
}
// Clear PMU Interrupt Status register
PMU->clearIrqStatus();
}
if(millis()> start2Millis)
{
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
Serial.print("Received packet ");
String recv = "";
// read packet
while (LoRa.available())
{
recv += (char)LoRa.read();
}
Serial.println(recv);
// print RSSI of packet
Serial.print("' with RSSI: ");
Serial.println(LoRa.packetRssi());
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->setCursor(0, 25);
u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
u8g2->println(" mV");
snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
u8g2->drawStr(0, 56, buf);
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start2Millis += millis() + 20;
}
}
#endif
}
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial1.available() > 0)
if (gps.encode(Serial1.read()))
if(millis()> start3Millis)
{
displayInfo();
start3Millis += millis() + 30;
}
if(millis()> start4Millis)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "Location.lat:");
u8g2->setCursor(0, 32);
u8g2->print(gps.location.lat(), 6);
u8g2->println(" deg");
u8g2->setCursor(0, 48);
u8g2->println( "Location.lng:");
u8g2->setCursor(0, 64);
u8g2->print(gps.location.lng(), 6);
u8g2->println(" deg");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start4Millis += millis() + 40;
}
#endif
}
if(millis()> start5Millis)
{
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->print( "Hour: ");
u8g2->println(gps.time.hour());
u8g2->setCursor(0, 32);
u8g2->print("minute: ");
u8g2->println(gps.time.minute());
u8g2->setCursor(0, 48);
u8g2->print( "second: ");
u8g2->println(gps.time.second());
u8g2->setCursor(0, 64);
u8g2->print("altitude: ");
u8g2->println(gps.altitude.meters());
}
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
start5Millis += millis() + 50;
}
#endif
}
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
} else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
```
A hozzászólás módosítva: 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:
#include <LoRa.h>
#include <TinyGPS++.h>
#include "boards.h"
TinyGPSPlus gps;
#if !defined(LILYGO_TBeamS3_SUPREME_V3_0) && !defined(LILYGO_TBeam_V1_X)
#error "The sketch is only suitable for boards carrying AXP192 or AXP2101 chips!"
#endif
uint32_t startMillis;
void setup()
{
initBoard();
delay(1500);
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DIO0_PIN);
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println(F("DeviceExample.ino"));
Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
Serial.print(F("Testing TinyGPS++ library v. "));
Serial.println(TinyGPSPlus::libraryVersion());
Serial.println(F("by Mikal Hart"));
Serial.println();
}
void loop()
{
if (millis() > startMillis)
{
Serial.print("isCharging:"); Serial.println(PMU->isCharging() ? "YES" : "NO");
Serial.print("isDischarge:"); Serial.println(PMU->isDischarge() ? "YES" : "NO");
Serial.print("isVbusIn:"); Serial.println(PMU->isVbusIn() ? "YES" : "NO");
Serial.print("getBattVoltage:"); Serial.print(PMU->getBattVoltage()); Serial.println("mV");
Serial.print("getVbusVoltage:"); Serial.print(PMU->getVbusVoltage()); Serial.println("mV");
Serial.print("getSystemVoltage:"); Serial.print(PMU->getSystemVoltage()); Serial.println("mV");
// The battery percentage may be inaccurate at first use, the PMU will automatically
// learn the battery curve and will automatically calibrate the battery percentage
// after a charge and discharge cycle
if (PMU->isBatteryConnect())
{
Serial.print("getBatteryPercent:"); Serial.print(PMU->getBatteryPercent()); Serial.println("%");
}
Serial.println();
startMillis += millis() + 1000;
}
if (pmuInterrupt)
{
pmuInterrupt = false;
// Get PMU Interrupt Status register
uint32_t status = PMU->getIrqStatus();
Serial.print("STATUS => HEX:");
Serial.print(status, HEX);
Serial.print(" BIN:");
Serial.println(status, BIN);
if (PMU->isVbusInsertIrq()) {
Serial.println("isVbusInsert");
}
if (PMU->isVbusRemoveIrq()) {
Serial.println("isVbusRemove");
}
if (PMU->isBatInsertIrq()) {
Serial.println("isBatInsert");
}
if (PMU->isBatRemoveIrq()) {
Serial.println("isBatRemove");
}
if (PMU->isPekeyShortPressIrq()) {
Serial.println("isPekeyShortPress");
}
if (PMU->isPekeyLongPressIrq()) {
Serial.println("isPekeyLongPress");
}
if (PMU->isBatChagerDoneIrq()) {
Serial.println("isBatChagerDone");
}
if (PMU->isBatChagerStartIrq()) {
Serial.println("isBatChagerStart");
}
// Clear PMU Interrupt Status register
PMU->clearIrqStatus();
}
//delay(3000);
// try to parse packet
int packetSize = LoRa.parsePacket();
if (packetSize)
{
// received a packet
//Serial.print("Received packet ");
String recv = "";
// read packet
while (LoRa.available())
{
recv += (char)LoRa.read();
}
//Serial.println(recv);
// print RSSI of packet
//Serial.print("' with RSSI: ");
//Serial.println(LoRa.packetRssi());
delay(10);
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->setCursor(0, 25);
u8g2->print(PMU->getBattVoltage()); //u8g2->drawStr(0, 26, recv.c_str());
u8g2->println(" mV");
snprintf(buf, sizeof(buf), "RSSI:%i", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.1f", LoRa.packetSnr());
u8g2->drawStr(0, 56, buf);
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
}
}
#endif
// This sketch displays information every time a new sentence is correctly encoded.
while (Serial1.available() > 0)
if (gps.encode(Serial1.read()))
displayInfo();
delay(1000);
/*#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "Location.lat:");
u8g2->setCursor(0, 32);
u8g2->print(gps.location.lat(), 6);
u8g2->println(" deg");
u8g2->setCursor(0, 48);
u8g2->println( "Location.lng:");
u8g2->setCursor(0, 64);
u8g2->print(gps.location.lng(), 6);
u8g2->println(" deg");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(10);
}
#endif
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->print( "Hour: ");
u8g2->println(gps.time.hour());
u8g2->setCursor(0, 32);
u8g2->print("minute: ");
u8g2->println(gps.time.minute());
u8g2->setCursor(0, 48);
u8g2->print( "second: ");
u8g2->println(gps.time.second());
u8g2->setCursor(0, 64);
u8g2->print("altitude: ");
u8g2->println(gps.altitude.meters());
}
while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(3000);
}
#endif*/
if (millis() > 5000 && gps.charsProcessed() < 10)
{
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
void displayInfo()
{
Serial.print(F("Location: "));
if (gps.location.isValid())
{
Serial.print(gps.location.lat(), 6);
Serial.print(F(","));
Serial.print(gps.location.lng(), 6);
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" Date/Time: "));
if (gps.date.isValid())
{
Serial.print(gps.date.month());
Serial.print(F("/"));
Serial.print(gps.date.day());
Serial.print(F("/"));
Serial.print(gps.date.year());
} else
{
Serial.print(F("INVALID"));
}
Serial.print(F(" "));
if (gps.time.isValid())
{
if (gps.time.hour() < 10) Serial.print(F("0"));
Serial.print(gps.time.hour());
Serial.print(F(":"));
if (gps.time.minute() < 10) Serial.print(F("0"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
if (gps.time.second() < 10) Serial.print(F("0"));
Serial.print(gps.time.second());
Serial.print(F("."));
if (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.print(gps.time.centisecond());
} else
{
Serial.print(F("INVALID"));
}
Serial.println();
}
boards
String rssi = "RSSI --";
String packSize = "--";
String packet ;
String message = "";
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
#ifndef DISPLAY_MODEL
#define DISPLAY_MODEL U8G2_SSD1306_128X64_NONAME_F_HW_I2C
#endif
DISPLAY_MODEL *u8g2 = nullptr;
#endif
#ifndef OLED_WIRE_PORT
#define OLED_WIRE_PORT Wire
#endif
#if defined(HAS_PMU)
#include "XPowersLib.h"
XPowersLibInterface *PMU = NULL;
#ifndef PMU_WIRE_PORT
#define PMU_WIRE_PORT Wire
#endif
bool pmuInterrupt;
void setPmuFlag()
{
pmuInterrupt = true;
}
bool initPMU()
{
if (!PMU)
{
PMU = new XPowersAXP2101(PMU_WIRE_PORT);
if (!PMU->init()) {
Serial.println("Warning: Failed to find AXP2101 power management");
delete PMU;
PMU = NULL;
} else {
Serial.println("AXP2101 PMU init succeeded, using AXP2101 PMU");
}
}
if (!PMU) {
PMU = new XPowersAXP192(PMU_WIRE_PORT);
if (!PMU->init()) {
Serial.println("Warning: Failed to find AXP192 power management");
delete PMU;
PMU = NULL;
} else {
Serial.println("AXP192 PMU init succeeded, using AXP192 PMU");
}
}
if (!PMU) {
return false;
}
PMU->setChargingLedMode(XPOWERS_CHG_LED_BLINK_1HZ);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, setPmuFlag, FALLING);
if (PMU->getChipModel() == XPOWERS_AXP192) {
PMU->setProtectedChannel(XPOWERS_DCDC3);
// lora
PMU->setPowerChannelVoltage(XPOWERS_LDO2, 3300);
// gps
PMU->setPowerChannelVoltage(XPOWERS_LDO3, 3300);
// oled
PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300);
PMU->enablePowerOutput(XPOWERS_LDO2);
PMU->enablePowerOutput(XPOWERS_LDO3);
//protected oled power source
PMU->setProtectedChannel(XPOWERS_DCDC1);
//protected esp32 power source
PMU->setProtectedChannel(XPOWERS_DCDC3);
// enable oled power
PMU->enablePowerOutput(XPOWERS_DCDC1);
//disable not use channel
PMU->disablePowerOutput(XPOWERS_DCDC2);
PMU->disableIRQ(XPOWERS_AXP192_ALL_IRQ);
PMU->enableIRQ(XPOWERS_AXP192_VBUS_REMOVE_IRQ |
XPOWERS_AXP192_VBUS_INSERT_IRQ |
XPOWERS_AXP192_BAT_CHG_DONE_IRQ |
XPOWERS_AXP192_BAT_CHG_START_IRQ |
XPOWERS_AXP192_BAT_REMOVE_IRQ |
XPOWERS_AXP192_BAT_INSERT_IRQ |
XPOWERS_AXP192_PKEY_SHORT_IRQ
);
} else if (PMU->getChipModel() == XPOWERS_AXP2101) {
#if defined (CONFIG_IDF_TARGET_ ESP32)
//Unuse power channel
PMU->disablePowerOutput(XPOWERS_DCDC2);
PMU->disablePowerOutput(XPOWERS_DCDC3);
PMU->disablePowerOutput(XPOWERS_DCDC4);
PMU->disablePowerOutput(XPOWERS_DCDC5);
PMU->disablePowerOutput(XPOWERS_ALDO1);
PMU->disablePowerOutput(XPOWERS_ALDO4);
PMU->disablePowerOutput(XPOWERS_BLDO1);
PMU->disablePowerOutput(XPOWERS_BLDO2);
PMU->disablePowerOutput(XPOWERS_DLDO1);
PMU->disablePowerOutput(XPOWERS_DLDO2);
// GNSS RTC PowerVDD 3300mV
PMU->setPowerChannelVoltage(XPOWERS_VBACKUP, 3300);
PMU->enablePowerOutput(XPOWERS_VBACKUP);
// ! No need to set, automatically open , Don't close it
// PMU->setPowerChannelVoltage(XPOWERS_DCDC1, 3300);
// PMU->setProtectedChannel(XPOWERS_DCDC1);
PMU->setProtectedChannel(XPOWERS_DCDC1);
// LoRa VDD 3300mV
PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO2);
//GNSS VDD 3300mV
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO3);
#endif /*CONFIG_IDF_TARGET_ESP32*/
#if defined(LILYGO_TBeamS3_SUPREME_V3_0)
//t-beam m.2 inface
//gps
PMU->setPowerChannelVoltage(XPOWERS_ALDO4, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO4);
// lora
PMU->setPowerChannelVoltage(XPOWERS_ALDO3, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO3);
// In order to avoid bus occupation, during initialization, the SD card and QMC sensor are powered off and restarted
if (ESP_SLEEP_WAKEUP_UNDEFINED == esp_sleep_get_wakeup_cause()) {
Serial.println("Power off and restart ALDO BLDO..");
PMU->disablePowerOutput(XPOWERS_ALDO1);
PMU->disablePowerOutput(XPOWERS_ALDO2);
PMU->disablePowerOutput(XPOWERS_BLDO1);
delay(250);
}
// Sensor
PMU->setPowerChannelVoltage(XPOWERS_ALDO1, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO1);
PMU->setPowerChannelVoltage(XPOWERS_ALDO2, 3300);
PMU->enablePowerOutput(XPOWERS_ALDO2);
//Sdcard
PMU->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
PMU->enablePowerOutput(XPOWERS_BLDO1);
PMU->setPowerChannelVoltage(XPOWERS_BLDO2, 3300);
PMU->enablePowerOutput(XPOWERS_BLDO2);
//face m.2
PMU->setPowerChannelVoltage(XPOWERS_DCDC3, 3300);
PMU->enablePowerOutput(XPOWERS_DCDC3);
PMU->setPowerChannelVoltage(XPOWERS_DCDC4, XPOWERS_AXP2101_DCDC4_VOL2_MAX);
PMU->enablePowerOutput(XPOWERS_DCDC4);
PMU->setPowerChannelVoltage(XPOWERS_DCDC5, 3300);
PMU->enablePowerOutput(XPOWERS_DCDC5);
//not use channel
PMU->disablePowerOutput(XPOWERS_DCDC2);
// PMU->disablePowerOutput(XPOWERS_DCDC4);
// PMU->disablePowerOutput(XPOWERS_DCDC5);
PMU->disablePowerOutput(XPOWERS_DLDO1);
PMU->disablePowerOutput(XPOWERS_DLDO2);
PMU->disablePowerOutput(XPOWERS_VBACKUP);
// Set constant current charge current limit
PMU->setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_500MA);
// Set charge cut-off voltage
PMU->setChargeTargetVoltage(XPOWERS_AXP2101_CHG_VOL_4V2);
// Disable all interrupts
PMU->disableIRQ(XPOWERS_AXP2101_ALL_IRQ);
// Clear all interrupt flags
PMU->clearIrqStatus();
// Enable the required interrupt function
PMU->enableIRQ(
XPOWERS_AXP2101_BAT_INSERT_IRQ | XPOWERS_AXP2101_BAT_REMOVE_IRQ | //BATTERY
XPOWERS_AXP2101_VBUS_INSERT_IRQ | XPOWERS_AXP2101_VBUS_REMOVE_IRQ | //VBUS
XPOWERS_AXP2101_PKEY_SHORT_IRQ | XPOWERS_AXP2101_PKEY_LONG_IRQ | //POWER KEY
XPOWERS_AXP2101_BAT_CHG_DONE_IRQ | XPOWERS_AXP2101_BAT_CHG_START_IRQ //CHARGE
// XPOWERS_AXP2101_PKEY_NEGATIVE_IRQ | XPOWERS_AXP2101_PKEY_POSITIVE_IRQ | //POWER KEY
);
#endif
}
PMU->enableSystemVoltageMeasure();
PMU->enableVbusVoltageMeasure();
PMU->enableBattVoltageMeasure();
// It is necessary to disable the detection function of the TS pin on the board
// without the battery temperature detection function, otherwise it will cause abnormal charging
PMU->disableTSPinMeasure();
Serial.printf("=========================================\n");
if (PMU->isChannelAvailable(XPOWERS_DCDC1))
{
Serial.printf("DC1 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_DCDC1) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_DCDC1));
}
if (PMU->isChannelAvailable(XPOWERS_DCDC2))
{
Serial.printf("DC2 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_DCDC2) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_DCDC2));
}
if (PMU->isChannelAvailable(XPOWERS_DCDC3))
{
Serial.printf("DC3 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_DCDC3) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_DCDC3));
}
if (PMU->isChannelAvailable(XPOWERS_DCDC4))
{
Serial.printf("DC4 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_DCDC4) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_DCDC4));
}
if (PMU->isChannelAvailable(XPOWERS_DCDC5))
{
Serial.printf("DC5 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_DCDC5) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_DCDC5));
}
if (PMU->isChannelAvailable(XPOWERS_LDO2)) {
Serial.printf("LDO2 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_LDO2) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_LDO2));
}
if (PMU->isChannelAvailable(XPOWERS_LDO3))
{
Serial.printf("LDO3 : %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_LDO3) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_LDO3));
}
if (PMU->isChannelAvailable(XPOWERS_ALDO1))
{
Serial.printf("ALDO1: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_ALDO1) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_ALDO1));
}
if (PMU->isChannelAvailable(XPOWERS_ALDO2))
{
Serial.printf("ALDO2: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_ALDO2) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_ALDO2));
}
if (PMU->isChannelAvailable(XPOWERS_ALDO3)) {
Serial.printf("ALDO3: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_ALDO3) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_ALDO3));
}
if (PMU->isChannelAvailable(XPOWERS_ALDO4))
{
Serial.printf("ALDO4: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_ALDO4) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_ALDO4));
}
if (PMU->isChannelAvailable(XPOWERS_BLDO1))
{
Serial.printf("BLDO1: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_BLDO1) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_BLDO1));
}
if (PMU->isChannelAvailable(XPOWERS_BLDO2))
{
Serial.printf("BLDO2: %s Voltage: %04u mV \n", PMU->isPowerChannelEnable(XPOWERS_BLDO2) ? "+" : "-", PMU->getPowerChannelVoltage(XPOWERS_BLDO2));
}
Serial.printf("=========================================\n");
// Set the time of pressing the button to turn off
PMU->setPowerKeyPressOffTime(XPOWERS_POWEROFF_4S);
uint8_t opt = PMU->getPowerKeyPressOffTime();
Serial.print("PowerKeyPressOffTime:");
switch (opt)
{
case XPOWERS_POWEROFF_4S: Serial.println("4 Second");
break;
case XPOWERS_POWEROFF_6S: Serial.println("6 Second");
break;
case XPOWERS_POWEROFF_8S: Serial.println("8 Second");
break;
case XPOWERS_POWEROFF_10S: Serial.println("10 Second");
break;
default:
break;
}
return true;
}
void disablePeripherals()
{
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef I2C1_SDA
Wire1.begin(I2C1_SDA, I2C1_SCL);
#endif
#ifdef RADIO_TCXO_EN_PIN
pinMode(RADIO_TCXO_EN_PIN, OUTPUT);
digitalWrite(RADIO_TCXO_EN_PIN, HIGH);
#endif
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0)
{
Serial.println("Started OLED");
u8g2 = new DISPLAY_MODEL(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(3000);
}
#endif
#ifdef HAS_DISPLAY
if (u8g2)
{
u8g2->clearBuffer();
do
{
u8g2->setCursor(0, 16);
u8g2->println( "BattVoltage:");
u8g2->setCursor(0, 32);
u8g2->print(PMU->getBattVoltage());
u8g2->println("mV");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(3000);
}
#endif
}
utilities
#pragma once
#define LILYGO_TBeam_V1_X
#ifndef LoRa_frequency
#define LoRa_frequency 433E6
#endif
#if defined(LILYGO_TBeam_V1_X)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DIO0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#define HAS_PMU
#else
#error "For the first use, please define the board version and model in <utilities. h>"
#endif
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!
Ne szedd szét jobban, felesleges. Az IP5306-os IC egy Power bank 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.
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
|
|