-
Mobilarena
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
lanszelot
addikt
válasz
Tomika86 #20422 üzenetére
Először is köszönöm a segítséget mindenkinek.
Végre megértettem, amit próbáltatok elmagyarázni.
Rosszul értelmeztem amit írtatok.
Azt hittem a loop megvárja a szünetet, mert azt hittem az úgy működik mint a delay.
De nem, az úgy működik mint a beep.A loop végén írtam miert nem jó a hosszabb delay.
Akkor az egész eltorzul.Viszont az elsőbe ami nem jól működik oda beszúrtam egy delay-t.
És így, bár sufni tuning módra, de megoldódottitt a kész kód:
#include <TimerOne.h>
#include <Wire.h>
#include <MultiFuncShield.h>
int trigPin = 40; // Trigger
int echoPin = 41; // Echo
long duration, cm, inches;
void setup() {
//Serial Port begin
Serial.begin (9600);
//Define inputs and outputs
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Timer1.initialize();
MFS.initialize(&Timer1);
}
void loop() {
// The sensor is triggered by a HIGH pulse of 10 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read the signal from the sensor: a HIGH pulse whose
// duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
// Convert the time into a distance
cm = (duration/2) / 29.1; // Divide by 29.1 or multiply by 0.0343
inches = (duration/2) / 74; // Divide by 74 or multiply by 0.0135
MFS.write((int)cm);
/*Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();*/
if (cm <= 30 && cm > 20) {
MFS.beep(25, // beep for 250 milliseconds
100, // silent for 1000 milliseconds
1, // repeat above cycle 1 times
1, // loop 1 times
1 // wait 10 milliseconds between loop
);
delay(320);
Serial.println("egyes");
}else if (cm <= 20 && cm > 10) {
MFS.beep(25, // beep for 250 milliseconds
10, // silent for 100 milliseconds
1, // repeat above cycle 1 times
1, // loop 1 times
1 // wait 10 milliseconds between loop
);
Serial.println("kettes");
}else if (cm <= 10) {
MFS.beep(55, // beep for 350 milliseconds
1, // silent for 10 milliseconds
1, // repeat above cycle 1 times
1, // loop 1 times
1 // wait 10 milliseconds between loop
);
Serial.println("harmas");
}
delay(320);
} -
-
lanszelot
addikt
válasz
Tomika86 #20413 üzenetére
A mellette lévő kommentet értékeket nem írkáltam át, mert minek.
A lényege hogy melyik mit csinál . Nem a kommenthez kell igazítani a programot. A kommentet kell a programhoz.
Az értékek úgy jók ahogy beírtam.
"If" - rovid beep, hosszú szünet
"else if" - rövid beep, rövid szünet
"else if" - hosszú beep , nincs szünet.Mit értesz az alatt hogy a másodiknál folyamatosan ismétlődik?
Az első " else if" - re gondolsz?
Az érték nélküli az egy rövid beep . Nincs ismétlés.
Annál a delay adja a szünetet, épp azért nem változtatható.
Mert akkor mind a két "else if" rossz lesz a delay miatt.
Delay növelés nem jó megoldás.Valamiért az "if" -et felül írja valami. De nem tudom mi.
A benne lévő rész jól fut külön, tehát nincs elírva.
Nincs más az "if" -en belül, tehát csak az marad, hogy valami felül írja.
Lehet, hogy valamelyik "*.h" ban van bug és belefutottam. -
lanszelot
addikt
válasz
Tomika86 #20410 üzenetére
A középsőt nem kell paraméterezni.
Az alap beállításokkal fut: a felsőben feliratozva is van 200 ms beep.
Ha haza érek akkor feliratozom és megnézem.De ha jó ág is fut le akkor se jól csipog.
150-es szünet nincs sehol.
Nem találom mi írja felül.Elsőben jó: 15-ös beep, 150-es szünet, 15-ös beep, 150 szubet, 15 beep, 150 szünet. Vége
Így is kellene.Masodikban nincs 150-es szünet.
Kíváncsi vagyok mit fog mutatni a feliratkozás, melyik fut le.
-
Janos250
őstag
válasz
Tomika86 #20398 üzenetére
Az a gondom, hogy nem tudom, elég stabil-e hozzá a DC/DC. Régebben is említett itt valaki aggályokat, hogy inkább LDO-t használ. Nekem is van olyan tapasztalatom, érzékeny hőmérséklet mérésnél a DC/DC nem jó.
LDO-hoz létezik valami olyan buhera, hogy 4V-ot hozzak ki belőle? -
-
fpeter84
senior tag
válasz
Tomika86 #20365 üzenetére
melyik generáció, ott már ki van vezetve valamelyik canbus az obd csatira? mert A6 C5-nél még nincsen... a diagnosztika csak K és L-en éri el, a 3-4 canbus hálózat csak belső használatra van a különböző vezérlők között. no ebbe másztam bele a műszerfal mögött, mert az a gateway, ott összefut minden - csináltam Y leágaztató kábeleket így mindenhez hozzáférek. találtam egy német nyelvű pdf-et az EDC15P vezérlőről, abból próbálok google translate-el minél többet megérteni, illetve azon túl is sokmindent lehet találni guglizva. elég sok információ megtalálható rajta...
-
#68216320
törölt tag
válasz
Tomika86 #20344 üzenetére
Köszi, néztem mára "Greaseweazle" projectet.
Alapvetően egy nagyon jó project, de ez annyit csinál, hogy szabadon paraméterezhető vezérlőt ad a user kezébe. Tetszőleges formátumokat képes létrehozni és azok mentén olvasni a lemezről. Viszont ez sem adja át a vezérlés az OS-nek, hanem a saját programja végzi a műveleteket a beállított paraméterek alapján.
Jó cucc, csak esetemben nem kényelmes. Nekem csak egy "buta" pc fdd kell usb kábelen.De elengedtem, köszönöm.
Szerintem megpróbálom az usb-s fdd vezérlőjét desktop fdd-vel. De ez már nem a topic témája.
-
-
-
lanszelot
addikt
válasz
Tomika86 #20042 üzenetére
Aryes mutatta nekem:
uint32_t lastms= 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
if (millis() - lastms > 1000) {
lastms = millis();
Serial.println(lastms/1000);
}
}ez az időzítő , ebben lévő másodpercenként fut le
ezen kívül van :if (gombNyomas == 1) {
mindenRajtaVan();
} else if (gombNyomas == 2) {
homeroVanRajta();
} else if (gombNyomas == 3) {
gazVanRajta();
}tehát a gombnyomást érzékeli, és a változó értéke megváltozik, viszont 1mp múlva hajtja végre ami az első "if" -ben van
delay, de még sem az, hisz a program nem áll meg
-
lanszelot
addikt
válasz
Tomika86 #20039 üzenetére
Leírtam hogy miért nem lehet úgy megoldani.
Nagy hőkülönbségnél nem azonnal mutatja , hanem kell neki pár masodperc, míg a helyes hőfokot mutatja.
Ekkor nem lesz meg a 270 -es delay.
A hőmérő mérései között minimum 270 ezredmp kell.
Ott van a leírásában.
Tehát minden körülmény között így kell működnie.
Delay nélkül hogy ne kérje le addig a program?
Lehet az is hogy hogy csinálok egy stoppert, és minden 300-al osztható egesz számnál futtatja csak a lekérést.
Ekkor nem áll a program, tehát a gomb fog működni, de eszi a memóriát.
És ez jobb mint amit fent írtak, mert itt tuti nem fog addig lekerni. -
vargalex
félisten
válasz
Tomika86 #19898 üzenetére
Eddig is tiszta volt, hogy mit szeretnél!
Csak a redirect-et - ahogy írtam - a javascript-ből indított ajax hívás nem kezeli le. Ha a böngészőben megnézed Developer módban a Network fület, akkor látni fogod, hogy megkapja a HTTP 302-t (legalábbis a forrás szerint 302 megy vissza), de a böngésző nem kezd vele semmit... Ezt neked kell a javascript kódodban kezelni, ahogy a http 200-at is teszed.
Legalábbis emlékeim szerint nem kezd a redirect-el semmit a böngésző, de amint időm engedi, tesztelem. De a Developer mód Network füle sokat tud segíteni... -
vargalex
félisten
válasz
Tomika86 #19896 üzenetére
ESP oldalról válaszolod az átirányítást (ezt látnod is kell a böngészőben developer módban a network fülön, ahogy minden más választ is), de azt ajax hívás esetén a böngésző nem követi, azaz neked kell a javascript-ben a location-t beállítani. Ennek a résznek nincs köze az esp-hez, tisztán böngésző/javascript működés.
-
vargalex
félisten
válasz
Tomika86 #19892 üzenetére
Nem teljesen értem, mert az átirányítás nincs kezelve az ajax hívásodban. Miért irányítana bárhová a böngésző?
Milyen kiíratott üzenetre gondolsz, hogy nem jelenik meg? A javascript-ből csak az alert megy, semmilyen visszatérő értékkel nem foglalkozol ott... Tehát a jelenlegi kódoddal az alerten kívül más nem is kell, hogy megjelenjen a böngészőben. -
vargalex
félisten
válasz
Tomika86 #19889 üzenetére
Szia!
A
valcheck
és asendInfo
függvényben is független, önállóXMLHttpRequest
objektumot hozol létre. Így asendInfo
-ban elküldött adat nem fogja szerintem kiváltani avalcheck
-ben definiáltXMLHttpRequest onreadystatechange
eseményét. És ugye a sorrend is rossz, előbb kell azonreadystatechange
definiálás, utána a küldés..
Illetve a /size feldolgozásnál a check statustrue
esetén (bár én éppen megcserélném a true-false értékeket, mert így az elnevezéshez képest fordítva működik, azaz igaz esetén hibás, hamis esetén OK) nem http 200-at kellene visszaadni, ha azt szeretnéd, hogy a javascriptonreadystatechange
else ága fusson le.Szóval, szerintem valahogy így kellene (csak részleteket írok):
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if(xhttp.readyState == 4 && xhttp.status == 200) {
alert('Ok status');
}
else {
alert('Invalid status');
}
};
sendInfo(xhttp, file.size);
...
function sendInfo(xmlHttp, size) {
xmlHttp.open("post", "/size");
xmlHttp.send(size);
}
...
if (check_status)
{
request->send(400, "text/plain", "FAIL CONNECTION");
Serial.println("Check status Fail");
}
else {
Serial.println("Check status Ok");
request->send(200);
}
-
Janos250
őstag
válasz
Tomika86 #19820 üzenetére
Nem ástam bele magam az ESPAsyncWebserver rejtelmeibe, nem is tervezem, mert én szeretem "gyalog" megoldani a dolgokat.
Ennek ellenére - mivel a kíbicnek semmi sem drága - azért leírom, hogyan próbálnám
Én így próbálnám meg:t.open("GET","/nextion_update",true)
t.send()
vagy:t.open("GET","/nextion_update="+e.target.result,true)
t.send()
bár annyira nem bogarásztam végig, mi az a e.target.result, gondolom valami érték, amit küldeni akarsz. -
Janos250
őstag
válasz
Tomika86 #17942 üzenetére
Ez csak egy elképzelésem, nem biztos, hogy így van, csak a névből próbálok következtetni.
Először is:
Mitől lesz http szabványú egy elküldött karaktersorozat? (A http mindig karakteres!)
Attól, hogy legelőször egy http headert küld.
Például:HTTP/1.1 200 OK
Content-type:text/html
Connection: closeUtána jönnek az egyebek, azaz a tényleges html kód.
Elsőként a html header, pl.:<!DOCTYPE html>
<html lang = hu >
<head>
<meta charset="UTF-8">
<title>minta WEB szerver</title>
</head>Utána a html body, pl.:
<body>
Ide jön a lap tényleges html kódja
</body></html>Ha a sima WiFiServer osztályt használjuk, akkor saját magunknak el kell küldenünk a http headert is. Aztán van pár féle webserver, httpserver, miegymás osztály, ami elvileg elsőként el kell küldje automatikusan a http headert, ezért elég már csak a tényleges html kódot küldeni. html header + body
Én régebben már számos alkalommal belezavarodtam abba, hogy a különböző emberkék által elkészített webserverek másként, és másként működtek, ezért én leálltam a használatukról, hanem csak a WiFiServer osztályt használom, és saját magam elküldöm a http headert is.Mivel te a WebServer osztály példányát hozod létre,
WebServer nextion_update_server(100);
ezért én úgy gondolom, hogy ennek automatikusan el kellene küldeni a http headert is.
De mint írtam, ezek csak elképzelések.
-
-
Janos250
őstag
válasz
Tomika86 #17919 üzenetére
Én be szoktam rakni a programba, mégpedig általában "R" típusú stringgel, mert akkor a sorváltás, szóköz, stb. is jól látszik.
Itt egy minta az R stringre:
https://prohardver.hu/tema/arduino/hsz_17542-17542.html
Ha kész WEBszervert használsz, akkor persze csak a htmlHeadertől kell.
És ami a loopban a mintában van, az neked nem kell, egész más lesz. -
Tomika86
senior tag
válasz
Tomika86 #17908 üzenetére
Na így jó:
#define Gyujtas 15
#define Led 2
unsigned long aktualis_millis;
unsigned long mentett_millis;
unsigned long ido = 20000;
unsigned long kulonbseg_millis;
byte ido_futott;
byte beleptunk;
void setup() {
pinMode(Gyujtas, INPUT);
pinMode(Led, OUTPUT);
Serial.begin(115200);
}
void loop() {
if ((digitalRead(Gyujtas) == 1) || beleptunk) {
kikapcsolas();
}
Serial.println("Fut a program");
delay(1000);
}
void kikapcsolas() {
beleptunk = 1;
if(ido_futott == 0) {
mentett_millis = millis();
ido_futott = 1;
}
kulonbseg_millis = millis() - mentett_millis;
if (kulonbseg_millis <= ido) {
if (digitalRead(Gyujtas) == 0) {
ido_futott = 0;
beleptunk = 0;
Serial.println("Kilepes");
return;
}
Serial.print("Ido kulonbseg: ");
Serial.println(kulonbseg_millis);
Serial.println("Idozitoben vagyunk");
}
else {
Serial.println("Esp leallas itt");
// deep_sleep();
digitalWrite(Led, HIGH);
}
} -
Tankblock
aktív tag
válasz
Tomika86 #17901 üzenetére
Szia
FreeRTOS esetén pl Queue: [link] lesz az egyik lehetséges megoldás.
Ha Interruptból próbálnád feltölteni, ne feledd a [xQueueSendFromISR] fv használni, vagy szétakadhat.
PRogramban meg QueueMessagesWaiting() fv meg tudod hány elem van a queue ban és a QueueReceive() fvnyel fogsz egyet kiolvasni.....
másik egyszerűbb út az állapotgépeket futatsz egymás után ...
Ha ugye van ign akkor a másik állapotgép is kilép az állapotából -
Janos250
őstag
válasz
Tomika86 #17890 üzenetére
Hát, én külön task-be tenném a két külön feladatot, ami globális változókon keresztül tartaná egymással a kapcsolatot. Ha nincs tennivalója az adott task-nek, azonnal adja is tovább a vezérlést, így nem foglal le lényeges időt. Ha mellesleg még másik magra is teszed, akkor meg végképp nem!
Ha az ESP32 mellett döntöttél, érdemes megtanulni, amit nyújt a két mag, és a C++11 ! Vagy még a FreeRTOS, ha sok az időd, de ennek zöme a C++ -al megoldható. -
válasz
Tomika86 #17896 üzenetére
Ez eddig nem volt feladat
#define Gomb 15
#define Led 2
unsigned long aktualis_millis;
unsigned long mentett_millis;
unsigned long ido = 20000;
unsigned long kulonbseg_millis;
void setup() {
pinMode(Gomb, INPUT);
pinMode(Led, OUTPUT);
Serial.begin(115200);
}
void loop() {
if (!digitalRead(Gomb)) {
mentett_millis = millis();
kikapcsolas();
}
Serial.println("Fut a program");
delay(1000);
}
void kikapcsolas() {
kulonbseg_millis = millis() - mentett_millis;
if (kulonbseg_millis <= ido) {
if (digitalRead(Gomb)) {
Serial.println("Visszalep");
return;
}
Serial.println(kulonbseg_millis);
Serial.println("Leallas idozitoben");
}
else {
Serial.println("Esp leall itt");
// deep sleep
}
} -
fpeter84
senior tag
válasz
Tomika86 #17684 üzenetére
2002 1.9PD AWX, pont Bosch EDC15P+ van benne, úgyhogy érdekelne hogy mi is ez! Ezt azt találtam a neten, de kifejezetten a kommunikációját taglaló leírást még nem... A KWP1281 működik, de találtam rá utalást hogy elvileg KWP2000-et is tudna a vezérlő K-Line-on, illetve van CAN-je is de arról még annyit se találok...
-
Janos250
őstag
válasz
Tomika86 #17602 üzenetére
Az egyik legbiztosabb védelem, ha van egy fizikailag létező kapcsoló, amit csak akkor kapcsolsz be, ha be akarsz rá lépni, egyébként meg nem fogad el belépést. Az is elég jó védelem, ha csak adott MAC című állomásról fogad el belépést. Igaz, ezt minden egyes panelnál, és minden egyes telefon cserénél be kell állítani.
Az "ugró kód" jellegű védelem is hasznos lehet, de ez bonyolultabb, mert hadvert igényel. Esetleg egy SIM kártyás panelka, ami csak adott telefonszámról érkező SMS-re kapcsolja be a belépés engedélyezést, de ezek már mind macera. -
vargalex
félisten
válasz
Tomika86 #17599 üzenetére
Így van és a legnagyobb probléma az, hogy hiába írod át ezeket, úgyis lemennek kliens oldalra. Ezért érdemes egy POST, vagy GET endpointot létrehozni a loginhoz (és persze akkor még egyéb feladatok, pl. session cookie létrehozás is van, amivel ellenőrizni tudod, hogy az adott kliens már authentikált-e). Így az authentikációs adatok csak az arduino kódban vannak meg.
-
válasz
Tomika86 #17594 üzenetére
ha bekapcsolom akkor 1 perc lesz maximum a belépésre és frissítésre, utána kikapcsolom a wifit az esp32-őn, a server handle pedig nem fog futni.
A wifire jelszóval lehet kapcsolódni.
Ez így elég lehet, senki se szeretné, ha egy autó egyszer csak furán kezdene viselkedni, mert vki OTA rátöltött valami random kódot.A böngészőben is belépés van.
Na én erre írtam, hogy olyan, mintha nem is lenne. Akár ki is veheted, felesleges. Bárki megnézi a html forrást, benne van a jelszó. -
válasz
Tomika86 #17592 üzenetére
azért írtad mert odaírtam a kommentben?
Nem tudom milyen komment, csak azt láttam a kódban, hogy a html forrásban benne van a jelszó, ez így nudli. Ha a wifi jelszavas, az OK lehet.
Ha soros portra csatlakoznak akkor letölthető a hexa kód az espről?
Visszafejthető bármivel a kód?Soros portról szinte biztos, hogy nem, de szerintem van mód a kód letöltésére. Nem értek annyira az ESP-hez.
-
válasz
Tomika86 #17589 üzenetére
"Akkor az a kérdés hogy mi az a fájl? A js"
A jQuery-re gondolsz? Az egy internetes svájcibicska, megkönnyíti a webprogramozók munkáját.
Az eredeti kérdésedre válaszolva:
"Sikerült egy normálisan kinéző böngészős OTA-t találni, de soros porton dob egy hibát amikor böngészőben megnyílik a felület.
Ezt dobja: [E][WebServer.cpp:633] _handleRequest(): request handler not foundHogy tudom ezt megtalálni miért dobja?"
Próbáld meg azt, hogy egy "/" jelet teszel a cím végére, mikor lekéred az oldalt az esp-ről:
http://192.168.1.100/De ha jót akarsz, módosítás nélkül ne használd ezt a kódot, legalábbis fontos helyen ne, mert elég durva biztonsági hiba van benne (jelszó a forráskódban, kb mintha cellux-szal a bejárati ajtóra ragasztanád a kulcsot
).
-
válasz
Tomika86 #17509 üzenetére
Szokás, igen. Az AVR automatikusan tiltja is a további megszakításokat (interrupt enabled bit törlése), talán az ESP is, de ennek utána kell járni. Azért kell a megszakítás rutinba a lehető legrövidebb kódot tenni, hogy minél kisebb valószínűséggel maradjon ki miatta egy másik megszakítás.
-
artru60
csendes tag
válasz
Tomika86 #17447 üzenetére
NTC és a mikrokontroller lába között van a 22K ezt bele kell számolni a steinhart képletbe, a linken amit beraktam erről is van szó, meg google is segít. Azt nem tudom, h ez az érték típusfüggő-e. Nem értek az elektronikához, csak programokat írok, de ezt tudom véletlen.
-
artru60
csendes tag
-
Janos250
őstag
válasz
Tomika86 #17433 üzenetére
Csak olyan sallang megjegyzés:
A ciklusból kilépést szebben old meg!
Példának nézd meg a linken az első programot!
http://ctp.mkprog.eu/hu/c%2B%2B/megszakito_utasitas/Az
adc=adc;
sornak semmi értelmét nem látom.
-
And
veterán
válasz
Tomika86 #17409 üzenetére
"Azt ki tudom deríteni valahogyan, hogy a nextion küld e vissza valami hibát?"
Erre való a 0..3 között paraméterezhető bkcmd rendszerváltozó: [link]. Default értéke 2, vagyis hibás soros parancs esetén mindenképpen visszaküld egy byte-ot 0x00..0x23 közötti értékkel, melyek értelmezése a 7. pontban (Format of Nextion Return Data) látható. Ha a bkcmd értéke = 1, akkor csak a sikeres parancsok után küld visszajelzést a Nextion (0x01). Vannak olyan üzenetek is, amelyek nem tilthatóak, tehát a bkcmd = 0 beállítás után is megkapod azokat (0x24-től felfelé, lásd a linkelt oldal alján). -
And
veterán
válasz
Tomika86 #17407 üzenetére
Mármint hogy lehet-e egy picture elem globális? Elvileg igen, de csak egyetlen attribútuma módosítható futás közben a kódból, a .pic elem, a tárolt kép sorszáma. Kérdés, hogy mi lenne a cél. Az eltüntetés / megjelenítés például megvalósítható máshogy is (vis parancs).
Amúgy a p[ ].b[ ].val szekvencia helyett az eredeti néven is elérhető egy globális változó egy másik oldalról (elé kell írni a változót tartalmazó oldalt, pl.: page2.n0.val), de az előbbi indexelős módszerrel scriptből pl. több elem paraméterének vagy értékének módosítása for vagy while ciklusban is megoldható. -
And
veterán
válasz
Tomika86 #17403 üzenetére
"Azt is próbáltam, hogy első ciklusban elküldök minden adatot a kapcsolós oldalra, de ha nem azon vagyok akkor hiába küldöm el."
Milyen formában küldöd olyankor? Megfelelő a változók neve? Mert ugye hiába globális egy változó, ha nem azon az oldalon vagy, amelyiken létrehoztad, akkor az eredeti nevével nem tudsz rá hivatkozni, csak a p[x].b[y].val formátummal, ahol x az oldal sorszáma, y pedig a változó eredeti (a létrehozó oldalon kapott) id-je. -
And
veterán
válasz
Tomika86 #17401 üzenetére
Nálam is nyilván a uC küldi az adatokat, csak más szervezéssel, de nem ettől függ a végeredmény. Biztos megoldható a default parancsküldős módszerrel is + oldalanként szeparált adatokkal, csak akkor késleltetett lesz az oldalváltás (ugye meg kell várni az adott oldal összes változójának beérkezését), vagy mindig az összes adatot el kell küldeni a Nextion felé, oldaltól függetlenül. Emlékeim szerint ezzel volt problémád az elején is, mondván úgy nem lehet túl gyors a frissítés, hosszúra nyúlhat a ciklusidő. Erre írtam akkor, hogy - az egyébkén elég hiányosan dokumentált - reparse-mód lehet erre univerzális megoldás, mert azzal jóval kevesebb adatot kell mozgatni a kontroller és a Nextion közt. Én utóbbinál maradtam, így minden ciklusban beesik egy ugyanakkora, de nem túl terjengős méretű tömb a Nextion vevőpufferébe, amely az összes létező adatot tartalmazza, nem csak azokat, amelyek egy adott oldalon fordulnak elő. Oldalváltáskor ezzel már eleve rendelkezésre áll ad adat pufferben, csak ki kell tenni a megjelenítendő változóba a preinit-ben.
-
And
veterán
válasz
Tomika86 #17399 üzenetére
Én úgy oldottam meg, hogy az adott oldal preinitialize event szekciójában szépen feltöltöttem a változókat megjelenítő mezőket a vételi pufferből ( u[ ] tömbből ) kivett adatokkal. Mondjuk nálam a normál megjelenítés is hasonlóképp történt, csak akkor egy időzítő által indított timer event script végezte ugyanezt. Eleve reparse-módban használtam a kommunikációt, vagyis pufferből halásztam elő az adatokat (master felőli parancsküldés helyett).
Gondolom olyan módon is megvalósítható - alapértelmezett / parancsküldős kommunikáció mellett -, hogy az 'új' oldal változóit globálisként definiálod, és az 'előző' oldal elhagyásakor (page exit event segítségével) azokba beleírod a szükséges értékeket. -
And
veterán
válasz
Tomika86 #17374 üzenetére
Már csak az a kérdés marad, hogy ezekhez ilyen célra minek egyáltalán bármilyen külső ellenállás? Az ESP32 adatlapja szerint a portok nagyobbik része fel- és lehúzásra is programozható (45 / 45 kΩ), az MCP23..-as sorozatnál pedig mind a 8 vagy 16 porton támogatott a belső pull-up (100 kΩ), ha az adatirány inputnak van állítva..
-
And
veterán
válasz
Tomika86 #17372 üzenetére
Látatlanban, a konkrét áramköri részletek ismerete nélkül nehéz meghatározni a 'jó' értéket, de a korábbiak értelmében a tartomány elég tág lehet, inkább csak a nagyságrendet kell belőni. Például egy nagy impedanciás uC bemenetére kötött nyomógomb fel/lehúzója széles ellenállás-tartományban rendben lesz. Ilyen helyen a rajz szerinti 4,7 kΩ simán helyettesíthető 10 kΩ-mal. De mondjuk egy I2C-busz felhúzóinál már necces lehet ekkora eltérés (relatív nagy busztávolság és sebesség esetén különösen).
-
And
veterán
válasz
Tomika86 #17370 üzenetére
Értelemszerűen változik tőle a fel- vagy lehúzóáram. Ezen túl a következőket befolyásolja: bemeneti impedancia ill. áram (ha bemenetet van), kimeneti terhelőáram (ha pl. OC / OD-kimeneten). Alapértelmezett szinttől és az elhúzás irányától függően a nyugalmi fogyasztásra is hatással van, ami telepes / akkus táplálásnál lehet érdekes. A fel- vagy lehúzó értéke általában kompromisszum eredménye: az ellenállás nem lehet túl alacsony a nagy áramigény miatt, de adott körben túl magas sem, mert akkor a feladatát - határozott szintre húzás - sem feltétlenül látja el.
-
-
Tankblock
aktív tag
válasz
Tomika86 #17338 üzenetére
Ha olyan típusút választasz akkor igen.
Amit néztél annak is több verziója van, oylat nézz ami a 1.8V - 5V működik.
Csak Pull-up lehet húzni, ha pull down kell azt kívülről szükséges megoldani.
Van benne interrupt ami hasznos.Sima ledek, optók, stb működtetésére simán. Ha gyorsan kell akkor csakis SPI al.
-
válasz
Tomika86 #17333 üzenetére
Persze, hogy maradhat, csak figyelj, hogy azokat a lábakat jó irányba húzd. Kimeneteket úgy kell tervezni, hogy figyelembe veszed a default állapotát, ha kell, invertálod. Ha csak feltöltésnél okoz gondot, az a könnyebb eset, mert ha egyszer beépítésre kerül, gondolom már nem nagyon fogsz rá feltölteni.
-
Tankblock
aktív tag
válasz
Tomika86 #17329 üzenetére
Szia
nézd meg hogyan is használod, ahogy nézem pont belenyúltál abba a 2 lábba amik a boot meghatározzák:
GPIO2 must also be either left unconnected/floating, or driven Low, in order to enter the serial bootloader.
GPIO12:
If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. Has internal pull-down, so unconnected = Low = 3.3V. May prevent flashing and/or booting if 3.3V flash is used and this pin is pulled high, causing the flash to brownout. See the datasheet for more details.Mi van akkor ha hanyagolod ezen lábakat?
-
-
-
-
-
válasz
Tomika86 #17245 üzenetére
De, az egy rohadt nagy probléma. Én valami ilyesmit csinálnék:
bool ADS7828_olvasas (int Addr_byte, byte Cmd_byte, int *adc) {
byte data[2];
Wire.beginTransmission(Addr_byte); // I2C átvitel indítása, az adott címen
Wire.write(Cmd_byte); // Command byte küldése
Wire.endTransmission(); // I2C átvitel megállítása
Wire.requestFrom(Addr_byte, 2); // 2 byte adatra várakozás
if (Wire.available() == 2) { // Ha megérkezett a 2byte
data[0] = Wire.read(); // Első byte tömbbe írása
data[1] = Wire.read(); // Második byte tömbbe írása
delay(2); // Ciklus késleltetés
*adc = ((data[0] & 0x0F) * 256) + data[1]; // Adat konvertálás 12bit-re
return true;
}
return false;
}De nem ismerem az egész kódot, lehet megoldható szebben.
-
-
Janos250
őstag
válasz
Tomika86 #17229 üzenetére
Az ESP32-höz tartozó main.cpp része:
void loopTask(void *pvParameters)
{
setup();
for(;;) {
if(loopTaskWDTEnabled){
esp_task_wdt_reset();
}
loop();
if (serialEventRun) serialEventRun();
}
}Vagyis:
Meghívja a setup függvényt egyszer, majd egy végtelen for ciklusban a loop() függvényt.
Ha a setupba teszel valamit, annak egyszer le kell futnia.
Én továbbra is időzítési problémára gyanakszom, bár gyanús, hogy fgv nélkül megy. -
Janos250
őstag
válasz
Tomika86 #17220 üzenetére
Hát, a lényegét nem sikerült elkapni! :-(
Az csak egy megjegyzés volt, hogy minek írsz négy sort, amikor egy is elég. Rövidebb is, memóriában is kevesebbet foglal. Hogy azt az egy sort közvetlenül írod be, vagy függvénybe teszed, nem lényegi kérdés."Ha már a program legvégén deklarálom a függvényt, és csak meghívom a setup blokkból, akkor nem csinálja meg. "
Ha függvény hívását később a loopba teszed, akkor megy?
Le kéne írni, hogyan deklaráltad, és hogyan hívtad, hogy valami fogalmunk legyen, hogy mi a kérdés.
Mi az, hogy nem csinálja? Lefordítja hibajelzés nélkül, csak nem hajtja végre?
Van elég várakozás az elején, hogy minden talpra álljon?
A Serial2 beginje megvolt előtte? Van utána elég várakozás?
A képernyőt nem kell inicializálni ?
Új hozzászólás Aktív témák
Hirdetés
- Vásárold meg most a Zalman T7-et, és élvezd a minőséget!
- Samsung Galaxy A13 64GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone Ryzen 5 5600X 16/32/64GB RAM RX 7600XT 16GB GAMER PC termékbeszámítással
- AKCIÓ! AMD Ryzen 9 3900X 12 mag 24 szál processzor garanciával hibátlan működéssel
- Bomba ár! Dell Latitude 5500 - i5-8GEN I 8GB I 256SSD I HDMI I 15,6" FHD I Cam I W11 I Garancia!
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest