- Hamarosan megkezdődik a nubia 2,8K-s táblagépének szállítása
- Barátokká váltak az eddig rivális AI-óriások
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- Az Aura Displays hordozható monitorhármasa jól felturbózhatja a produktivitást
- Dual Mode-os IPS monitorral adott magáról életjelet a Gigabyte
- Apple MacBook
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- Milyen széket vegyek?
- Egérpad topik
- Teljesen az AI-ra fókuszál az új AMD Instinct sorozat
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Fejhallgató erősítő és DAC topik
- AMD GPU-k jövője - amit tudni vélünk
- Radeon RX 9060 XT: Ezt aztán jól meghúzták
-
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
-
Tankblock
aktív tag
Hello
Ha a
MyFancyClass s(3,5);
ként deklarálod azt is forítási időben csinálja a fordító pl a memória foglalást.
Futásidőben fogja memóriát foglalni:
MyFancyClass s = new MyFancyClass (3,5);
// itt fogod a művelelteket végezni
delete s; // törlésUpsz kimaradt: Memória foglalás lassú és ha már elfogyott akkor a new vége NULL lesz.
Másra való. Nézz utána a tervezési sémáknak. PL egy Singletont kifejezetten csak 1 szer kell h létrejöjjön.Pl ha adatfolyam csak időszakosan jön és nem szeretnéd mindig a memóriában tárolni a teljes structúrát akkor lehet a new - delete párossal játszani uControllereknél.
-
Tankblock
aktív tag
Hello,
Csak az eredeti példádat szerettem volna szabvány szerűvé tenni.
Nem szükséges az A, B változó az osztályba, ekkor a példányosításnál sem szükséges a 2 érték adás.
A this-> a változó nevet oldja fel az osztály és a bemeneti paraméter között.
Ha jól selytem az eredeti példád ott volt elrontva, hogy a .h file nem volt includeolva.
Tutorial amit eddig sohasem hagyott cserben/tölgyben: [link]
-
Janos250
őstag
Kutyafuttában pár megjegyzés:
1.Ne az osszeadas2 elé, hanem a SZAMOL elé tedd!
2.A hibatkozott példád:
class A2DD
{
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};Tehát KELL lenni egy public:
"A2DD(int x,int y);" -nek, azaz az osztály nevével megegyezően (konstruktor a neve)
a getSum()-nak nincs paramétere, mert a példányosításnál megadod."osszeadas2.osszeadas2(A, B)"
nagyon szerencsétlen a példánynak ugyanazt a nevet adni, amit egy tagfüggvénynek. Adj neki más nevet!Közben látom, újabb is van:
- "nem lehetne feltenni a
//class SZAMOL (int A, int B) { mögé?"
Nem!- vagy az osszeadsnak legyen paramétere, vagy a szamolnak. Mindkettőnek: konfúz!
- " this->A = A; //ezt a this részt nem értem, hogy mit csinál
this->B = B; /"
Egyelőre ne is használd, szerintem (tudod, pap, papné)
Helyi változónak lehetőleg ne legyen az a neve, ami a paraméternek!Többit legközelebb, mert most rohanok.
-
Sokimm
senior tag
válasz
Tankblock #8693 üzenetére
Köszönöm a válaszod! Vissza kérdeznék, kommentelek, és kérlek javíts ki ahol tévedek, vagy nem értek valamit!
valami.h:
#ifndef VALAMI_H_
#define VALAM_H_
class SZAMOL {
private:
int A;
int B;
public:
SZAMOL(int A, int B); //ez a SZAMOL osztály két input tagja, amit nem lehetne feltenni a
//class SZAMOL (int A, int B) { mögé?
int osszeadas2 (int C, int D);
//ez a SZAMOL osztály egyik metódusa, ami osszadas2 néven fut, és kér két változót?
};Akkor lássunk a .cpp filet:
#include "valami.h"
SZAMOL(int A, int B){
this->A = A; //ezt a this részt nem értem, hogy mit csinál
this->B = B; // és sajnos az angol forrásokból sem jövök rá az értelmére :(
}
int SZAMOL::osszeadas2(int C, int D) { // a SZAMOL osztály osszeadas2 metódusának a valós működését leírjuk itt
return C+D;
}
SZAMOL szamol(3,4); //majd adunk neki valami input értéket... (ez már a loop előtti setup részbe tartozik nem (Arduino strukturára épülve)?)
//Ez itt a példányosítás? A bemenő inputok (3,4) változnak a main alatt futtatott A és B paraméter értékadása miatt?
void main()
{
int A, B;
A = 1;
B = 2;
Serial.print(szamol.osszeadas2(A, B));
//A szamol példányon lefuttatjuk az osszeadas2 metódust, az A és B input értékekkel, amit átadunk az osszeadas2 metódusnak, ami (C+D érték végeredményeként kiköpi a megoldást?)
} -
Tankblock
aktív tag
Hello,
ez c++ kérdés.
valami.h:
#ifndef VALAMI_H_
#define VALAM_H_
class SZAMOL {
private:
int A;
int B;
public:
SZAMOL(int A, int B);
int osszeadas2 (int C, int D);
};Akkor lássunk a .cpp filet:
#include "valami.h"
SZAMOL(int A, int B){
this->A = A;
this->B = B;
}
int SZAMOL::osszeadas2(int C, int D) {
return C+D;
}
SZAMOL szamol(3,4);
void main()
{
int A, B;
A = 1;
B = 2;
Serial.print(szamol.osszeadas2(A, B));
}Ha nem rontottam el....
-
Sokimm
senior tag
Sziasztok!
Elakadtam, és szeretném kikérni a véleményeteket.Arduino 1.8.5-el egy NodeMCU-t val játszok, és próbálom külső header file-okra osztani a feladatot (csupán a móka kedvéért), és ha visszatérő érték nélküli utasítást írok, szépen lefut osztály szerű szerkezettel, de ha szeretnék visszatérő értéket is (void nélkül), akkor nem jó.
cpp file tartalma:SZAMOL::osszeadas2 (int A, int B) {
//ha az összeadas2 elé beteszem az int-et, akkor meg
//expected unqualified-id before 'int' hibaüzenetet kapok
//ha nem teszem be, akkor meg:
//ISO C++ forbids declaration of 'osszeadas2' with no type [-fpermissive]
int C = A + B;
return C;
}
h file tartalma:class SZAMOL {
int A;
int B;
public:
int osszeadas2 (int A, int B);
// int szorzas_pivel ();
};A main-be így hívom meg a dolgokat:
SZAMOL osszeadas2;//példányosítás?
int A, B;
A = 1;
B = 2;
Serial.print(osszeadas2.osszeadas2(A, B));//végrehajtásAmúgy innen lopom a sorokat, és nem értem mi a gond: (első hasznos válaszban a példa kód)
[link]Ha hülyeség a kérdés, jelezzétek mivel pótoljam az információkat, ha kevés az infó, bátran jelezzétek, mindennemű segítséget előre is köszönök!
-
lappy
őstag
Segítséget szeretnék kérni tőletek!
egy 5x7 led matrixot szeretnék feléleszteni
találtam hozzá működő kódot de valahogy nem megy!
valószínű az <EEPROM.h> hiányzik és sajnos nem tudom hogy oda mi kellene bele?
esetleg épített már vki hasonló led mátrixot? -
choco01
addikt
válasz
choco01 #8689 üzenetére
Ez a dokksi beszél róla, de most azt sem tudom hogy ezen melyik kivitel van a 270K-s szerintem de ott a 1 vagy 2 vagy 4T mit takar?
-
choco01
addikt
Igen én is így értelmeztem ebből: solar UV light intensity de sehol sem találtam eddig UV index képletet..
Túl sokan nem csináltak ezzel projketet meg aki csinált is annál sem látom az átváltást hogy mi alapján cisnálta..
Egy másik fajta szenzornál így cisnálták:
String readSensor()
{
String UVIndex = "0";
int sensorValue = 0;
sensorValue = analogRead(0); //connect UV sensor to Analog 0
int voltage = (sensorValue * (5.0 / 1023.0))*1000; //Voltage in miliVolts
if(voltage<50)
{
UVIndex = "0";
}else if (voltage>50 && voltage<=227)
{
UVIndex = "0";
}else if (voltage>227 && voltage<=318)
{
UVIndex = "1";
}
else if (voltage>318 && voltage<=408)
{
UVIndex = "2";
}else if (voltage>408 && voltage<=503)
{
UVIndex = "3";
} -
choco01
addikt
Szerintem is elölről kezdem ezt a webserver dolgot mert minden más flottul megy már az UV kiolvasas is a VEML6070 szenzorbol meg ki is irja a kijelzore..
Nem tudod véletlen hogy ez amit kiir az UV szenzor érték miben értendő mert most az udvaron ilyen 180as értéket ír ki és ugye én 1-11 ig szeretném látni az UV indexet majd ha süt a nap.. Erre alkalmas lehet?
-
_q
addikt
válasz
choco01 #8683 üzenetére
Be kellene pár serial monitorozást tenni a kódba, ahol úgy gondolom megáll a kód, így lehetne debugolni. Illetve megnézni, hogy először is ki tudsz-e olvasni a szenzorból, utána ki tudsz-e íratni a kijelzőre fix-en számokat, utána a kettőt egybe, ezután a wifi rész. Ha minden egybe van úgy a legnehezebb. Ha külön megy és egybe nem akkor megint csak serial monitorozni kell.
-
_q
addikt
válasz
choco01 #8681 üzenetére
Ha minden igaz ez a mintakód neked is meg van, az esp32-vel települ fel. Itt csak a wifi.h kell. Webserver, Webclient nem. Nem tudom ezek mennyire "official" fájlok, de próbáld meg csak a wifi.h-t használni többi wifi-s header fájlt kommentezd ki, lehet másikban is van hasonló és bezavar.
WebServer server ( 80 );
Ezt pedig ne így nevezd el hanem:WiFiServer server(80);
-
choco01
addikt
válasz
choco01 #8679 üzenetére
Most ilyen: De ugye hibát dob annál a sornál..
Lehet a WebServer server ( 80 );-vel van baj? WifiServer server(80) is létezik..
#include <ESP32WebServer.h>
#include <Wire.h>
#include "Adafruit_BME280.h"
#include "SSD1306.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
WebServer server ( 80 );
const char* ssid = "esp";
const char* password = "12345678";
#define I2C_SDA 21
#define I2C_SCL 22
#define SEALEVELPRESSURE_HPA (1013.25)
#define BME280_ADD 0x76
Adafruit_BME280 bme(I2C_SDA, I2C_SCL);
SSD1306 display(0x3c, 21, 22);
double pt,lny,hp,hom;
/*double lny=1015.20;
double hp=-32.12;
double hom=-32.12;
double pt=62.07;*/
void idojaras(void);
void kijelzo(void);
void html(void);
void setup() {
Serial.begin(115200);
Serial.println("Program Start");
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
bme.begin();
idojaras();
delay(100);
kijelzo();
delay(100);
}
void loop()
{
idojaras();
delay(1000);
kijelzo();
delay(1000);
html();
delay(100);
}
void idojaras()
{
pt = bme.readHumidity();
hom = bme.readTemperature();
hp = hom - 0.36 * (100.0 - pt);
lny = bme.readPressure() / 100.0F ;
lny=lny+13;
delay(1000);
}
void kijelzo()
{
display.init();
display.drawString(0, 0, "Hömérséklet:");
display.drawString(62, 0,String(hom) );
display.drawString(90, 0, " °C");
display.drawString(0, 10, "Páratartalom:");
display.drawString(65, 10, String(pt));
display.drawString(90, 10, " %");
display.drawString(0, 20, "Harmatpont:");
display.drawString(62, 20, String(hp));
display.drawString(90, 20, " °C");
display.drawString(0, 30, "Légnyomás:");
display.drawString(60, 30, String(lny));
display.drawString(98, 30, " hPa");
display.drawString(0, 40, "Légszenny.:");
display.drawString(60, 40, "nA");
display.drawString(85, 40, " %");
display.drawString(0, 50, "UV sugárzás:");
display.drawString(65, 50, "nA");
display.display();
}
void html()
{
WiFiClient client = server.available();
while (client.connected())
{
if (client.available())
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML><html><head>");
client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<h1>ESP32 - Web Server</h1>");
client.println("</html>");
break;
client.println( "<body>");
client.println("<br><br>");
client.println("<body><h1>Időjárás adatok:</h1>");
client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
client.print("</td><td colspan=\"2\"><h2>Hőmérséklet = ");
client.println(hom);
client.print("<h2>Páratartalom = ");
client.println(pt);
client.print("%</h2></td></tr><tr>");
client.print("<h2>Harmatpont = ");
client.println(hp);
client.print("°C</h2></td>");
client.print(" <h2>Légnyomás = ");
client.println(lny);
client.print("hPa</h2></td></tr><tr>");
client.println("</h3>");
client.print("<br>");
client.print("</body>");
client.print("</html>");
delay(10);
client.stop();
Serial.println("client disconnected");
}
}
} -
_q
addikt
válasz
choco01 #8675 üzenetére
Szerinetm a wifi inicializálás és weboldal kiíatás nem egy helyen kellene legyen. Mert így minden egyes net függvény hívásnál ismét csatlakozik wifire, inicializál stb. Nem mondom, hogy ez a hiba, de elsőre ezt vettem észre.
Plusz egy ilyen is hiányzik szerintem a WiFiClient client után:
WiFiClient client = server.available(); // listen for incoming clients
Meg egy ilyen:
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,Tehát a net függvényt így kellene kezdeni szerinetm:
WiFiClient client = server.available(); // listen for incoming clients
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client, -
choco01
addikt
Na most letöltöttem egy másikat a ami direkt esp32 és i2c és abban már át van írva alapból így már megy!
Elvileg mennie kéne mellette a webservernek is?Itt elindul kiírja serialra az IP-t de csak tölti az oldalt nem jön be..meg így mellette a kijelző sem frissül mint ha megakadna a net függvény..
8266-on ment simán, itt valamiért nem akar pedig lefutni lefut ez a kód:
void net()
{
WiFi.enableSTA(true);
delay(2000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
delay(300);
server.begin();
Serial.println ( "HTTP server started" );
WiFiClient client;
client.println( "<!DOCTYPE html>");
client.println( "<html>");
client.println( "<head><META HTTP-EQUIV=\"refresh\" CONTENT=\"15\"></head>");
client.println( "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />");
client.println( "<body>");
client.println("<br><br>");
client.println("<body><h1>Időjárás adatok:</h1>");
client.println("<table border=\"2\" width=\"456\" cellpadding=\"10\"><tbody><tr><td>");
client.print("</td><td colspan=\"2\"><h2>Hőmérséklet = ");
client.println(hom);
client.print("<h2>Páratartalom = ");
client.println(pt);
client.print("%</h2></td></tr><tr>");
client.print("<h2>Harmatpont = ");
client.println(hp);
client.print("°C</h2></td>");
client.print(" <h2>Légnyomás = ");
client.println(lny);
client.print("hPa</h2></td></tr><tr>");
client.println("</h3>");
client.print("<br>");
client.print("</body>");
client.print("</html>");
delay(100);
client.stop();
Serial.println("Lecsatlakoztatva.");
} -
_q
addikt
válasz
choco01 #8670 üzenetére
Adafruit_BME280.h-ban írd át a címét a szenzornak 0x76-ra. 0x77-en van és ezért elvileg nem tud kommunikálni. 77 SPI esetén, 76 I2C esetén használatos. Adafruit mintakód SPI-ra van így a header fájlban is ezért szerepel 77-es cím. Ettől függetlenül a bme.begin() kelleni fog az inicializálás miatt.
-
choco01
addikt
+vargalex:
Most így néz ki a kód közös i2c-n 21 és 22-es lábon:
#include <Wire.h>
#include "Adafruit_BME280.h"
#include "SSD1306.h"
#define I2C_SDA 21
#define I2C_SCL 22
#define SEALEVELPRESSURE_HPA (1013.25)
#define BME280_ADD 0x76
Adafruit_BME280 bme(I2C_SDA, I2C_SCL);
SSD1306 display(0x3c, 21, 22);
double pt,lny,hp,hom;
/*double lny=1015.20;
double hp=-32.12;
double hom=-32.12;
double pt=62.07;*/
void idojaras(void);
void kijelzo(void);
void setup() {
Serial.begin(115200);
Serial.println("Program Start");
idojaras();
delay(100);
kijelzo();
delay(100);
}
void loop()
{
idojaras();
delay(1000);
kijelzo();
delay(3000);
}
void idojaras()
{
pt = bme.readHumidity();
hom = bme.readTemperature();
hp = hom - 0.36 * (100.0 - pt);
lny = bme.readPressure() / 100.0F ;
delay(1000);
}
void kijelzo()
{
display.init();
display.drawString(0, 0, "Hömérséklet:");
display.drawString(62, 0,String(hom) );
display.drawString(90, 0, " °C");
display.drawString(0, 10, "Páratartalom:");
display.drawString(65, 10, String(pt));
display.drawString(90, 10, " %");
display.drawString(0, 20, "Harmatpont:");
display.drawString(62, 20, String(hp));
display.drawString(90, 20, " °C");
display.drawString(0, 30, "Légnyomás:");
display.drawString(60, 30, String(lny));
display.drawString(98, 30, " hPa");
display.drawString(0, 40, "Légszenny.:");
display.drawString(60, 40, "nA");
display.drawString(85, 40, " %");
display.drawString(0, 50, "UV sugárzás:");
display.drawString(65, 50, "nA");
display.display();
} -
_q
addikt
válasz
choco01 #8665 üzenetére
Igen, ahogy (#8666) vargalex mondja ugyan arra az i2c-re kösd rá a kijelzőt, mint amire a szenzort is kötöd. Ezek után csak el kell küldeni neki amit ki akarsz íratni. Én mikor teszteltem külön teszteltem a szenzort, külön a kijelzőt, majd a végén raktam össze a kettőt.
Valószínű a kódban lehet valami. Amikor megvan pl. hőmérséklet, akkor a következő függvénnyel tudod elküldeni a kijelzőnek:display.drawString(0,0, "Temp: " + String(readtemp));
Ahol a Temp: konstans szövegként kerül a kijelzőre, majd a kettőspont után a kiolvasott hőmérséklet, ugyan az amit serial monitoron is kiíratsz. Illetve az elején a 0, 0 adja meg hogy melyik sorba/oszlopba legyen kiíratva.
-
_q
addikt
válasz
choco01 #8659 üzenetére
Én HDC1080-al próbáltam és nem volt gond oled kiíratással. Szerintem először serial monitoron próbáld kiíratni és csak utána menj tovább az oledre, Lépésről lépésre. Ha serial monitor is 0-t ír ki akkor a kóddal lesz a gond. Nem tudom hogy magad írtad-e meg a kommunikációt vagy arduino könyvtárat használsz. Ha utóbbi akkor egy minta kódot érdemes nézni pl.: ezt vagy ezt. Emellett érdemes megnézni a bekötés jó-e az szokott még gond lenni.
-
Janos250
őstag
válasz
MineFox54 #8660 üzenetére
Nagyon régen használtam nanot, de mivel - úgy látom - nem nagy a tolongás válaszadásra, ezért próbálkozom, kezeld kritikával!
Nekem ez az stk500 gyanús, hogy annak nem kéne ott lenni. Biztos, hogy azzal akarod tölteni?
Biztos, hogy ha nem, akkor az uploadot nyomtad meg, nem véletlenül az upload using programmert? -
MineFox54
őstag
Sziasztok!
Most jött egy kínai Nano, nem tudok feltölteni, az alábbi kódot kapom mindig... Két alkalommal sikerült, azon kívül soha (az sem az első kettő volt, kitartó próbálkozás eredménye. USB kábel csere volt. Egyébként a már feltöltött programok szépen működnek, csak nem a végleges került rá... Loopback teszt OKavrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt x of 10: not in sync: resp=0x6b -
choco01
addikt
Valaki próbált már ESP32-vel BME280-ból adatokat kiíratni oledre?
Valamiért 0,00-t olvas ki és azt írja ki mondjuk hőmérsékletnek..
-
_q
addikt
válasz
// Chaka // #8657 üzenetére
Lehet én értettem félre akkor.
-
Janos250
őstag
válasz
Tankblock #8650 üzenetére
Elsőre természetesen nekem is a táp volt gyanús, de erős külső táppal ugyanazt csinálja. Én nem mindig használok külső tápot, csak ha gond van. Tüskék természetesen beforrasztva, és a panel hátlapjára a külső táp csatija is. Bekapcsoláskor egy-két feltöltés gyakran sikerül, de ha egy óra múlva próbálom, sehogy se megy. Azért gyanakszom én is a baudrate stabilitására, amit az interneten is írtak, mert ha lerövidítem a csomagokat, akkor felmegy. Na, meg ha a kristályos USB-TTL átalakítót használom.
-
_q
addikt
válasz
// Chaka // #8653 üzenetére
Miért kell optocsatoló? Miért nem lehet direktbe rákötni a nyomógombot?
-
RAiN91
őstag
válasz
Tankblock #8651 üzenetére
Köszönöm, közbe már megértettem. A PIR kb. 3-4 másodpercig adja a jelet, ez zavart meg.
A következő kérdésem. Minél olcsóbban hogy tudom megoldani, hogy egy Nokia 3210 gombjait vezérelhessem? Csak egy rövidzár kell, de sajnos direktbe gondolom nem lehet megoldani, mert csak 2 állapot van? Vagy GND vagy 3,3V a kimeneten, a feszültség nem tenne jót. Vagy rosszul gondolom, hogy 2 állapot van?
-
Tankblock
aktív tag
válasz
Janos250 #8648 üzenetére
Lehet hogy van egyszerűbb magyarázat is, ha az ftdi adapterről táplálod meg akkor nem tud elegendő [mA] biztosítani, igy elveszti a kapcsolatot, vagy csak eldriftel a jel.
Sonoffot csakis alaplaptól elválasztva külsőleg megtápolva és földet közösítve szoktam letölteni. A vezetékek még így is összetudnak zajt szedni. 10 [cm] est használok jumper vezetékből és szoktam beforrasztani tüskesort is a pcbre.
-
RAiN91
őstag
Sziasztok
NodeMCU-t programozok, egy PIR szenzor van rákötve. Annyit szeretnék, hogy ha mozgást érzékel, akkor világítson a másik LED, pl. 8 másodpercig. Itt a program, amit össze sikerült hozni:
void setup()
{
pinMode(13, INPUT);
pinMode(2, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
if (1 == digitalRead(13)) {
digitalWrite(2,HIGH);
digitalWrite(LED_BUILTIN,LOW);
delay(8000);
digitalWrite(2,LOW);
digitalWrite(LED_BUILTIN,HIGH);
}
}A probléma az, hogy ha a 8 másodpercen belül mozgást jelez, akkor újra indul a késleltetés. Én azt szeretném, hogy fix 8 sec legyen, ez alatt ne is figyelje a bemenetet.
Hogyan lehetne megoldani, valami sorrend vezérlés? (később az a cél, hogy bizonyos sorrendben adjon jelet bizonyos kimenetekre, de szépen lassan, most elég ennyi)
Köszönöm!
-
Janos250
őstag
válasz
Teasüti #8647 üzenetére
Attól függ, mit értünk protokoll hiba alatt.
Az elején kiküld a gép az ESP felé néhány bájtot, ebből állapítja meg az ESP a baudrate-et. Úgy látszik, hogy amikor komplett csomagot küld, akkor nem minden bájt elejétől kezdi a szinkront, hanem "számolja", és ha hosszú a csomag, akkor kvarc nélküli lapokon elcsúszhat.
Az megoldás, ha ez ember az esptool.py-ban lecsökkenti az adatcsomag hosszát. Akkor viszont a bin fájlt kell exportálni, és az esptool.py-al kell feltölteni. Le lehetne fordítani esptoll.exe-re - elvileg. Nekem nem sikerült működőképes verziót varázsolni.
Kipróbáltam alacsonyabb baudrate-el, de úgy meg az elején kiakadt. -
Janos250
őstag
Fejlemények Sonoff touch ügyben:
Úgy tűnik, hogy az FT232RL USB-TTL csatolómmal a szinkron elvesztése miatt nem mindig megy.
Ezen nincs kvarc, a másik csatolón, amivel megy, azon van.
A hosszú adatcsomag során - úgy tűnik - elcsúszik a szinkron, ha nem stabil a 115200 baud. A netes info alapján rövidíteni kell az adatcsomagot, amiről majd írok pár mondatot. Jelenleg ez megoldásnak tűnik. -
Janos250
őstag
"Resetet nem VCC-re kell húzni?" Nem. Földre.
"Másik hogy az USB-TTL konverter az UNO lapon szerintem 5V-os, te pedig 3v3-ra kötötted a 8266-ot"
Az UNO kapta a delejt a gépről, azaz 5V-ot. Az ESP 3.3V-ot.
Az ESP több információ szerint elviseli az 5V-os szintet a lábain, ha VCC 3.3V.Mellesleg jellemző a kis kínaira:
A konverter chipre HX van írva, a programjuk meg XA/HXA-ként azonosítja.
"Windows 8 is NOT supported in HXA/XA chip versions" -
_q
addikt
válasz
Janos250 #8638 üzenetére
Resetet nem VCC-re kell húzni? Nem tudom csak kérdezem.
Másik hogy az USB-TTL konverter az UNO lapon szerintem 5V-os, te pedig 3v3-ra kötötted a 8266-ot. Ezt is kérdezem hogy nem gond-e?
Így belegondolva nem is értem hogy tud működni UNO soros kommunikáción keresztül a 8266. Mert nem jön ki az azonos jelszint. Vagy mind a kettő 5 V-on vagy 3v3-on legyen. De a 8266 meg úgy tudom csak 3v3-ot tolerál. Ehhez keresek választ, mert hallottam mástól is már hogy UNO-t használt soros kommunikácóra FT232 hiányában, de nem értem hogyan lehet ez esetben. -
Janos250
őstag
Helyzetjelentés Sonoff touch ügyben:
FT232RL-el próbálva:
Szinkront (baudrate) megtalálja, erase részeket megcsinálja, feltöltést elkezdi, majd kb 80%-nál kiakad, reprodukálhatóan.UNO-n keresztül:
Már a szinkront sem találja meg. Egyébként is fura az ügy, mert az Rx villog már a feltöltés elindítása előtt is, tehát a gép folyamatosan próbál valamit küldeni az UNO-nak. Ezt elvileg nem volna szabad így csinálnia.
Pedig ezek beállítva:
Uno - 8266
3V3 - Vcc
RX - TX
TX- RX
GND - GNDUno-n: Reset -> GND
PL2303HX USB-soros csatolóval:
A program továbbra is felmegy, működik, de nem értem, hogy ezzel miért, FT232RL-el miért nem?
Most az OTA is sikerült. Ha ez rendesen megy, jó kis eszköz lesz ez a kapcsoló.Persze egy baj is van:
Az asztali gépemen lévő PL2303HX driverével megy. Megpróbáltam laptopon, de ami drivereket találtam, azzal nem jelenik meg a soros portok között. :-( Arra már nem emlékszem, hogy az asztalihoz honnan vettem a drivert. -
Sziasztok! Bocs az offtopic-ért, de ezt muszáj linkelnem!
Már többen is jártak itt, akik gyerkőcnek akartak programozni valót összerakni, ezt a cuccot a Best Buy topikban linkelték:
[link]
Ennyiért szerintem nagyon megéri, már csak a hackelhetőségi faktor miatt is!6db soros porton (!) vezérelhető 360° szervó és egy IR távolság szenzor van benne, és ha jól látom, LEGO technic kompatibilis. Bluetooth-al tableten keresztül programozható (Blockly)!
-
Janos250
őstag
válasz
Teasüti #8633 üzenetére
Általános tapasztalatom:
Ha a program nem úgy működik kiíratással, vagy más függvények meghívása után, akkor a tömb indexe fut ki a tartományból, amit ugye a program nem ellenőriz. Pedig már a programozási anyanyelvemen (Algol60) is ellenőrizte a program az indexet. Úgy tudom, valami kapcsolóval ki lehet kényszeríteni az index ellenőrzést ennél a fordítónál is, de ehhez nem értek, de talán valaki igen.Az adott problémánál, ha a j minusz 1 lesz, akkor az ugyebár az uint8_t miatt a 255. elemet jelenti. Ha az létezik, mert akkorára van deklarálva, akkor abba ír, ha nem, akkor meg az más által használt terület, de ő bambán oda ír.
-
Janos250
őstag
válasz
Tankblock #8610 üzenetére
1 kapcsolós touch Eu.
Próbáltam külső táppal is, de úgy se ment. (így sikerült véletlenül 12V-ot ráadnom az egyikre). Próbáltam a ck előírása alapján is, mert az FTDI-n megvannak a lábak, meg próbáltam a "kézi" módszerrel is, úgy is, hogy a táppal resetelem, úgy is, hogy a reset lábra forrasztottam egy madzagot és azzal reseteltem, de semmi az FRDI-vel. Azaz kb 20-30-ból egy néha felment hiba nélkül. A vezetékeket is cseréltem, hátha ott van a gond. Holnap majd kipróbálom Teasüti módszerét, a CH340-el. -
-
Teasüti
nagyúr
válasz
vargalex #8629 üzenetére
Úgy tűnik éppen ez a hiba forrása.
Nem tudom mi történik pontosan mikor a j átfordul nullán, de olybá tűnik felülír vhol vmit, amit nem kéne.
Ezt alátámasztandó a hiba elhárul ha az elemek számát 255-re emelem vagy megakadályozom, hogy átforduljon.
Ahogy tanulmányozgattam a C string-eket, ezek csak pointerek és nincs megkötve az elemek száma. Ezért is nem panaszkodott, mikor a data[8]-ba beraktam vagy háromszor annyi elemet.
ESP32-nél talán azért nem jött elő, mert szimplán mocskosul sok memóriája van az Uno-hoz képest. -
vargalex
félisten
válasz
Teasüti #8630 üzenetére
Egy ESP32 van éppen kéznél, azon jónak tűnik.
-
Teasüti
nagyúr
válasz
vargalex #8629 üzenetére
Igen, azt már átrágtam párszor. Fordított sorrendben rakja ki a kijelzőre azt a 4 bájtot, amire a j számláló hivatkozik. Tehát max 4-ről indul - buff[4] - és eltárolja csökkenő sorrendben a következő 4 karaktert (vagy hát amíg kifut a számláló az értelmezhető tartományon - a nulladik elem az meg úgyis felül lesz írva később, 255-ről átfordulva meg már nem érdekes) amit kirak a kijelzőre.
Kicsit baltával faragott módszer, de így nem kell külön tükrözni a tömböt.
És a cikluson belül csak ez a sor lépteti a j változót a következő számjegyre, de csak ha nem pontot kap a bemeneten, amit speciálisan kell címezni az MSB-vel a bájtsorrendben.Nálad produkálja a hibákat?
-
-
-
válasz
Teasüti #8622 üzenetére
Próbáld a soros kommunikációt más bitrátára állítani! Olvastam, hogy bizonyos bitrátáknál a processzor órajelétől függően pár %-os eltérés lehet a beállított értékhez képest, és már jártam is így Bluetooth modullal, hibás karaktereket küldött bizonyos bitrátánál, hiába volt a gépen ugyanaz beállítva. Hátha téged is ez viccel meg.
-
Teasüti
nagyúr
Az nem automatikusan kerül lefoglalásra?
Úgy tudom a globális változók kerülnek a ram elejére. A fent maradó terület úgy tudom a stack, amit a lokális változók használnak. De ezen mit növeljek, amikor a fordító szerint 1500 bájt szabadon van hagyva a memóriából?
Ez egy igen primitív program, futtattam már olyanokat is, amik a tár 100%-át foglalták és több mint kétharmad ram-ot és vígan futottak.Amúgy volt egy szemantikai hiba:
char data[8];
tömb méretét megnöveltem, de még így is produkálja a hibákat. -
-
Teasüti
nagyúr
válasz
vargalex #8621 üzenetére
Épp a Serial.print parancsokkal küzdök, ugyanis rendre megváltoztatják az adatot és teljesen kiszámíthatatlan hibákat okoz.
Van vmi ötlet miként lehet ennek a végére járni?
Megkérhetlek benneteket, ha van egy kis szabadidőtök, hogy lefuttatjátok ezt a programot?
A könyvtár elvileg bugmentes, azt csinálja amit szeretnék, stb.
Eredeti Uno R3-ason futtatom. (Mondjuk lehet ki kéne próbálnom másik lapon is.)
A setup()-ban a for ciklussal játszadozok most és teljesen inkonzisztens eredményeket ad nekem.
1. ha nem ismétlem a sprintf parancsot, akkor már a második alkalommal korrupt adatokat ad át a függvénynek.
2. A Serial.print(data) hibásan működik.
3. Ha a ciklus paramétereiben a temp változóhoz hozzáadok egy számot - hogy tovább fusson -, akkor az első pár ismétlés után egyszercsak azt írja ki a konzolra, hogy a ciklusszámláló értéke 132 és kilép a ciklusból.
Bárkinek bármi ötlete mi az ördög folyik itt?
3+ Ez esetben ha a temp változót volatile-nak deklarálom, akkor nem akad ki 132-vel.
Én ebből semmit nem értek. -
vargalex
félisten
válasz
Teasüti #8613 üzenetére
Látom, meglett a megoldás. Az ok pedig szerintem az, hogy C-ben változó (így ugye a buff tömböd esetében is) deklaráláskor nincs inicializálás. Egyszerűen egy memória területre fog mutatni, amiben valamilyen érték lesz. Érdemes kézzel inicializálni akár az általad használt módon, akár a
bzero(buff, sizeof(buff));
hívással.
Szerk: Látom, ezt már megbeszéltétek. Én azt gondolom, hogy bootkor inicializálja a memória területeket (vagy ugye teljes áramtalanításkor elveszti úgyis a tartalmát), amiből serial print-kor fog még felhasználni (majd felszabatítani úja inicializálás nélkül), míg debug nélkül nem. Azaz debug esetén más lesz ugyan azon a RAM területen, mint nélküle.
-
Teasüti
nagyúr
-
válasz
Teasüti #8613 üzenetére
A buf és a buff is helyi változó, a dinamikus változó területen jön létre, elképzelhető, hogy minden függvényhíváskor új ram területre kerül. Se létrehozáskor, se törléskor nincs nullázva a terület, tehát valószínűleg az előzőleg oda beírt adatok maradékát olvasod vissza.
-
_q
addikt
válasz
Teasüti #8612 üzenetére
Köszi kipróbálom.
(#8613) Teasüti
Ehhez annyi megjegyzésem lenne, hogy én úgy tudom nem nagyon szokták az if-et úgy használni, ahogy te, tehát hogy nincs ott hogy _debug == 1. Ezt képes a fordító esetleg rosszul fordítani. Van a scram vagy hasonló programozási elv/módszertan ami direkt ki is zárja. Nem mondom hogy mindig gondot okoz, de tud furcsaságokat generálni bizonyos feltételek mellett. -
Teasüti
nagyúr
Srácok!
Olyasmibe botlottam amit egyáltalán nem értek hogy lehetséges, soha nem láttam még ilyet és semmivel sem tudom magyarázni.
Az alábbi kód részletben a debug kiíratás megváltoztatja a kiírni szánt adatot!!!void TubeDisplay::display(char *buf) {
uint8_t buff[5];
if (_debug) {
Serial.print(F("Data size: "));
Serial.println(strlen(buf));
Serial.print(F("Data: "));
}
for (uint8_t i = 0, j = 4; i < strlen(buf); i++) {
if (_debug) {
Serial.print(buf[i]);
Serial.print(F("="));
}
if (buf[i] != '.') buff[j--] = encode(buf[i]);
else buff[j + 1] += 128;
if (_debug) {
Serial.print(buff[j]);
Serial.print(F(" "));
}
}
if (_debug) {
Serial.println();
}
buff[0] = REG_DAT;
if (_debug) {
Serial.println(F("Displaying data:"));
for (uint8_t i = 0; i < 5; i++) {
Serial.print(buff[i]);
Serial.print(F(" "));
}
Serial.println();
}
Wire.beginTransmission(_addr); // transmit to device #8
Wire.write(buff, 5);
Wire.endTransmission(); // stop transmitting
}Ha
_debug = false
akkor más értékeket kapok a tömbben, mint hatrue
lenne.
Vagy ha kikommentelem a vége felé aSerial.print(buff[i]);
sort, akkor megváltozik a tömb.Hozzá kell tennem, hogy egy 4 digites I2C numerikus képernyőt hajt meg ez a függvény, és most épp azt tesztelgetem mi történik, ha kevesebb adatot kap a bemenet, mint amennyi bájtot küld a Wire.
Szóval a paranormális példában azok a bájtok változnak meg a kiíratásra, amiknek nincs értéke.
Ez jelent vkinek vmit?szerk: A megoldás pedig
uint8_t buff[5] = {0,0,0,0,0};
De nem értem az okát.
-
_q
addikt
SSD1306 oled kijelzőnél van ötletetek hogy tudok 2 digiten kiíratni számot? Tehát ha azt akarom hogy 0-9 közötti számot írja ki akkor ne 0, 1, 2, ...,9- legyen hanem 00, 01, ..., 09 kiíratva.
SSD1306.h-t használom és ezzel íratok ki:
display.drawString(0, 0, String(clockHour) + ":" + String(clockMinute) + ":" + String(clockSecond));
Print esetén "%2d"-vel lehetne de itt nem tudom ha egyáltalán működne hova írjam, de az is lehet hogy itt nem így kell.
-
Teasüti
nagyúr
Azért kell reset-ben tartani az Uno-t, mert ugyanazon az UART porton van ilyenkor az Atmel328 és az ESP8266. Soros buszon meg nyilván nem lóghat egyszerre három eszköz.
Mondjuk szerintem az is jó, ha kikapod az IC-t a helyéről, de akkor már egyszerűbb bedugni egy darab vezetéket a reset-re.(#8605) aryes
Prózai oka van: nincs usb-soros konverterem. És miért vegyek külön, amikor van belőle minden usb képes lapon? A Nano-kon ott a CH340g, az eredeti Uno-mon meg tököm tudja mi. De működik szuperül. -
Teasüti
nagyúr
válasz
Janos250 #8598 üzenetére
Semmit nem kell csinálni vele. Én csak az usb-soros chipet használom róla.
Az Uno le van húzva reset-re, így fel se boot-ol. Ellenben a TX/RX lábak bypass mennek tovább az ESP-re.Ennyi az egész:
Uno - 8266
3V3 - Vcc
RX - TX (5V toleráns az I/O lábakon)
TX- RX
GND - GNDUno-n: Reset -> GND
Gyakorlatilag USB-Soros konverterként használod a lapot.
IDE-ben meg egyértelműen az Uno Com portjára csatlakozol és alaplapnak meg az ESP-t állítod be.
Új hozzászólás Aktív témák
Hirdetés
- Székesfehérvár és környéke adok-veszek-beszélgetek
- Kertészet, mezőgazdaság topik
- Barátokká váltak az eddig rivális AI-óriások
- Suzuki topik
- Megvan, milyen chipet használ a Pura 80 Ultra
- Apple MacBook
- Háztartási gépek
- Gurulunk, WAZE?!
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- The First Berserker: Khazan
- További aktív témák...
- MSI RTX 4070 SUPER 12GB GAMING X SLIM WHITE - 20 hónap garancia
- GIGABYTE RTX 4070 SUPER WINDFORCE OC 12GB - 20 hónap garancia
- iKing.Hu - Samsung S25 Ultra - Titanium Black - Használt, karcmentes
- Apple Ipad 10.generáció
- Új HP Pavilion x360 14-ek Érintős hajtogatós Laptop Tab 14" -35% i5-1335U 8/512 FHD IPS Iris Xe
- Apple iPhone SE 2020 64GB, Yettel függő, 1 Év Garanciával
- ÁRGARANCIA!Épített KomPhone i5 12400F 16/32/64GB RAM RTX 4060 Ti 8GB GAMER PC termékbeszámítással
- REFURBISHED és ÚJ - Lenovo ThinkPad 40AS USB-C docking station (akár 3x4K felbontás)
- AKCIÓ! ASRock Z390 i7 8700K 32GB DDR4 500GB SSD RTX 3050 8GB Zalman i3 Edge Seasonic 650W
- ASUS ROG GL552VW - 15.6"FHD IPS - i7 i7-6700HQ - 8GB - 128GB SSD + 1TB HDD - GTX 960 4GB -
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest