-
GAMEPOD.hu
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
-
vargalex
félisten
Sziasztok!
Néhány helyen ESP8266-okkal kellene optocsatolós relét kapcsolnom (természetesen 230V-os eszköz kapcsolása a cél). Van egy felesleges 2 csatornásom, de ez 5V-os, így az ESP8266 GPIO-t HIGH-ba kapcsolva zárva marad a relé. Tudnátok ajánlani valami bevált példányt, ami vezérléséhez elég a 3.3V? (Ebay, Ali, stb. link tökéletes lenne.)
[ Szerkesztve ]
Alex
-
vargalex
félisten
-
vargalex
félisten
válasz ngabor2 #5326 üzenetére
Gondolom a páratartalmat úgyis a loop-ban figyeled, akkor már célszerű szerintem ott kezelni az idő szerinti relé kapcsolást is. Megvizsgálod az aktuális időpontot, ha olyan és alacsony állásban van a GPIO kimenet, akkor magasra húzod, ha pedig nem és magasban van, akkor alacsonyra. Vagy fordítva a relé bekötésétől/működésétől függően.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz ngabor2 #5328 üzenetére
Nem tudom, hogy milyen RTC függvénykönyvtárat használsz, de pl. ebből kiindulva elsőre valami ilyesmire gondolnék:
time_t t = now();
if ((weekday(t)>1 && weekday(t)<6 && ((hour(t)==7 && minute(t)>29) || (hour(t)>7 && hour(t)<21))) ||
((weekday(t)==1 || weekday(t)==6) && hour(t)>8 && hour(t)<21)) {
if (digitalRead(GPIO_NUM) == LOW) digitalWrite(GPIO_NUM, HIGH);
}
else {
if (digitalRead(GPIO_NUM) == HIGH) digitalWrite(GPIO_NUM, LOW);
}Nem fordítottam, így a hibákat nem zárom ki.
Szerk.: Ha nem menne az output módú GPIO PIN olvasása, akkor nyilván kell valami globális változó, ahol tárolod az aktuális értéket és annak az értékét hasonlítani.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5362 üzenetére
Én is a fehér panelra forrasztom. Igaz, így néhány IO pint-t bukunk, de eddig nekem még elég volt. Nem tudom van-e olyan panel, ahol minden láb ki van vezetve.
A NodeMCU-n egyébként ezek ki vannak vezetve, de az drága. A Wemos d1 mini-n viszont nincsenek.[ Szerkesztve ]
Alex
-
vargalex
félisten
-
vargalex
félisten
válasz ngabor2 #5418 üzenetére
Szia!
Nem használtam még LCD-t (pedig vagy egy 16x2-esem), de több ilyen lib-et is találtam. Nem írtad meg, hogy pontosan melyiket használod. Nekem ez a sor mindenképpen fura:
LiquidCrystal_I2C lcd(0x20,20,4); // set the LCD address to 0x20 for a 16 chars and 2 line display
Ha igaz a comment, akkor így egy 16x2-es LCD-t inicializálsz.
Szerk.: Bocs, most látom, hogy az csak az I2C address-e, a felbontás a 2. és 3. paraméter.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz ngabor2 #5421 üzenetére
Itt pontosan erről a problémáról írnak.
Itt pedig a 2. hozzászólásban írják, hogy a lib write() függvényének visszatérési értékét vizsgálja az új verzió, az okoz gondot. Nézd meg, hogy a lib-nek van-e új verziója, vagy javítsd a fent linkelt módon, esetleg használj más lib-et.[ Szerkesztve ]
Alex
-
vargalex
félisten
Nálam van egy mini szerver, így kézenfekvő volt, hogy ott csinálok szerver oldali komponenseket mind az e-mail küldéshez, mind a mysql íráshoz/olvasáshoz. Az ESP pedig csak http post-okkal beszélget vele.
A szerver oldal php, onnan sem gond az e-mail küldés gmail-al. Több példát is lehet találni...Alex
-
vargalex
félisten
A tömböt inkább byte típusúnak kellene deklarálni, mert az int, az a board típusától függően 2, vagy 4 byte-os. Az EEPROM.write pedig byte-ot vár paraméternek. Vagy EEPROM.put kell helyette, de akkor természetesen feleslegesen foglalhatnak helyet a letárolt értékek.
[ Szerkesztve ]
Alex
-
vargalex
félisten
Igyekeztem teljesen dinamikusra írni. Azaz, a relék GPIO-it elegendő csak a pin_relays tömbbe felvenni, a többi (weboldalon a megfelelő gombok generálása, a kapcsolás) automatikusan történik a tömb alapján. A kód:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define DEFAULT_STATE LOW
// Replace with your network credentials
const char* ssid = "TP-Link";
const char* password = "asdf1234";
// GPIOs for controlling the relays
uint8_t pin_relays[] = { D1, D2 };
ESP8266WebServer server(80);
// html page rendering
void renderPage() {
String webPage = "";
String relay_state="";
webPage = "<html><head><link rel=\"stylesheet\" href=\"https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css\">";
webPage += "<script src=\"https://code.jquery.com/jquery-1.11.3.min.js\"></script>";
webPage += "<script src=\"https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js\"></script></head>";
webPage += "<body><h1>ESP8266 Relay Web Server</h1>";
for (int relayIndex = 0; relayIndex<sizeof(pin_relays)/sizeof(uint8_t); relayIndex++) {
relay_state="";
if (digitalRead(pin_relays[relayIndex])) {
relay_state="checked";
}
webPage += "<p>Relay #" + String(relayIndex) + " ( GPIO" + String(pin_relays[relayIndex]) + " ) <input type=\"checkbox\" " + relay_state + " data-role=\"flipswitch\" onchange=\"window.location.href='/?relay=" + String(relayIndex) + "'\"></p>";
}
server.send(200, "text/html", webPage);
}
// handling requests
void handle_root() {
if (server.hasArg("relay")) {
int relayIndex = server.arg("relay").toInt();
digitalWrite(pin_relays[relayIndex], !digitalRead(pin_relays[relayIndex]));
Serial.print("Relay ");
Serial.print(relayIndex);
Serial.print(" state changed to ");
Serial.println(digitalRead(pin_relays[relayIndex]));
}
renderPage();
}
void setup(void){
// preparing GPIOs
for (int relayIndex = 0; relayIndex<sizeof(pin_relays)/sizeof(uint8_t); relayIndex++) {
pinMode(pin_relays[relayIndex], OUTPUT);
digitalWrite(pin_relays[relayIndex], DEFAULT_STATE);
}
//Turn on serial output
delay(1000);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// logging to serial output
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// web server setup
server.on("/", handle_root);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}Látható, hogy a pin_relays tömb most 2 elemű, így a renderelt weboldal jelenleg így néz ki:
Ahogy a setup függvényben látható, alapban alacsony állapotra húzza az érintett GPIO-kat. Persze ez a kiindulási állapot a DEFAULT_STATE-ban módosítható.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Tankblock #5770 üzenetére
Igen, éppen tegnap este vettem észre, hogy a <html> és a <body> TAG-ek lezárása hiányzik, de mobilról nem akartam javítást küldeni, mert elég nehézkes. Ma javítom, és berakom újra (azért nem most, mert most is csak mobilról vagyok). A server.send előtt kell hozzá fűzni a webPage-hoz.
Egyébként a böngészőket ilyen apróságok nem zavarják...[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5772 üzenetére
Nyilván a jquery kicserélhető bármire (akár maradhat simán checkbox is, vagy saját CSS-t lehet gyártani pl. így), csak azért raktam bele, hogy kicsit pofásabb legyen a megjelenítés és maga a kód rövidebb. Nálam nem volt szempont az adatmennyiség.
UPC-nél a DHCP net miatt tipikusan nem változik az IP cím. Ettől függetlenül nálam is van dyndns természetesen (már egy jó ideje az ipdns.hu-t használom). De a kérdésedet nem igazán értem... Ugyanis az UPC által adott IP-t nyilván a router WAN oldala kapja. Az állomások pedig egy belső IP címet. Mi közük az eszközöknek a külső IP-hez? Nekik a routerben statikus lease van beállítva a DHCP szervernél...
És akkor a javított kód, mert a
<body>
és a<html>
tag lezárása lemaradt (igaz, a böngészőket nem zavarja, automatikusan lezárják):#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#define DEFAULT_STATE LOW
// Replace with your network credentials
const char* ssid = "TP-Link";
const char* password = "asdf1234";
// GPIOs for controlling the relays
uint8_t pin_relays[] = { D1, D2 };
ESP8266WebServer server(80);
// html page rendering
void renderPage() {
String webPage = "";
String relay_state="";
webPage = "<html><head><link rel=\"stylesheet\" href=\"https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css\">";
webPage += "<script src=\"https://code.jquery.com/jquery-1.11.3.min.js\"></script>";
webPage += "<script src=\"https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.js\"></script></head>";
webPage += "<body><h1>ESP8266 Relay Web Server</h1>";
for (int relayIndex = 0; relayIndex<sizeof(pin_relays)/sizeof(uint8_t); relayIndex++) {
relay_state="";
if (digitalRead(pin_relays[relayIndex])) {
relay_state="checked";
}
webPage += "<p>Relay #" + String(relayIndex) + " ( GPIO" + String(pin_relays[relayIndex]) + " ) <input type=\"checkbox\" " + relay_state + " data-role=\"flipswitch\" onchange=\"window.location.href='/?relay=" + String(relayIndex) + "'\"></p>";
}
webPage += "</body></html>";
server.send(200, "text/html", webPage);
}
// handling requests
void handle_root() {
if (server.hasArg("relay")) {
int relayIndex = server.arg("relay").toInt();
digitalWrite(pin_relays[relayIndex], !digitalRead(pin_relays[relayIndex]));
Serial.print("Relay ");
Serial.print(relayIndex);
Serial.print(" state changed to ");
Serial.println(digitalRead(pin_relays[relayIndex]));
}
renderPage();
}
void setup(void){
// preparing GPIOs
for (int relayIndex = 0; relayIndex<sizeof(pin_relays)/sizeof(uint8_t); relayIndex++) {
pinMode(pin_relays[relayIndex], OUTPUT);
digitalWrite(pin_relays[relayIndex], DEFAULT_STATE);
}
//Turn on serial output
delay(1000);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// logging to serial output
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// web server setup
server.on("/", handle_root);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}Amit még megjegyeznék, hogy ez a kód Wemos D1 mini-re készült. Sima ESP8266-on a D1, D2, stb. PIN-ek nincsenek definiálva (csak d1, d1 mini, nodemcu és wifinfo esetén).
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5774 üzenetére
Azt gondoltam, hogy külső elérésről van szó, de továbbra sem értem a problémát. Az Arduino (esetemben ESP8266) nem foglalkozik a külső IP-vel. A routernek kell frissíteni a ddns szolgáltatónál az új IP-re, te továbbra is ugyan azon az URL-en fogod elérni.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5776 üzenetére
Én tudom hol van, csak ugye ezek olyan header file-ok, amiket automatikusan include-ol az alaplap kiválasztásával. Ezért hívtam fel rá a figyelmet. Egyébként miért RC2 verziót használsz? 8 nappal az RC2 kiadása után kijött a végleges 2.3.0 (2016.06.23-án).
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5778 üzenetére
Nyilván, ha van valamilyen DNS cache-ed, akkor az okozhat problémát. De mondom, az UPC nem cserél IP címet. Legalábbis, ha nem ADSL-ről beszélünk. Csak MAC cím változáskor fog változni valójában az IP címed.
Az IP váltás lekövetése viszont csak a cache élettartamán múlik. Ezt nem tudom, hogy lehet-e windows-ban állítani, linux-ot használok.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Janos250 #5780 üzenetére
Kábelneted van UPC-nél? A legtöbb embernek éppen az a problémája, hogy hogyan tudna IP-t cserélni. Ez HGW esetén router módban szinte lehetetlen, saját routerrel viszont csak MAC klónozással lehet. Ezért csodálkozom... Pedig több UPC-s emberkével is kapcsolatban állok, mindenkinél nagyjából fix az IP.
Alex
-
vargalex
félisten
Szia!
A
renderPage
függvényben ezt a részt:if (digitalRead(pin_relays[relayIndex])) {
relay_state="checked";
}cseréld erre:
if (!digitalRead(pin_relays[relayIndex])) {
relay_state="checked";
}Most olvasom, hogy neked low level trigger reléd van. Ha a relé állapotát akarod kijelezni, akkor ez lesz a helyes megoldás nálad. Ugyanis a kód eredeti állapotában a GPIO magas állapotánál jelez ON-t.
[ Szerkesztve ]
Alex
-
vargalex
félisten
válasz Gergosz2 #5849 üzenetére
Nyilván nem sok a $3, de azért mégis több egy kicsivel, mint még egy d1 mini ára...
Igazából én azon lepődtem meg, amit itt írtál (konkrétan az "Itt a fórumon elég sokan a Wemos D1 mini pro-t favorizáljuk" szövegre gondolok).
Gyors keresés a topicban a d1 mini pro kifejezésre. Nekem nem ez jön le...[ Szerkesztve ]
Alex
-
vargalex
félisten
Szia!
Nyilván nem azt mondom, hogy rosszabb a d1 mini pro, mint a sima mini. Sőt, vannak előnyei. Ez elsősorban a külső antenna csatlakozó. Ez bizonyos távolság fölött jól jöhet. A 16 MB flash viszont valószínűleg csak akkor jelenthet előnyt, ha nem Arduino IDE-ből programozod, hanem NodeMCU firmware-t teszel rá és esetleg nagyon hosszú lua scriptet tennél rá. Bár, nem biztos, hogy előfordulhat ilyen eset.
Alex
-
vargalex
félisten
Szia!
Most azt várod, hogy nézzük meg helyetted? Láthatólag az előző linkeden található is működőképes. Ha úgyis lesz mindened, majd kipróbálod. Nekem pl. nincs is ilyen led kijelzőm.
Egyébként az Arduino, ESP8266 szerintem nem copy-paste programozásra való. Legalábbis úgy nem sok értelmét látom....Alex
-
vargalex
félisten
Új hozzászólás Aktív témák
- -54% Dell XPS 9510: i7 11800H, 16GB,512GB,RTX 3050Ti,500nit,100%sRGB,Dell ProSupport gari 2025.3.8.
- -52% Dell Precision 5570 workstation: i7 12700H,16GB,512GB,RTX A1000,500nit,100%sRGB,gari 2026.2.10
- Dell Inspiron 3537 használt laptop
- Használt PC kitűnő állapotban
- ELADÓ 2022. ÉVBEN VÁSÁROLT 3060 Ti és 3080 Trinity RIGEK / KÜLÖN IS ÉRTÉKESÍTEM