- Nem indul és mi a baja a gépemnek topik
- TCL LCD és LED TV-k
- Gaming notebook topik
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- NVIDIA GeForce RTX 4060 / 4070 S/Ti/TiS (AD104/103)
- Computex 2024: Itt az új ROG Ally
- Nikon Z MILC fényképezőgépcsalád
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Azonnali processzoros kérdések órája
- Milyen egeret válasszak?
Hirdetés
-
Megtévesztő AI-kampányok ellen küzd az OpenAI
it Egyre több a megtévesztő tevékenység és kampány, ami az AI segítségével készül – néhányat már elkapott az OpenAI.
-
Nem kap több frissítést a Wolcen: Lords of Mayhem
gp Szeptembertől a többjátékos mód már nem lesz elérhető.
-
Computex 2024: Itt a Strix Pointra épülő Zenbook S 16
ph Az AMD új, Ryzen AI 300 sorozatára épül a most bemutatott, 16 hüvelykes, rendkívül vékony noteszgép.
-
PROHARDVER!
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
-
Tomika86
senior tag
Megpróbálom mégegyszer:
loop {
.
.
.
.
if (!digitalRead(Gyujtas))
{
kikapcsolas();
}
.
.
.
.
.
}
void kikapcsolas() {
fuggveny_1();
....
idozito 20másodpercig
Ha a 20sec letelt akkor: függvény_2(ebben lesz a deep_sleep())
Ha a kikapcsolas függvényben bárhol digitalRead(Gyujtas)
akkor fuggveny_3 aztán kikapcsolas() függvényből kilépés
}És ha a kikapcsolas függvénybe újra belépünk akkor a 20sec induljon újra
-
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[ Szerkesztve ]
Release the Beast....
-
Tomika86
senior tag
Hát végül összeraktam, elég nyakatekert, de működik.
Soros kiírasok a szimulátor miatt van.
[link][ Szerkesztve ]
-
gordonfreemN
addikt
Üdv!
Azt szeretném kérdezni, szerintetek megolható-e atmegával meg egy beszerezhető kijelzővel hasonló kivezérlés kijelző?
[link]
0:30-tól¯\_(ツ)_/¯ ▁ ▂ ▃ ▅ ▆ ▇ Üdv, Andris.
-
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);
}
} -
nagyúr
válasz gordonfreemN #17909 üzenetére
Én inkább RGB ledekkel próbálnám megcsinálni, a videón látható mütyür is azzal van megoldva. Ügyes megoldás, az optikai részét nem tudom hogy csinálták.
Egy LCD kijelző, vagy inkább színes OLED is szóba jöhetne amúgy, de feleslegesen nagy kellene belőle, és nem biztos, hogy ugyanolyan flowless lenne a látvány, ezeknek a képrissítése nem túl gyors.
-
nagyúr
válasz gordonfreemN #17912 üzenetére
Hát annyi ötletem lenne, hogy egyénileg címezhető ws2812 RGB LED-eket kellene sűrűn egymás mellé applikálni egy PCB-re, mert ennyire sűrű LED szalagot gyárilag nemigen csinálnak.
Nem tudom mekkorára szeretnéd csinálni a kijelzőt, a legsűrűbb a 144LED/m, ott kb. 7mm egy osztás, akkor 10cm-re 14/15 LED jut. Arra kell tenni mondjuk egy polikarbonát csíkot, aminek a hátoldala fel van csiszolva, hogy szórja a fényt, és akkor egybefüggő csíknak fog látszani kívülről. Ez jutott eszembe.A kijelzős megoldást én nem vetném el abban az esetben, ha piciben szeretnéd elkészíteni, egy 4-5cm hosszú színes OLED kijelző erre pont jó lenne, viszont nagyobban azért nem érdemes, mert ilyen hosszúkás kijelzőt nemigen gyártanak, és a hosszával együtt a szélessége is nő, na meg az ára is, hatványozottan.
[ Szerkesztve ]
-
gordonfreemN
addikt
Na, köszi de akkor végül csak a kijelző lesz, mert bár én se ecseteltem, de 60mm-ben maximalizálnám a dolgot. Szolidra szeretném az előlapon, nem meghatározóra.
De amúgy a ledes se hülyeség, bár hogy milyen kicsi a lépték azt nehéz lenézni.
Mindenesetre oled-et ily módon tudnék vezérelni atmegával?¯\_(ツ)_/¯ ▁ ▂ ▃ ▅ ▆ ▇ Üdv, Andris.
-
nagyúr
válasz gordonfreemN #17914 üzenetére
Elméletileg semmi akadálya, de utána kell nézni, hogy 5V-os jelszinttel kompatibilis-e a választott kijelző, mert ezek jellemzően 3,3V-ról üzemelnek inkább. De ez amúgy nem fog akadályt jelenteni, csak ha olyan, akkor kell hozzá szintillesztés.
Itt egy példa, hogy hogy kell ezt elképzelni (a kijelző itt egész pici, csak 0.95"-os): https://www.electronics-lab.com/project/color-oled-ssd1331-display-arduino-uno/update:
Itt egy kijelző kimondottan Arduino Mega board-hoz: [link]. Szerintem kompatibilis az Uno GPIO tüskesorával is, de lehet maga a board kevés lesz (pl. kevés a RAM) a driveréhez.[ Szerkesztve ]
-
Tomika86
senior tag
Sziasztok!
Ha valakinek kellene:
[link]Nextion kijelzőre .tft fájl feltöltése ESP32-n keresztül, WIFI kapcsolattal
-
Janos250
őstag
válasz Tomika86 #17916 üzenetére
Szerintem írd oda azt is, hogy
ESP8266 & ESP32 library for uploading .tft files to the Nextion display over serial
hogy ha valaki évek múlva keres rá, akkor is megtalálja!Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Tomika86
senior tag
válasz Janos250 #17917 üzenetére
Már szerkeszteni nem tudtam
Szeretnék egyet kérdezni, ha tud valaki segíteni ebben.
Van ebben a könyvtárban webserveres példaprogram.Viszont én már az ESP32 ota feltöltéshez is azt használok, ebbe belezavar ha most a kijelzőét is beletenném a programba?
Ezek első blikkre mindkettőben ott vannak
MDNS.begin(host);
WebServer server(80);
server.begin();
server.handleClient();Nextion upload webserver
#include <FS.h>
#include <WiFi.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <SPIFFS.h>
#include <ESPNexUpload.h>
/*
ESP32 uses Hardware serial RX:16, TX:17
Serial pins are defined in the ESPNexUpload.cpp file
*/
const char* ssid = "your_wlan_ssid";
const char* password = "your_wlan_password";
const char* host = "nextion";
// used only internally
int fileSize = 0;
bool result = true;
// init Nextion object
ESPNexUpload nextion(115200);
WebServer server(80);
String getContentType(String filename){
if(server.hasArg(F("download"))) return F("application/octet-stream");
else if(filename.endsWith(F(".htm"))) return F("text/html");
else if(filename.endsWith(".html")) return F("text/html");
else if(filename.endsWith(F(".css"))) return F("text/css");
else if(filename.endsWith(F(".js"))) return F("application/javascript");
else if(filename.endsWith(F(".png"))) return F("image/png");
else if(filename.endsWith(F(".gif"))) return F("image/gif");
else if(filename.endsWith(F(".jpg"))) return F("image/jpeg");
else if(filename.endsWith(F(".ico"))) return F("image/x-icon");
else if(filename.endsWith(F(".xml"))) return F("text/xml");
else if(filename.endsWith(F(".pdf"))) return F("application/x-pdf");
else if(filename.endsWith(F(".zip"))) return F("application/x-zip");
else if(filename.endsWith(F(".gz"))) return F("application/x-gzip");
return F("text/plain");
}
bool handleFileRead(String path) { // send the right file to the client (if it exists)
Serial.print("handleFileRead: " + path);
if (path.endsWith("/")) path += "index.html"; // If a folder is requested, send the index file
String contentType = getContentType(path); // Get the MIME type
String pathWithGz = path + ".gz";
if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) { // If the file exists, either as a compressed archive, or normal
if (SPIFFS.exists(pathWithGz)) // If there's a compressed version available
path += ".gz"; // Use the compressed verion
File file = SPIFFS.open(path, "r"); // Open the file
size_t sent = server.streamFile(file, contentType); // Send it to the client
file.close(); // Close the file again
Serial.println(String("\tSent file: ") + path);
return true;
}
Serial.println(String("\tFile Not Found: ") + path); // If the file doesn't exist, return false
return false;
}
// handle the file uploads
bool handleFileUpload(){
HTTPUpload& upload = server.upload();
// Check if file seems valid nextion tft file
if(!upload.filename.endsWith(F(".tft"))){
server.send(500, F("text/plain"), F("ONLY TFT FILES ALLOWED\n"));
return false;
}
if(!result){
// Redirect the client to the failure page
server.sendHeader(F("Location"),"/failure.html?reason=" + nextion.statusMessage);
server.send(303);
return false;
}
if(upload.status == UPLOAD_FILE_START){
Serial.println(F("\nFile received. Update Nextion..."));
// Prepare the Nextion display by seting up serial and telling it the file size to expect
result = nextion.prepareUpload(fileSize);
if(result){
Serial.print(F("Start upload. File size is: "));
Serial.print(fileSize);
Serial.println(F(" bytes"));
}else{
Serial.println(nextion.statusMessage + "\n");
return false;
}
}else if(upload.status == UPLOAD_FILE_WRITE){
// Write the received bytes to the nextion
result = nextion.upload(upload.buf, upload.currentSize);
if(result){
Serial.print(F("."));
}else{
Serial.println(nextion.statusMessage + "\n");
return false;
}
}else if(upload.status == UPLOAD_FILE_END){
// End the serial connection to the Nextion and softrest it
nextion.end();
Serial.println("");
//Serial.println(nextion.statusMessage);
return true;
}
}
void setup(void){
Serial.begin(115200);
Serial.println(F("\nRunning UploadServer Example\n"));
Serial.setDebugOutput(false);
if(!SPIFFS.begin()){
Serial.println(F("An Error has occurred while mounting SPIFFS"));
Serial.println(F("Did you upload the data directory that came with this example?"));
return;
}
//WIFI INIT
Serial.printf("Connecting to %s\n", ssid);
if (String(WiFi.SSID()) != String(ssid)) {
WiFi.begin(ssid, password);
}
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print(F("\nConnected! IP address: "));
Serial.println(WiFi.localIP());
MDNS.begin(host);
Serial.print(F("http://"));
Serial.print(host);
Serial.println(F(".local"));
//SERVER INIT
server.on("/", HTTP_POST, [](){
Serial.println(F("Succesfully updated Nextion!\n"));
// Redirect the client to the success page after handeling the file upload
server.sendHeader(F("Location"),F("/success.html"));
server.send(303);
return true;
},
// Receive and save the file
handleFileUpload
);
// receive fileSize once a file is selected (Workaround as the file content-length is of by +/- 200 bytes. Known issue: https://github.com/esp8266/Arduino/issues/3787)
server.on("/fs", HTTP_POST, [](){
fileSize = server.arg(F("fileSize")).toInt();
server.send(200, F("text/plain"), "");
});
// called when the url is not defined here
// use it to load content from SPIFFS
server.onNotFound([](){
if(!handleFileRead(server.uri()))
server.send(404, F("text/plain"), F("FileNotFound"));
});
server.begin();
Serial.println(F("\nHTTP server started"));
}
void loop(void){
server.handleClient();
} -
Tomika86
senior tag
A 3 html fájlt belerakhatom Stringként a forráskódba, át kellene alakítani hozzá. Vagy így a jobb ha fájlként fel van töltve az esp32-re?
Esp32 ota programban benne vannak a forráskódban.
A szerveres dolgot átgondoltam
-
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.[ Szerkesztve ]
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Janos250
őstag
válasz Tomika86 #17921 üzenetére
Teheted a progmembe is, ha szűkösen vagy a memóriában. Teljesen mindegy, úgyse használod túl gyakran. Nem is tudom, miért írtam be oda a progmemet. Tulajdonképpen azt se nagyon tudom, mit hova rak. Lehet, hogy a konstansokat eleve oda rakja.
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Tomika86
senior tag
válasz Janos250 #17922 üzenetére
Köszönöm a választ!
És ha jól gondolom ezek is csak azért vannak, hogy az spiffs-ről beolvassa a tartalmakat.
String getContentType(String filename){
if(server.hasArg(F("download"))) return F("application/octet-stream");
else if(filename.endsWith(F(".htm"))) return F("text/html");
else if(filename.endsWith(".html")) return F("text/html");
else if(filename.endsWith(F(".css"))) return F("text/css");
else if(filename.endsWith(F(".js"))) return F("application/javascript");
else if(filename.endsWith(F(".png"))) return F("image/png");
else if(filename.endsWith(F(".gif"))) return F("image/gif");
else if(filename.endsWith(F(".jpg"))) return F("image/jpeg");
else if(filename.endsWith(F(".ico"))) return F("image/x-icon");
else if(filename.endsWith(F(".xml"))) return F("text/xml");
else if(filename.endsWith(F(".pdf"))) return F("application/x-pdf");
else if(filename.endsWith(F(".zip"))) return F("application/x-zip");
else if(filename.endsWith(F(".gz"))) return F("application/x-gzip");
return F("text/plain");
}
bool handleFileRead(String path) { // send the right file to the client (if it exists)
Serial.print("handleFileRead: " + path);
if (path.endsWith("/")) path += "index.html"; // If a folder is requested, send the index file
String contentType = getContentType(path); // Get the MIME type
String pathWithGz = path + ".gz";
if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) { // If the file exists, either as a compressed archive, or normal
if (SPIFFS.exists(pathWithGz)) // If there's a compressed version available
path += ".gz"; // Use the compressed verion
File file = SPIFFS.open(path, "r"); // Open the file
size_t sent = server.streamFile(file, contentType); // Send it to the client
file.close(); // Close the file again
Serial.println(String("\tSent file: ") + path);
return true;
}
Serial.println(String("\tFile Not Found: ") + path); // If the file doesn't exist, return false
return false;
} -
Wolfram
aktív tag
Vettem egy kínai noname betörés riasztót, az a gond vele hogy túl hangos és nincs rajta hangerőszabályzó.
Mekkora tudás kell a hangerő szabályozhatóvá tételéhez?
Ha posztolok egy képet a belsejéről valaki elmagyarázza melyik kábelt kell elvágni? -
nagyúr
válasz Wolfram #17924 üzenetére
A fotó mindenképp segít, ha itt nem is, a hobbielektronika topikban biztosan tudnak az alapján segíteni.
Látatlanban annyit tudok javasolni, hogy ragaszd le valamivel a hangszóróját, ehhez elektronikai ismeret sem kell, csak szigszalag.
De amúgy hogy lehet egy riasztó túl hangos?
-
Krilehor
tag
Sziasztok.
Kezdő vagyok és segítséget szeretnék kérni. Vagy egy 868.4MHz-en működő rádiós mélyládám (Canton Sub 1200R) amit egy Logitech Harmony Elite távirányítóval szeretnék vezérelni, ami csak infrát ismer. Értelmezésem szerint nekem egy IR-RF gatewayt kellene építenem. Amit kezdésnek gondoltam beszerezni:
- Arduino Uno (Rev3)
- WiFi Module: ESP8266
- Radio module: RFM69HCW vagy AR-LORA-868 vagy egyéb? (itt nekem elég max 10m-es hatótáv)
- valami IR LED és IR receiver
- ha kész akkor mondjuk egy Arduino Nano-ra ráforrasztani és valami házba betenni?WiFi modulet azért gondoltam, hogy weben keresztül is meg lehessen nézni az aktuális állapotot, esetleg még vezérelni is. Ahogy néztem cikkeket, ez evvel a modullal meg is oldható
Rádió modullal valahogy dekódolni is kellene majd a távirányító kódjait, remélem ezt valamilyen libbel meg lehet oldani, legvégső esetben olvastam manuálisan is kivitelezhető
Amiket kinéztem jó irány lenne? Főként a 868MHz-es rádió modulnál vagyok elég bizonytalan, mert mindenhol a 433MHz-ról vannak tutorialok.
[ Szerkesztve ]
-
nagyúr
válasz Wolfram #17929 üzenetére
Sajnos én az analóg részhez nem annyira értek, de egy 10kΩ megfelelő lehet a feladatra. Annyi gond lehet, hogy a poti egyik végállásában rövidre tudja zárni a két pólust, ami tönkreteheti a végfokot, tehát szükség lesz még egy védő ellenállásra.
Kevésbé veszélyes megoldás lenne a fixre beforrasztott, 2db ellenállásból álló feszültségosztó, hátránya, hogy nem állítható így a hangerő, csak a tagok cseréjével. -
its_grandpa
tag
válasz Krilehor #17928 üzenetére
Ez egy nagyon nehéz feladat szerintem. Számtalan rádiós protokoll van, a pontos frekvencia ismerete kevés. Próbálkoztam sokat 868 Mhz kapcsoló vezérlésével RFM22-es modullal.
Kellene egy usb-s RTL-SDR vevő és akkor az RTL_433-al talán ki lehet deríteni a kódolás módját (https://github.com/merbanan/rtl_433).
Az RFM69 (és sok más egyéb) vezérlését, protokollokat meg tudod nézni itt https://www.airspayce.com/mikem/arduino/RadioHead/index.html.Én inkább megpróbálnám kiváltani a rádiós vezérlést.
Számtalan eszköz decodere megtalálható de sajnos a tiéd (vagy ahhoz hasonló) nem.
https://triq.org/explorer/ -
nagyúr
válasz Krilehor #17928 üzenetére
Ha jól gugliztam utána, nem túl komplikált/sok funkciós a távirányítója, esetleg meg lehetne próbálni a távirányítót szétszedni és a kontaktusokra egy-egy vezetéket forrasztva egy ESP32-ről közvetlenül vezérelni azt (emulálni a gombnyomásokat).
Tudsz esetleg szerezni hozzá egy másik távirányítót (hogy ne az eredetit tedd tönkre)? -
Harcipocok84
junior tag
Arduino Nano-t szeretnék ISCP porton keresztül programozni.
USBasp eszközöm van, és BitBurner a program.
Arduino Mega 2560-at simán tudok vele programozni, de a Nano-t nem. Azt írja hogy nincs kapcsolat. A Bitburner-t pedig átállítottam atmega328P-re.
Mi lehet a probléma? -
Krilehor
tag
válasz its_grandpa #17931 üzenetére
its_grandpa és #17932Aryes köszi a válaszokat.
Megpróbálkozom a dekódolással. Ha nem sikerülne, akkor manuálisan egy ilyen és az ebben a threadben említett megoldással még kivitelezhető lenne azért szerintetek? -
its_grandpa
tag
válasz Krilehor #17940 üzenetére
Szerintem nem de még nem ittam meg a második kávémat
Ez a Canton 1200 a 868.4 Mhz-n kommunikál, gondolom azért, hogy a sokkal nagyobb számú 433 Mhz-s eszköz még véletlenül se vezérelje.
Azt kellene kiderítened milyen vezérlő IC van benne. Ezután könnyebb lenne találni hozzá valamilyen vezérlést pl. infrást (google -> diy ir remote volume control).szerk. ekkold munkásságát ismerve (és elismerve) biztos tudna valami megoldást.
[ Szerkesztve ]
-
Tomika86
senior tag
Sziasztok!
Átírtam és kommenteztem a Nextion webserveres feltöltést. Az átalakítás oka, hogy a programkódban legyen a 3db html oldalkód, eredetileg SPIFFS-re volt feltöltve.
Lenne kérdésem ezzel kapcsolatban:
- Mi a különbség, hogy send vagy sendHeader (csak mert eredetileg a sendHeader küldte)
- Ez így jó e?
Eredetileg így volt://server.sendHeader(F("Location"),"/failure.html?reason=" + nextion.statusMessage);
Erre írtam át (itt is látni, eredetileg senHeader volt):nextion_update_server.send(200, "text/html", "failure_html?reason=" + nextion.statusMessage);
- Ez így a kiválasztott fájl méretét adja a programnak át, jó így?// Fogadjuk a fájl méretét egyszer, amikor kiválasztjuk a fájlt.
nextion_update_server.on("/fs", HTTP_POST, [](){ // Ez mit jelent? "/fs"
fileSize = nextion_update_server.arg(F("fileSize")).toInt(); // "fileSize" a weboldalról jön
nextion_update_server.send(200, F("text/plain"), "");
});Köszönöm a segítséget!
Itt a teljes kód, loop nélkül:
#include <WiFiClient.h>
#include <ESPmDNS.h>
#include <WebServer.h>
#include <ESPNexUpload.h>
/*
ESP32 használja a hardveres soros portot RX:16, TX:17
Soros port pinek ESPNexUpload.cpp fájlban vannak definiálva
*/
// Wifi adatok
const char *host = "ezaz"; // Host név beállítása
const char *ssid = "ESP"; // Hálózati azonosító név beállítása
const char *password = "xxx"; // Kapcsolódáshoz jelszó
IPAddress local_ip(192,168,10,150); // ESP32 IP cím beállítása
IPAddress local_mask(255,255,255,0); // Maszk cím beállítása
IPAddress gateway(192,168,10,150); // Átjáró cím beállítása
// used only internally
int fileSize = 0;
bool result = true;
// Nextion objektum létrehozása
ESPNexUpload nextion(115200);
// Webserver objektum létrehozása a megadott portszámmal
WebServer nextion_update_server(100);
// Hiba oldal
char failure_html[] = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
<title>Nextion kijelző frissítő</title>
<script>
function getUrlVars() { // Ez mit csinál?
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
function setReason() { // Ez adja át a reason értékét a weboldalra?
var reason = getUrlVars()["reason"];
document.getElementById("reason").innerHTML = decodeURIComponent(reason);
}
</script>
</head>
<body onLoad="setReason()">
<h2>Frissítés sikertelen!</h2>
Üzenet: <strong><span id="reason"></span></strong>
</body>
</html>
)=====";
// Index oldal
char index_html[] = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>Nextion kijelző frissítő</title>
</head>
<body>
<h3>Válaszd ki a .tft fájlt a feltöltéshez</h3>
<form method="post" enctype="multipart/form-data">
<input type="file" name="name" onchange="valSize(this)">
<input id="button" type="submit" value="Feltöltés és frissítés" disabled>
</form>
<script>
function valSize(file){ // megszerezzük a kiválasztott fájl méretét és elküldjük az ESP-nek
var fs = file.files[0].size;
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200) { // Ha az ESP megkapta a fileSize-t akkor engedélyezzük a gombot(Feltöltés)
document.getElementById("button").disabled = false;
}
};
xhttp.open("POST", "/fs", true); // Ez a 3 sor mit csinál?
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("fileSize="+fs);
}
</script>
<p>A frissítés sokáig tarthat, ha nagy a .tft fájl. Ellenőrizd a feltöltés folyamatát a kijelzőn.</p>
</body>
</html>
)=====";
// Sikeres oldal
char success_html[] = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
<title>Nextion kijelző frissítő</title>
</head>
<body>
Frissítés sikeres!
</body>
</html>
)=====";
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Fájl feltöltés kezelés
bool handleFileUpload() {
HTTPUpload& upload = nextion_update_server.upload(); // HTTP alapú fájl feltöltés
if (!upload.filename.endsWith(F(".tft"))) { // Ellenőrizzük, hogy a fájl .tft végű-e
nextion_update_server.send(500, F("text/plain"), F("CSAK .TFT FÁJL ENGEDÉLYEZETT!\n")); // Ha nem akkor hibaüzenet kiiratása
return false; // Visszatérési érték flase
}
if (!result) { // Ha result értéke hamis
nextion_update_server.sendHeader("Connection", "close"); // Átirányítjuk a failure.html oldalra a klienst
nextion_update_server.send(200, "text/html", "failure_html?reason=" + nextion.statusMessage); // reason hogy megy innét át a html fájlba? Így jó?
//server.sendHeader(F("Location"),"/failure.html?reason=" + nextion.statusMessage); // Ezt hogy tudom a felső sorba beírni?
return false; // Visszatérési érték false
}
if (upload.status == UPLOAD_FILE_START) { // upload.status értékét vizsgáljuk, értéke 0
Serial.println(F("\nFajl fogadva. Nextion frissitese..."));
result = nextion.prepareUpload(fileSize); // Előkészítjük a Nextion kijelző soros küldéshez és elküldjük a fájl pontos méretét
if (result) { // Ha készen áll a Nextion kijelző a fogadásra
Serial.print(F("Feltoltes inditasa. A fajl merete: "));
Serial.print(fileSize); // Fájl méretének kiírása
Serial.println(F(" bytes"));
}
else {
Serial.println(nextion.statusMessage + "\n"); // Ha végzett akkor kiiratjuk a státusz üzenetet
return false; // Visszatérési érték false
}
}
else if (upload.status == UPLOAD_FILE_WRITE) { // upload.status értékét vizsgáljuk, értéke 1
result = nextion.upload(upload.buf, upload.currentSize); // Írjuk a fogadott byte-kat a Nextion kijelzőbe
if(result) {
Serial.print(F(".")); // Amíg a feltöltés tart, addig pontokat iratunk ki
}
else {
Serial.println(nextion.statusMessage + "\n"); // Ha végzett akkor kiiratjuk a státusz üzenetet
return false; // Visszatérési érték false
}
}
else if (upload.status == UPLOAD_FILE_END) { // upload.status értékét vizsgáljuk, értéke 2
nextion.end(); // Soros kapcsolat bontása és Nextion szoftveres újraindítása
Serial.println("");
Serial.println(nextion.statusMessage); // Kiratjuk a státusz üzenetet
return true; // Visszatérési érték true
}
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup(void) {
Serial.begin(115200);
WiFi.mode(WIFI_AP); // WIFI Access Point módba állítása
WiFi.softAP(ssid, password, 1, 0, 1); // WIFI konfiguráció: SSID és Jelszó, csatorna, rejtett ssid, maximum csatlakozható eszközök
delay(500); // Késleltetés
WiFi.softAPConfig(local_ip,gateway,local_mask); // IP címek beállítása
Serial.print("AP neve ");
Serial.println(ssid); // SSID kiírása
Serial.print("IP cim: ");
Serial.println(WiFi.softAPIP()); // IP cím kiírása
if (!MDNS.begin(host)) {
while (1) {
delay(1000);
}
}
// Szerver inicializálás
nextion_update_server.on("/", HTTP_POST, [](){
Serial.println(F("Succesfully updated Nextion!\n")); // Sikeres Nextion frissítés kiiratása soros monitoron
nextion_update_server.sendHeader("Connection", "close");
nextion_update_server.send(200, "text/html", success_html); // Átirányítjuk a klienst a sikeres oldalra, miután kezeltük a fájl feltöltést
return true;
},
handleFileUpload // Fogadás és fájl mentése kijelzőre
);
// Fogadjuk a fájl méretét egyszer, amikor kiválasztjuk a fájlt.
nextion_update_server.on("/fs", HTTP_POST, [](){ // Ez mit jelent? "/fs"
fileSize = nextion_update_server.arg(F("fileSize")).toInt(); // "fileSize" a weboldalról jön
nextion_update_server.send(200, F("text/plain"), "");
});
nextion_update_server.begin();
Serial.println(F("\nHTTP szerver elinditva"));
} -
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.
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
Tomika86
senior tag
válasz Janos250 #17943 üzenetére
sendHeader részeket kivettem.
Jelenleg kijelző nélkül próbálom, az index_html is bekerült így van kezdőoldal.
Működik a fájl méret átküldés is.
A nem .tft fájl üzenet működikDe a failure nem megy, illetve a reason se működik.
Ebben esetleg tudsz segíteni hogy kellene?nextion_update_server.send(200, "text/html", "failure_html?reason=" + nextion.statusMessage);
Köszönöm!
-
Tomika86
senior tag
Csináltam képeket, hogy mit is csinál, hátha észrevesz valaki valamit benne, pastebinre feltettem a kódot.
- ip cím/nextion beírásakor bejön az index oldal
- aktív lesz a feltöltés gomb is(kód szerint csak akkor ha az esp megkapja a fájl méretet)
- ha rányomok akkor megjelenik a fájl méret tehát belép a soros kiiratáshoz
- mivel nincs rákötve a kijelző, így a hibához lép a programban(statusmessage is megjelenik a soros monitoron), de a failure_html már nem töltődik be. 102. sor
- a weboldal elkezd gondolkodni és hibát ad egy idő után (soros monitoron pedig odalép ahol meghívná 105.sor soros kiiratás)Innét viszont a böngészővel hiába lépek az index oldalra, mindig az Error-t írja csak.
(csak .tft fájl hibaüzenet működik, de itt is megáll a server, hiába lépek a kezdőlapra)Köszönöm a segítséget!
Itt a pastebin:
teljes kód[hiba üzenet soros monitoron]
[gomb megnyomva]
[index és fájl kiválasztva]
[index kép][ Szerkesztve ]
-
Janos250
őstag
válasz Tomika86 #17945 üzenetére
Én most nem érek rá foglalkozni vele, de én ilyenkor azt szoktam csinálni, hogy egy másik ESP32 lesz a "cél" és akkor pontosan látom, hogy mit küld a program, abból látszik, mi nem jó benne.
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
tonermagus
aktív tag
Sziasztok!
Logikai szintillesztéssel kapcsolatban lenne egy kérdésem.
Használok egy modult, amivel TTL-UART-on kommunikálok.
A modul 3,3 -ról az ardu 5V-ról megy. A vissziránnyal nincs gond, mert gondolom a 3,3V-ról üzemelő modul által küldött high level megüti az 5V-os logikai bemenet high szintjét. Az oda irány viszont necces, mert ha 5V-ot kap a 3,3V-os bemenet abból lehet probléma.
Tudom hogy kaphatóak logikai szintillesztő modulok, de ha szerintetek az esetemben elég csak az oda irányt korlátozni 2 ellenállással (feszültségosztó) akkor inkább azt választanám. -
Tomika86
senior tag
válasz its_grandpa #17948 üzenetére
Ez a lényeg, a kijelző nincs csatlakoztatva, ezért írja a hibát soros monitoron.
Így tudom tesztelni hogy bejön e a failure oldal.
Az a furcsak hogy elötte, és a send utáni sorban lévő serial.printet is kiírja, result 0val egyenlő, tehát odalép
De valamiért a server.send üzenet nem kerül végrehajtasra.
Lehet azért mert az index oldal van betöltve és elkezd "gondolkodni" a böngésző, megy a karika körbe amikor az upload gombot megnyomom.Ha csatlakoztatom a kijelzőt akkor végigcsinálja a kijelzőn a folyamatot és átvált a success oldalra.
Köszönöm
[ Szerkesztve ]
Új hozzászólás Aktív témák
- Nem indul és mi a baja a gépemnek topik
- TCL LCD és LED TV-k
- Gaming notebook topik
- Hálózati / IP kamera
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- potyautas: Miért olyan drága?
- Politika
- NVIDIA GeForce RTX 4060 / 4070 S/Ti/TiS (AD104/103)
- Parfüm topik
- Kerékpárosok, bringások ide!
- További aktív témák...
- LG OLED55C27LA 2 Év Gyári Garancia
- iPad 8th 32GB wifi dobozos megkímélt akku 94%
- Toshiba Tecra Z40-C, 14" HD Kijelző, I5-6200U, 8-16GB DDR3, 500GB HDD, WIN 10, Számla, garancia
- Lenovo Thinkpad X220, 12,5" HD Kijelző, I5-2540M, 8-16GB DDR3, 160GB HDD, WIN 10, Számla, garancia
- Lenovo Thinkpad S540, 15,6" FHD Kijelző, I5-4210U, 8-16GB DDR3, 500GB SSHD, WIN 10, Számla, garancia
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs