Fórum témák
- • Transzformátor készítés, méretezés
- • ESR mérő
- • Napelem alkalmazása a lakás energia ellátásában
- • Audiofil, High End Audio
- • LCD monitor probléma
- • Mosogatógép hiba
- • Villanyszerelés
- • Érdekességek
- • Tápegységgel kapcsolatos kérdések
- • Jókívánság
- • Analóg oszcilloszkóp javítása
- • Vicces - mókás történetek
- • LCD kijelző vezérlése, életre keltése
- • LED-es lámpa, meghajtó áramkör
- • Erősítő mindig és mindig
- • Sárga Kazettás Piaci Nintendo (8bit)
- • Számítógép hiba, de mi a probléma?
- • Projektor
- • Teljesítmény -LED, powerLED (pl. Cree, Luxeon) vezérlése
- • Aszinkron motorok tekercselése
- • DSP - Miértek, hogyanok
- • TV hiba, mi a megoldás?
- • Kombikazán működési hiba
- • Szilárdtest relé
- • LCD TV probléma
- • 3-fázisú Modbus-os teljesítményszabályzó (SCR power controller)
- • Digitális forrasztóállomás
- • Li-Po - Li-ion akkumulátor és töltője
- • Rendelés külföldről (eBay - Paypal)
- • Rádiós adó-vevő modulok
- • Rádióamatőrök topikja
- • Westen 240 Fi gázkazán hiba
- • Padlófűtés vezérlés
- • Menetszámolós tekercselőgép házilag
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Autó-generátor nem tölt rendesen
- • Digitális kapcsoló
- • Erősítő probléma
- • Hiszterézis komparátor
- • Dobozolási technikák, műszerdobozok
- • Műhelyünk felszerelése, szerszámai
- • Rossz HDD javítás, mentés
- • Tervezzünk nyákot EasyEDA-val
- • Lézergravírozás
- • Nagy áramú pwm vezérlő építése
- • GPS GSM modulok programozása
- • HESTORE.hu
- • Hűtőgép probléma
- • Ultrahangos párásító
- • Felajánlás, azaz ingyen elvihető
- • LED-es index
- • Kenyérsütőgép
- • Autóriasztó és központi zár
- • Eberspacher állófűtés javítása
- • Villanymotor mi a hiba?
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Szia!
A cél az lenne, hogy a weben idönként frissüljön az érték.
Sajnos sehová nem jutottam vele, mert nem találtam róla infót. Próbáltam AI segítséget hívni, írt egy scriptet, de az sem működött egyáltalán.
Keresőszó: ajax microajax vagy xml...
Nézz szét az ESP8266 előadásaim között (főleg a 2020/2021. évad 16. és 17. előadása kellhet neked).
A rákövetkező évnél nagyjából ugyanezt ESP32-re is megtalálod.
De ha a head-be beleírod az alábbit, akkor a böngésző frissíti az oldalt 10s-enként.
<meta http-equiv="refresh" content="10">
Azért az ajax sokkal jobb megoldás, mint az egész oldalt frissítgetni, és nem is bonyolult.
A websocket még jobb, de sokkal bonyolultabb megvalósítani...
A kittben volt egy keyboard nevezetű eszköz. Hol tudnék rá venni számokat? A hozzászólás módosítva: Nov 18, 2023
Hová szeretnél számot rakni ezekre a gombokra ? Bővebben: Link A hozzászólás módosítva: Nov 18, 2023
Kiindulásnak ez hátha segítség. Nem próbáltam ki
HTML + Javascript kód:
<!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ESP8866 hőmérés</title>
</head>
<body>
<h1>Hőmérséklet: <span id="temperature">N/A °C</span></h1>
<script>
function fetchTemperature() {
fetch('/temperature')
.then(response => {
if (!response.ok) {
throw new Error('Hiba történt');
}
return response.text();
})
.then(data => {
document.getElementById('temperature').innerText = data;
})
.catch(error => {
console.error('Hiba történt: ', error);
});
}
setInterval(fetchTemperature, 10000); // 10 másodpercenként fog frissülni
fetchTemperature(); // Hogy azonnal jelenjen meg adat
</script>
</body>
</html>
ESP kódrészlet:
//...
// Html fájl kiszolgálása
server.on("/", HTTP_GET, []() {
server.send(200, "text/plain", A_MERT_HOMERSEKLET);
});
// A hőmérsékletadat kiszolgálása
server.on("/temperature", HTTP_GET, []() {
server.send(200, "text/html", A_FENTI_HTML);
});
Valami gombsort vagy bármit mert elég rossz nyomkodni a fekete kis gombokat.
Valami ilyesmire gondolok de magyarból.
Bővebben: Link
Ez így egyben árulják a NYÁK lappal, külön még nem láttam sehol sem.
Esetleg 3d nyomtatni tudsz rá, ha van 3d nyomtatód.
Vagy régi nyomógombos telefonból/billentyűzetből/számológépből lehet ki lehet szedni és ráragasztani, csak az nem lesz túl szép.
Ez nagyon kár olvasni. Marad a nyomtatás.
Azért hátha valaki tud olyat mondani, amit én nem vettem eddig észre és rávaló.
Nagyon szépen köszönöm! Működik!
Talán csak egy pici gond volt vele:
<h1>Hőmérséklet: <span id="temperature">N/A</span> °C</h1>
A fenti sor helyes. Ha a °C jelet a Span-hez rakod közvetlen a kijelzett vagy kijelzendő érték mögé, akkor a kijelzett érték miatt a jelzés törlődik. Így viszont egy szóközzel mindig ott lesz a kijelzett érték végén. A hozzászólás módosítva: Nov 20, 2023
Köszönöm szépen!
Nagyon jók az előadásaid! Sokat tanultam most belőle!
Thingiverse-n van hozzá burkolat terv. A keresőszó hozzá: "4x4 matrix 16 keys". Számok sajnos nincsenek rajta, ahhoz kicsit módosítani kell a terven, vagy matricát ráragasztani.
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
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
20:40:13:00
20:40:21:00
20:40:29:00
20:40:46:00
20:41:20:00
20:42:27:00
20:44:42:00
20:49:11:00
20:58:10:00
21:16:07:00
Örülök, az ESP kódban is felcseréltem a két végponot, most látom, de sebaj, Örülök, hogy segített
Sziasztok! Egy projekt elején vagyok, de a megvalósíthatóságában kételkedem.
Egy 2-tengelyes, léptetőmotoros mechanikát kellene építenem. Mindkét tengelyen nagy sebességkülönbségeket, felbontást kell lehetővé tenni. A mikrovezérlő Atmega328, a léptetőmotor vezérlő pedig TMC2208 lenne, ami "legacy" módban csak 1/16 mikrolépést tesz lehetővé, ami kevés. Lehetőség van UART-on keresztül nagyobb felbontást elérni és itt jön a kételyem; lehetséges mindkét léptetőmotor vezérlőjét külön megcímezni UART-on keresztül, és ha igen, mi a módja?
Azért van erre szükség, mert előfordulhat, hogy míg az egyik tengely nyugodtan száguldozhat akár 1/2 mikrolépéssel, addig a másiknak 1/64 mikrolépéssel kellene mozognia.
Tudom, használhatnék más léptetőmotor vezérlőt, ami UART nélkül is több mikrolépés lehetőséget kínál, de a TMC2208 mind közül a leghalkabb, ami most fontos lenne. (Már épült egy mechanika DRV8825 vezérlőkkel, de borzasztó hangos.)
Köszönöm a választ, segítséget!
Miért ezt az elavult 8 bitest választottad?
Mikor jóval korszerűbb mindenben jobb. És legalább van benne 2db. soros port is.
Bővebben: Link STM32F103
Azért ezt választottam, mert ez öröklődött a projekt előzményéből, és mert ezzel van tapasztalat, valamint eddig elég is volt a feladatra.
Sajnos a külön vezérlők nem címezhetők, dedikált soros kommunikáció kell nekik.
Vagy beírod az OTP-be az értékeket és akkor nem kell vesződni UART-tal (de csak 1x írható valóban), vagy a SoftwareSerial lehet még segítségedre.
Ez nagyon hasznos, köszönöm!
Igen, az OTP jó lenne, de mivel menet közben kellene variálni a mikrolépést, így ez kiesik.
A "SoftwareSerial" is kiesik mert ehhez lassú lesz neked!
Marad a mikrokontroller csere.
Nem feltételnül. A Idézet: „menet közben kellene variálni a mikrolépést” úgy értem, hogy a program futása közben. Viszont amikor át kell állítani a mikrolépést, akkor egyik tengely sem mozog, és a várakozás nem olyan időérzékeny, szóval működhet.
Hali!
Mi akadályoz meg hogy pár ttl kapuból megcsináld a soros port átkapcsolását a két tmc között?
Annak mi az oka, hogy menet közben szeretnéd a mikrolépést állítani?
|
|