Fórum témák
- • PC táp javítása
- • VF3 - 6 végerősítő
- • Oszcilloszkóp vétel, mit gondoltok?
- • Mosógép vezérlők és általános problémáik
- • Felajánlás, azaz ingyen elvihető
- • Műhelyünk felszerelése, szerszámai
- • Alternativ HE találkozó(k)
- • Gázkazán vezérlő hibák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • JVC autórádió
- • Autórádió beszerelése
- • Crystal radio - detektoros rádió
- • Házilag építhető fémkereső
- • Whirlpool mosógép
- • Lemezlejátszó tű
- • PLC kérdések
- • Mosogatógép hiba
- • Gigatron TTL számítógép
- • Robotfűnyíró vagy fűnyíró robot
- • Villanypásztor
- • SMD forrasztás profin
- • Arduino
- • Mobiltelefon hiba
- • Espressif mikrokontrollerek
- • 135.6 kHz-es HGA22 vevő
- • Villanyszerelés
- • Philips TV
- • Minden, ami modell
- • Számítógép hiba, de mi a probléma?
- • Erősítő mindig és mindig
- • Jókívánság
- • Muzeális készülékek-alkatrészek restaurálása
- • Elektroncső
- • Frekvenciamérő
- • Magas nyomású tisztító működése, javítása
- • Rádióamatőrök topikja
- • DC-DC konverter
- • Elfogadnám, ha ingyen elvihető
- • Videoton RM 5642 S
- • Elektronikai rendezvények, kiállítások
- • Labortápegység készítése
- • Hoverboard bluetooth probléma
- • Videókártya probléma
- • Modulrendszerű, grafikus PIC programozás
- • Transmission Line hangsugárzó építés
- • Lemezjátszó beállítása, javítása
- • Napelemes rendszer kérdés
- • TV hiba, mi a megoldás?
- • Freecad-Miértek hogyanok
- • Orion SE 260 erősítő
- • Kapcsolási rajzot keresek
- • Sárga Kazettás Piaci Nintendo (8bit)
- • RP2040
- • Kivezérlésjelző, de nem LED-ekkel
- • Hegesztő inverter javítás
» Több friss téma
|
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.
/*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=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>
#include <Adafruit_BMP180.h>
Adafruit_BMP180 bmp;
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);
//ESP32 VDD 3300mV
// ! 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
Sziasztok,
egy kis segítségre lenne szükségem, hogy megértsem mit csinálhattam rosszul.
Korábban nem tervezgettem 3D-be semmit, de most szükségem lenne egy alkatrészre. Megterveztem SketchUp-ban, minden jónak néz ki rajta, olyan amilyennek szeretném hogy legyen, innen generáltam a .stl file-t, amit kiküldtem a JLCPCB-nek.
Onnan az alábbi üzenetet kaptam vissza:
"There are some bad edges and errors need to be fixed in your file. These errors occurred because there might be some accuracy algorithms difference of different format files between the different software or some hidden surfaces had not been deleted yet when drawing the structural surfaces. Please kindly check if there are some hidden surfaces had not been deleted."
Valamint egy képet is csatolt, de nem látom rajta hogy mi lehet a probléma.
Csak az MpLba 8 -on használtam stimulust.
Itt lehet találni módszereket.
register injection: Egy regiszter értékét lehet a stimulussal beállítható idővel vagy időközönként módosítani.
Üdv!
Vannak fejlemények, de sajnos nem jók. Egyszerűen nem jó az ADC. Timer3-interruptban hívnám meg és mérnék. Elvileg ez meg is történik, de az adatok nem jók. Ennek a 12 bite módnak vannak sample A és sample B bitjei. Ha az ALTS-t 0-ra állítom, akkor a legjobb eredmény az, hogy 1 minta jó, a másik 4095, majd megint jó, megint 4095. Na ekkor jutott eszembe, hogy ok, szándékosan legyen ALTS=1,hogy váltakozzon a sample A és a sample B között. Ekkor, ha definiáltam a CH0SA-t és CH0SB-t is, pozitív és negatív pinekkel mindennel, akkor a legjobb eredményem a következő volt:
1 mérés, legyen a sampl A, kiadja a szinuszt, de csak fele minavétellel. A sample B is kiadja a szinuszt, de 180 fokos fázistolással, szintén fele mintavétellel.
Hol lehet a hiba? DMA máshogy tölti fel? Időzítési probléma? Van valaki akinek ez sikerült rendesen? dsPIC128MC802.
void init_ADC_1( void )
{
TRISAbits.TRISA4=1; //Analóg jel ide jön be, input
//ADPCFGbits.PCFG4=5; //adc low láb??
//dsPIC33FJ32MC302, dsPIC33FJ64MC202/802 and dsPIC33FJ128MC202/802 devices only:
//00101 = Channel 0 positive input is AN4
//00010 = Channel 0 positive input is AN2
//00001 = Channel 0 positive input is AN1
//00000 = Channel 0 positive input is AN0.
AD1CHS0bits.CH0SA=0b00100;
//CH0NA: Channel 0 Negative Input for Sample A bit
//1 = Channel 0 negative input is AN1
//0 = Channel 0 negative input is VREF
AD1CHS0bits.CH0NA=0; //channel 0 negatív ref VREF- láb
// AD1CHS0bits.CH0SB=0b00100;
// //CH0NB: Channel 0 Negative Input for Sample B bit
// //1 = Channel 0 negative input is AN1
// //0 = Channel 0 negative input is VREF
// AD1CHS0bits.CH0NB=0; //channel 0 negatív ref VREF- láb
AD1CON1bits.FORM = 0; // Data Output Format: integer//Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 0; // 000 = Clearing sample bit ends sampling and starts conversion
AD1CON1bits.ASAM = 0; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 1; // 12-bit ADC operation SINGLE Chanel
//AD1CON1bits.SIMSAM =0; // 10-bit ADC operation
AD1CON2bits.CHPS = 0b00; // Only CH0
AD1CON2bits.CSCNA = 0; // Do not scan inputs
AD1CON2bits.ALTS = 1; // Alternálás, Sample A és Sample B között!!!
//bit 15-13 VCFG<2:0>: er Voltage Reference Configuration bits
//VREFH VREFL
//000 AVDD AVss
//001 External VREF+(3) AVss
//010 AVDD External VREF-(3)
//011 External VREF+(3) External VREF-(3)
//1xx AVDD AVss
AD1CON2bits.VCFG=0b11;
AD1CON2bits.BUFM = 0; // Always start filling at buffer 0
// If ADRC = 0
//ADC Clock Period (TAD) = TCY ? (ADCS + 1)
//If ADRC = 1
//ADC Clock Period (TAD) = TADRC
AD1CON3bits.ADRC = 0; // ADC Clock is derived Systems Clock
AD1CON3bits.ADCS =15; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*16 = 200ns (0.4Mhz)
AD1CON3bits.SAMC = 4; // Auto Sample Time = 0*Tad
// ADC Conversion Time for 10-bit Tc=12*Tab = 900ns (1.1MHz)
AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
AD1CON2bits.SMPI = 0; // SMPI must be 0, interrupt az els? minta után. Elvileg 16 bufferbe is tölthet
AD1CON4bits.DMABL = 0; // Only 1 DMA buffer for each analog input
//AD1CHS0/AD1CHS123: A/D Input register
// AD1CHS0bits.CH0SA = 0; // MUXA +ve input ion (AIN0) for CH0
// AD1CHS0bits.CH0NA = 0; // MUXA -ve input ion (Vref-) for CH0
//Az MC802-nél nincs külön analóg bemenet negatívra lehet?ség, a ref- haszálhatom
//01 = CH1, CH2, CH3 negative input is VREF-
//00 = CH1, CH2, CH3 negative input is VREF-
// AD1CHS123bits.CH123NB = 0; // MUXA -ve input ion (Vref-) for CH1, CH2,CH3
//CH123SB: Channel 1, 2, 3 Positive Input for Sample B bit
//If AD12B = 1:
//1 = Reserved
//0 = Reserved
//If AD12B = 0:
//1 = CH1 positive input is AN3, CH2 positive input is AN4, CH3 positive input is AN5
//0 = CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2
//Mert az analg jel AN4-re csatlakozik
//AD1CHS123bits.CH123SB = 1; // MUXA +ve input ion (AIN0) for CH1
IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 0; // Do not Enable A/D interrupt
AD1CSSLbits.CSS4 = 1; //Scan AN4 only
AD1PCFGLbits.PCFG4 = 0; //Only AN4 in analog input mode
AD1CON1bits.ADON = 1; // Turn on the A/D er
}
unsigned int readADC(void) {
// Start conversion
//Manuális módban a SAMP -nak változnia kell és meg is kell várni
AD1CON1bits.SAMP = 1;//Start sampling
while(!AD1CON1bits.SAMP); //Ameddig megy a mintavétel
//AD1CON1bits.SAMP = 0; //Meg kell mondani, hogy vége, kezdődhet a álás
while(AD1CON1bits.SAMP);
while(!AD1CON1bits.DONE); //Míg kész nincs a konvertálás,addig várni kell
return ADC1BUF0;
A hozzászólás módosítva: Nov 2, 2023
Csak kérdeznék. Ilyen megszaladással EL34-el én is találkoztam, világított az anód. Katódellenállással volt beállítva a munkapont, ez meddig kompenzálja a cső öregedését?
Az ARC következetesen fix rács előfeszültséget használ, az Audio note általában katódellenállást.
Hol az igazság?
Idézet: „Ha nyílt forrású a program, akkor akár meg is lehetne javítani.”
Nem nyílt forrású, de ha lehet akkor megpatchelném inkább.
Idézet: „Nem a ./ipecmd.sh szkript töri kettőbe? Abban mi van?”
Dauh bingó, jövök egyel!!!
Betettem a tartalmát a bash-ba és így meg. A $@ átpasszolása volt a ludas:
mm@P15:/opt/microchip/mplabx/v6.15/mplab_platform/mplab_ipe$ export here=`dirname $0`
export mplabx_dir=$here/..
export netbeans_dir=$mplabx_dir
export ipecmd_jar=$mplabx_dir/mplab_ipe/ipecmd.jar
# obtain jdkhome from mplab_ipe.conf
. ../etc/mplab_ipe.conf
export jvm=$jdkhome/bin/java
mm@P15:/opt/microchip/mplabx/v6.15/mplab_platform/mplab_ipe$ $jvm -jar ipecmd.jar -OV -P16F1718 -F/tmp/foo\ bar.hex -TPPK4
DFP Version Used : PIC12-16F1xxx_DFP,1.6.241,Microchip
Programmer not found.
A hozzászólás módosítva: Okt 31, 2023
|
|