-
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
-
Szancsó
aktív tag
Kb. 8cm volt közte és úgy néz ki tényleg nem szoftveres volt, mert ha nem USB ről megy a lap, akkor eddigi tesztek alapján jónak tűnik.
(Mondjuk nem vágom miért, nagyon halványan kapcsoltam csak rá, nem hiszem, hogy a teljesítmény lett volna kevés, de már mindegy. 1-2 órát azért eljátszottam én is a pin -ek váltogatásával, kód guberálással és guglizással...) -
Janos250
őstag
Nem találok most rá jó leírást, mert a Google egyre használhatatlanabb :-(
Sorra olyan oldalakat hoz előre, amelyből valamelyik keresett szó hiányzik, de ezt legalább jelzi is, meg reklám oldalakra irányít.
Az egyes portok default pinjei itt vannak:
https://circuits4you.com/2018/12/31/esp32-hardware-serial2-example/
Az UART rx,tx a GPIO9, GPIO10-et használja, tehát át kell irányítani, mert az SPI flash kezelés is használja ezeket a pineket.Valamint: "The three serial ports on the ESP32 (U0UXD, U1UXD and U2UXD) 3.3 V level. They are called UART0, UART1 and UART2.
UART0 is normally used by the serial monitor. UART2 (Serial2) is available on the GPIO pins 16 (RxD2) and 17 (TxD2). UART1 is connected to GPIO 9 and 10, but these are not available because they are connected the integrated SPI flash. Fortunately ESP32 has multiplexing features, and so pins can be changed in code. This can be done with the begin command: Serial1.begin(9600,SERIAL_8N1, 21, 22);. With this command we define GPIO pin 21 for RxD1 and 22 for TxD1."
http://www.weigu.lu/microcontroller/tips_tricks/esp32_tips_tricks/index.html -
Janos250
őstag
-
Tankblock
aktív tag
Szia,
bemásolnád mi a hiba?
Nekem van projectem, igaz nem használok Arduinot, hanem ESP-idf et c++ szal.
CSak nyitottam egy plusz UART ot és megnéztem mit kell küldeni a Nextionnak, és fut két task, egy Tx és egy Rx... MQTT-n keresztül megy a villanykapcsolók és egy BMP280 szenzor adatokat tolok át meg vissza....#define TXD_PIN (GPIO_NUM_17)
#define RXD_PIN (GPIO_NUM_16)
#define nUART (UART_NUM_2)void initNextion() {
const uart_config_t uart_config = {
.baud_rate = 115200,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};
uart_param_config(nUART, &uart_config);
uart_set_pin(nUART, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
// We won't use a buffer for sending data.
uart_driver_install(nUART, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
}
int sendData(const char* logName, const char* data)
{
const int len = strlen(data);
const int txBytes = uart_write_bytes(nUART, data, len);
ESP_LOGI(logName, "Wrote %d bytes\n", txBytes);
ESP_LOGI(logName, "#%s#\n", data);
return txBytes;
}
void TxTask(void * parameters) {
string store ="";
//store += "page0.temp1.txt=\"11\"";
//store += endData;
//UBaseType_t ip;
int qL;
mqttTopic x;
while (1) {
// OK so here is where you can play around and change values or add text and/or numeric fields to the Nextion and update them
qL = uxQueueMessagesWaiting(queueTopic);
for(int i = 0; i< qL;i++)
{
xQueueReceive(queueTopic,&x,portMAX_DELAY);
store.clear();
if( x.sTopic == "livingroom/lightswitch/status")
{
store += "page2.livingroom.val=";
store += (x.sData=="ON") ?"1":"0";
store += endData;
sendData(TX_TASK_TAG, store.c_str());
}....
void RxTask(void * parameters) {
....
string sdata;
while (1) {
sdata.clear();
xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false,true, 5000 / portTICK_PERIOD_MS);
const int rxBytes = uart_read_bytes(nUART, data, RX_BUF_SIZE, 500 / portTICK_RATE_MS);
if (rxBytes > 0) {
data[rxBytes] = 0;
ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
sdata += (char *)data;
printf("RxTask: #%s#",sdata.c_str());
if(sdata == "livingroom ON") {
esp_mqtt_client_publish(client, "livingroom/lightswitch/switch", "ON", 0, 0, 0);
}
Valahogy így .... -
gazso75
aktív tag
-
Janos250
őstag
Szerintem a kód el fog férni. A plafon, ami kocogtatja a fejed az lesz, hogy a különböző helyen elhelyezett dolgok adatait hogyan juttatod el az ESP32-höz. Ha vezetéken, akkor az egy madzag gubanc lesz. Ha a szenzorok egy részének az adatait WiFi-n akarod eljuttatni, akkor azokhoz kell valami WiFi képes eszköz, pl. ESP8266 a szokásos.
És akkor már ott vagy, hogy egyszerűsíti a dolgod, ha nem elemi szenzorokat vásárolsz, hanem olyat, amiben eleve bótilag ott van a kezelő ESP8266 (vagy ESP8255, amit praktikusan ugyanannak tekinthetünk).
Ilyenek az ebay-en a Sonoff ("Switch ON/OFF") cuccok, érdemes megismerkedni velük. Pl. olyan, ami 230V-os relét kapcsol, és mellesleg van benne hőmérséklet érzékelő és páratartalom mérő. Ezek a Sonoffok - és újabban más hasonló eszközök - ESP8266-ot használnak, és készítettek rájuk egy jól használható, rugalmas, C++-ban megírt, forrásnyelven elérhető rendszert, aminek Tasmota a neve.
Sokan a kész lefordított bináris felvitelével kínlódnak, én mindig az Arduino felületen a szokásos módon lefordítom, feltöltöm, mert akkor a forrásnyelvű programba be tudom írni a saját, specifikus dolgokat, pl. saját WiFi router jelszava, stb. Nagyon kényelmes és rugalmas rendszer, érdemes vele megismerkedni, ajánlom általánosan mindenkinek! Ha egyszer feltöltöttél madzagon egy Tasmota rendszert, onnan kezdve - ha változtatni akarsz - már WiFi-n keresztül megy a feltöltés.Továbblépve:
Aztán, ha nagyon sok mindent akar az emberfia használni, akkor már a kisebb gubanc érdekében a következőt használják:
MQTT !!!!
Ez egy ilyen feladatokra kidolgozott rendszer, aminek a lényege:
Minden szenzor nem oda küldi az adatot, ahol arra szükség van, hanem mindent egy központi szerverre (MQTT szerver). Ezen regisztráljuk be, hogy melyik szenzor adatát kinek küldje tovább. Pl. ha a hőmérő fagyot mutat, akkor küldje egy Sonoff relének, vagy konnektornak, ami bekapcsolja a fűtést. Ez nagyon nagy fokú rugalmasságot biztosít, mert nem kell a programokba belenyúlni változtatás esetén, hanem óhajunkat az MQTT szervernek küldjük neten.
Jelenleg erre az MQTT szerver célra a málnát használják, én is azt várom, hogy valaki csinálja már meg ESP32-re is.
Na, és persze akkor már egy lépés, hogy valamelyik okosotthon rendszert is használjuk, pl. Home Assistant.Na, megint szómenésem volt, ezeket nem azért írtam, hogy most azonnal ezeket fogod használni, hanem lásd Te is, és mások is, akik ilyesmiben gondolkodnak, hogy mi a jelenleg használatos metodika.
-
Tankblock
aktív tag
Hello
Az int az 4 byte lesz.
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
string s = "abcd";
char * p;
long n = strtol( s.c_str(), & p, 16 );
if ( * p != 0 ) { //my bad edit was here
cout << "not a number" << endl;
}
else {
cout << n << endl;
}
}szerintem ez lehet hogy hasznos, bár én inkább levágnám R G B re 2 charonként és azt konvertálnám át....
Remélem nem kevertem össze semmit se.
-
Teasüti
nagyúr
Ez a sztenderd bekötése a nyomógombnak. Azért nem lehet csak egyszerűen a nyitott/zárt áramköri kapcsoló példáját alkalmazni, mert nyitott állapotban a GPIO "lebeg" és bármilyen random értéket felvehet a zajtól függően. Ezért a GPIO lábakat fixen fel/le kell húzni Vcc-re/GND-re.
Ezért látsz egy felhúzó ellenállást 5V-ra, amit a nyomógomb lehúz GND-re. Rövidzártól nem kell tartani, egy 10k-s felhúzóval kb 0,5 mA áram lesz levezetve GND-re gombnyomás esetén. Ha meg nem nyomod a gombot, akkor meg még ennyi áram se lesz, mivel a GPIO bemenet úgy tudom MegaOhm nagyságrendű.Az meg hogy alapból fel vagy le van húzva, az szinte mindegy. Van aki inkább GND-re húzza a gombokat alapból, hogy ne legyen feszültség alatt az áramkör, csak a gombnyomás idejére. Na nem mintha 5V 0,5 mA olyan nagy kárt tudna tenni bármiben.
-
Szépen haladok előre, a ledszalag vezérléssel.
Webes felület kész. Mint kiderült van sokkal egyszerűbb megoldás, mint a taskok szeparálása cpu magra, meg saját ledszalag vezérlés írása.Fastled library tökéletesen működik. Az, hogy fordításkor megjelenik egy warning nem probléma.
Az espasyncwebserver library segítségével tök egyszerű megjeleníteni a weboldalt. Már csak annyit kell megírnom, hogy a weboldalon kiválasztott színt jelenítse meg a szalagon. De ennek is meg van a mintakódja.
Már csak 1 dolog kell. Akarok egy fizikai nyomógombot is a szalag kikapcsoláshoz. Ez lényegében úgy működne, hogy fekete szín küldene ki a szalagra.
A nyomógomb bekötéséhez azonban amit eddig találtam nekem nem szimpatikus. Lényegében az esp32 egyik pin-je egy ellenállással gnd-re van kötve. Ugyanerre a pinre van kötve a nyomógomb, a pin és az ellenállás közé. A nyomógomb másik lába pedig 5v-ra van kötve. Így ha megnyomom a gombot, az ellenálláson keresztül záródik az áramkör. Nem tudtok olyan megoldást, ahol nincs így összekötve a gnd és az 5v? -
Janos250
őstag
taskDISABLE_INTERRUPTS();
Az ESP32 rendszere a freeRTOS op. rendszeren fut, annak a függyvényei is használhatók.
Azt csinálja, ami a neve, letiltja az interruptot, a taskENABLE_INTERRUPTS() pedig újra engedélyezi.
Ezeket próbáld a saját programodba is betenni a szalagra írás előtt és után. Csak próba, mert lehet, hogy nálad a könyvtár dolgaival összeakaszkodik.A loop automatikusan a core1-en indul, ha nem rakod át. A WiFi kezelés a core0-n van, elvileg nem zavarhatják egymást.
A szalagra kiküldendő adatok kiszámítását, meg bármi járulékos dolgot tedd a core0-ra. Beteszed egy függvénybe, és azt pl. ehhez hasonlóan hívod meg.
Így lehet pl. egy "lightShowInCore0Code" nevű függvényt úgy meghívni a loopban, hogy ne a core1-en, hanem a core0-n fusson:xTaskCreatePinnedToCore(
lightShowInCore0Code, /* Task function. */
"lightShow", /* String with name of task. */
1000, /* Stack size in words. */
NULL, /* Parameter passed as input of the task */
3, /* Priority of the task. */
&lightShowInCore0, /* Task handle. */
0 /* core */
);uint8_t:
"uint8_t lövésem sincs mi, gondolom egy közvetlen lenyúlás egy hardverközelibb szintre"
Nem.
A különböző rendszerekre való könnyebb átvitel érdekében a különböző hosszúságú egészeket célszerű így deklarálni, hogyint8_t : előjeles 8 bites egész
uint8_t : előjel nélküli 8 bites egész, vagyis 0..255 közötti az értéke.
A 8 helyett állhat 16, vagy 32 is, attól függően, mekkora kell.Én lightShowInCore0Code-nak neveztem el azt a függvényt, ami az adatokat kiszámolja, tehát ami nevet adsz a függvényednek, azt írd a helyére. A többi maradhat változatlanul.
void lightShowInCore0Code( void* parameter) {
// Ide kerül a tényleges program, amire azt akarod, hogy a core0-n fusson.
vTaskDelete(NULL); // ezt ne felejtsd el beírni a függvényed utolsó sorába.
} ; -
Janos250
őstag
Nem kell megfejteni!
Ennyi a loop lényege:void loop() {
taskDISABLE_INTERRUPTS() ;
for ( uint8_t i = 0 ; i < ledNum ; i++) {
transmitOnePixel(lightArray [lightArrayIndexPortWriting][i]) ;
} ;
taskENABLE_INTERRUPTS() ;
delay(1000) ;
} ; // end loopA transmitOnePixel paramétere egy tömb.
typedef struct RGB {
uint8_t r, g, b;
};
RGB lightArray[2][ledNum] ;Az első indexe 0, vagy 1. Amíg az egyik első indexxel a tartalmát küldöd a led szalagra, addig a core0-á a másik indexxel számolod a következő értéket.
Ezt célszerűen egy
xTaskCreatePinnedToCore
hívással célszerű megtenni.Ezt:
void lightShowInCore0Code( void* parameter){
static uint8_t showNum = 0 ;
switch (showNum) {
case 0:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {0,0,0} ;
} // end for
lightArray[lightArrayIndexCalculating][0] = RGB {255,255,255} ; // first, last pixel controll
lightArray[lightArrayIndexCalculating][ledNum - 2] = RGB {255,255,255} ;
lightArray[lightArrayIndexCalculating][3] = RGB {255,255,255} ;
break;
case 1:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {(128-i*(128/ledNum)),i*(128/ledNum),0} ;
} // end for
break;
case 2:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {0,0,32} ;
} // end for
break;
case 3:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {0,32,0} ;
} // end for
break;
case 4:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {32,0,0} ;
} // end for
break;
case 5:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {(128-i*(128/ledNum)),0,i*(128/ledNum)} ;
} // end for
break;
default:
for ( uint8_t i = 0 ; i < ledNum ; i++) {
lightArray[lightArrayIndexCalculating][i] = RGB {16,16,16} ;
} // end for
}
showNum++ ;
showNum = showNum % 6 ;
vTaskDelete(NULL);
} ; // end lightShowInCore0Codecsak mintapéldának írtam hasraütésszerűen náhány verziót, ami a case szerint sorra veszi.
A
static uint8_t showNum = 0 ;
miatt sorra veszi őket.Persze lehet a kész könyvtárakkal is, ha már azzal kezdted el, bizonyára úgy is kell mennie.
A vékony drót esetét én sem értem, de vannak még csodák.Ha valamelyik led nem azt csinálja, amit kellene:
az többnyire amiatt van, hogy 1 msec időközönként megszakít, és ilyenkor túlszalad az idő.
Próbáld meg esetleg tiltani a megszakítást azon a magon, amíg tart az adatok feltöltése a szalagra! -
Janos250
őstag
Egyszer már mutattam, hogy mennyire pofon egyszerű mindenféle spéci könyvtárak nélkül az RMT-vel a WS2812 led szalag használata.
core1: a led feltöltés,
core0: minden egyéb.void transmitOnePixel( RGB pixel){
do {
} while (*((volatile uint32_t *) (0x3FF56060)) & (1 << 24) ) ; // busy?
uploadToRMTmem(pixel.g,0) ;
// start transmit:
// RMT.conf_ch[chanelNum].conf1.mem_rd_rst = 1;
*((volatile uint32_t *) (0x3FF56024)) |= (1 << 3) ;
// RMT.conf_ch[chanelNum].conf1.tx_start = 1;
*((volatile uint32_t *) (0x3FF56024)) |= 1 ;
uploadToRMTmem(pixel.r,1) ;
uploadToRMTmem(pixel.b,2) ;
}
void uploadToRMTmem( uint8_t oneByte, uint8_t n){
uint16_t offset = n*32;
uint8_t i ;
for ( i = 0 ; i < 8 ; i++) {
if ( oneByte & (128 >> i ) ){
*((volatile uint32_t *) (0x3FF56800 + n * 32 + i * 4)) = WS2812bitHIGH32 ;
}
else {
*((volatile uint32_t *) (0x3FF56800 + n * 32 + i * 4)) = WS2812bitLOW32 ;
} ;
} ; // end for
} ; // end uploadToRMTmem -
Teasüti
nagyúr
Én kíváncsi lennék mire alapozod ezeket a következtetéseket!
Én ESP32-n használok 4 csatornán ws2812b szalagokat, ellenállás nincs az adatbuszon (a végleges változat be lesz ültetve nyák-ra, azon lesz), vezetékek hossza hasonló a tiédhez, de van ahol akár kétszerese is (egy sportmotor alsó idomján futnak körbe a szalagok, a vezérlés az ülés alatt) és a vezeték méretezésekor se vettem figyelembe semmit. Ugyanazzal a 10A-es szállal vannak behúzva az adatbuszok, mint amin a delej megy.
Hónapok óta üzemel gond nélkül. -
Janos250
őstag
Megnéztem egy 60 pixeles szalag áramfelvételét 5V-os, és 3.3V-os táp esetén, maximális (255,255,255) fényerőnél
Nincs egy Li akkud pl. 18650 amivel ki tudod próbálni? Vagy egy laposelemed? Kisebb feszültséggel is stabilan működnek, csak kisebb a fényerejük. Szintillesztőt én sem használok, közvetlenül a led bemenetet kötöm az ESP32 lábára. Vagy próbáld ki, hogy ugyanarról az USB tápról hajtod meg a szalagot is, és az ESP-t is. Azaz feltöltöd a gépről, majd utána lecsatlakoztatod a gépről. Az az érintéses probléma nekem nagyon valamiféle "kóbor" delejre utal.
-
Teasüti
nagyúr
3.3V-hoz az R330 szolgálna 10 mA-es korlátként. 12 mA a max, amit egy GPIO le tud adni.
Ez csak kiegészítő védelem, akár el is hagyható. Én sem használom éles körülmények között és hónapok óta megbízhatóan működik a rendszer.Esetleg azt próbáld még ki, hogy beraksz egy 3V3-5V szintillesztőt az adatbuszra, vagy trükközöl egy kicsit.
A hivatalos specifikáció szerint Vcc*0,7 felett van a logikai 1, ami 3,5V minimum. Ez lehet gyártási minőségtől is függhet, az én szalagom vígan megy közvetlenül a GPIO-ról is.
szerk: ez kihagyható, azt hiszem be se kapcsolna a szalag egyáltalán, ha az első pixel nem értelmezi a logikai 1 szintet.Ha megváltoztatod a deklarált pixelek számát és a jelenség követi e változást (10 pixelnél a 11. zöld, 20 pixelnél a 21., stb.), akkor ez 100% szemantikai hiba. Vagyis a szoftver szar.
Ha nem te balfaszkodod el (for ciklusban a pixelek számáig számolunk, nem "LEDmennyiseg+1"-ig), akkor próbálj ki egy másik könyvtárat! Vhol megcsúszik a puffer, ezért szar az első és utolsó pixel színe. Vagy rossz színsorrend szerint definiáltad a szalagot (GRB, RGB, stb.). Mondjuk ezt kétlem, ettől még nem csúszna el a puffer a következő pixelre, szóval még mindig tartom, h cserélj könyvtárat!A táp - mint írtam volt - nem szól bele a vezérlésbe. Ha bekapcsol a szalag és max fényerőn se brownout-ol, akkor a táp elégséges. Ellenben erre a feladatra vagy 220/5V-os dugasztápokat használunk (a kínai tápokból kerüljük ezeket), vagy DC-DC konvertereket.
Ezek jó hatásfokkal rendelkeznek és nem kell megerőszakolni őket 28W elfűtésével úgy mint egy fesz. stab. IC-t. -
99% hogy a hiba nem szoftveres, hanem hardveres, konkrétan a tápegység nem megfelelő valamiért.
Az 56db-os szalagból csak 10 db-ot vezéreltem és rákötöttem egy USB-s töltőre. (5V, 1 A). A ledszalag, hirtelen megjavult, ugyanúgy működött, mint a 10db-os teszt szalag.A megoldás, hogy veszek egy stepdown konvertert, ami 12V-ból csinál nekem 5V-ot.
-
Janos250
őstag
Én nagyon szkeptikus vagyok az Adafruit könyvtár használatát illetően.
Az a kisebbik gond, amit már leírtam, hogy a számláló átfordul, van egy sokkal nagyobb:
Az 1 msec-enkénti megszakítás nincs kivédve.
Próbálgattam ezt a könyvtárat, de sehol nem akart működni, aztán megnéztem miért. Itt a képek.
Az 1 msec-enkénti megszakítás 7-8 microsec, ami pont a határon van. Elméletileg 50 microsecet írnak a határra, de én még olyan szalaggal nem találkoztam. Lehet, persze, hogy az eredeti Adafruit szalagok tudják, de ezek között a kínaiak között én még nem találtam olyat, aminél ne 7-8 microsec lenne a határ, tehát pont a kritikus "billegő" tartomány. -
Teasüti
nagyúr
Nem, ez a bekötés minden digitális szalagra vonatkozik.
Akkor egész jól ment, addig amíg be nem kavartak az objetumokkal
Eeegen, ezzel én is így vagyok.
Mai napig nem jöttem még rá a könyvtár felépítésének logikájára. Amikor azt hiszem a szintaktikát sikerült megértenem a legalapvetőbb 3 soros tutorial-lal az Arduino oldalán, akkor rájövök, hogy fogalmam sincs hogy kéne szétdarabolni a már megírt függvényeimet könyvtárakká. -
Teasüti
nagyúr
Amit javasolnék, hogy meg kell nézni milyen utasításokkal lehet tömböt átadni az Adafruit könyvtárának.
Aztán te magad ellenőrzöd utána milyen adatok kerülnek ki a szalagra. Ergó te állítod össze egy byte tömbben az 56*3 elemet, GRB vagy RGB sorba rendezve szalagtól függően és így egyben adod át a könyvtárnak.
Mert így, hogy a könyvtár pufferét írod a setPixelColor-ral, így nem látható mi is történik egy absztrakciós réteggel lejjebb.Nekem számtalanszor ez adott lehetőséget érdemi debug-ra, ezért se használok ilyen 5 perc alatt beüzemelhető, demókkal tarkított könyvtárakat. Csak a minimalista show() funkció legyen benne, semmi más.
Annak tudjak átadni egy tömböt, amiben benne vannak a színkomponensek és ennyi.
Az animációt meg megírod magadnak. -
Teasüti
nagyúr
Az igen!!
Bátor vagy! -
Teasüti
nagyúr
A kódod átnyálazása nélkül csupán tapasztalatból írom, hogy ha nem azt látod a szalagon amit szeretnél és a szalag nem pixelhibás, akkor az esetek 100%-ában a kódban van a hiba.
Ha az első és utolsó ledek színe nem oké, akkor az én tippem az volna, hogy a 3 színkomponens tömbbe rendezésénél lesz a gond.
A táp nem okoz semmilyen zavart a jelben, amíg nem brownout-ol a szalag vagy az mcu.
Inkább a szalag pwm vezérlése okozhat zavarokat a tápban, ha nincs pufferelve egy szép nagy kondival. -
Janos250
őstag
Na, most megint csak a levegőbe dumálok:
Én a LEDek.show(); -t egy sorrál hátrébb tenném, tehát a kapcsos zárójel mögé.
Mert:
A for ciklus fusson végig, azaz töltsd fel a puffert teljesen, utána írja ki a dolgokat a LEDek.show();Hogy jobban megértsd mit csinálsz, javasolnék egy próbát:
a LEDek.setPixelColor(i,csunyafeher); helyére próbára:
LEDek.setPixelColor(i,LEDek.Color((255-i*4)/4,i,0)); Lusta voltam másikat csinálni.Tehát:
1. végigmegy a ciklus, azaz letárolja [LEDek.setPixelColor]
2. amikor a teljes show ki van számolva, le van tárolva, a LEDek.show(); kitölti a szalagra, és megjelennek a színek
3. vár 1000 msecet, azaz egy secet, és újra tölti.A villanás (gyanúm szerint) megszűnik, ha a LEDek.show() a cikluson kívülre kerül.
Így, hogy ugyanaz a szín lesz mindig kiírva, nem látszik a lényeg, de kipróbálhatod pl ezt:
for (i=szakasz1kezdet; i<LEDmennyiseg+1; i++)
{
LEDek.setPixelColor(i,csunyafeher);
} ;
LEDek.show();
delay(1000);
for (i=szakasz1kezdet; i<LEDmennyiseg+1; i++)
{
LEDek.setPixelColor(i,kikapcsolt);
} ;
LEDek.show();
delay(1000);
for (i=szakasz1kezdet; i<LEDmennyiseg+1; i++)
{
LEDek.setPixelColor(i,LEDek.Color((255-i*4)/4,i,0));
} ;
LEDek.show();
delay(1000); -
Janos250
őstag
Kösz!
Nem szedtem ki a dolgokat librarybe, mert ezek demonstrációs céllal készültek. Tehát nem belevittem a libraryt, hanem "nem vittem ki". Azt akarnám bemutatni, hogy mennyire egyszerűen lehet kezelni ESP32-vel a WS2812-t is. Majd ha lesz annyi időm, leírom, a még néhány hasonló megoldással együtt. Igen, az a próba van beleírva a lightShowInCore0Code()-ba a case-eknél, amit leírtál. Ez egy próba, hogy lássam, úgy működnek-e a ledek, ahogy szeretném. Látom, Nálad is úgy működnekJa, még annyit, hogy a két mag előnyét szándékoztam - többek között - bemutatni. Az egyik mag kezeli a ledeket, a másik meg kiszámítja, hogy mit kell kivinni. Így mehetnek párhuzamosan, nem zavarják egymást. Ha már van két magunk az ESP32-ben használjuk ki.
-
-
Janos250
őstag
Hoppla-hopp! Na, megvan a hiba.
A "No hardware SPI pins defined. All SPI access will default to bitbanged output"
hibajelzés, az nem a fordító hibajelzése, hanem a fastspi.h fileban van:# if !defined(FASTLED_INTERNAL) && !defined(FASTLED_ALL_PINS_HARDWARE_SPI)
# ifdef FASTLED_HAS_PRAGMA_MESSAGE
# pragma message "No hardware SPI pins defined. All SPI access will default to bitbanged output"
# else
# warning "No hardware SPI pins defined. All SPI access will default to bitbanged output"
# endif
# endifEl kéne távolítani azt a fastspi.h-t!
Hú, erre a fene se gondolt.
-
Janos250
őstag
Közben megpróbáltam utánanézni ennek az SPI-s hibaüzenetnek. Amit találtam:
1. ESP8266 esetén kapták ezt az üzenetet. Biztosan ESP32-t állítottál be?
2. Mellesleg ez az utolsók egyike volt a hibaüzenetekben. Mindig a legelső hibaüzenetet kell nézni, bár az már általában nem látszik. Ezért én úgy szoktam, hogy a "hibaüzenetek másolása" gombbal kimásolom, és kiteszem notepadre, ott keresem ki a legelső hibát, mert az utána már generál még egy csomó, érthetetlennek tűnő hibát. -
Janos250
őstag
"de így is ugyanazt az üzenetet kapom."
Akkor valami egyéb gáz van, mert mielőtt feltettem, direkt próbára lefordítottam, annak a képét tettem fel.
És a másik verzió, amit a 8194-ben írtam? Abban még RMT sincs, csak digitalWrite(), annak aztán mindenképpen menni kellene! Az ESP32 elég gyors ahhoz, hogy RMT nélkül, csak a GPIO használatával is menjen, ha az interruptot letiltjuk.
Itt írom le, hogy ha valakinek nem elég a millis, micros, mert nagyobb felbontást akar, akkor a CCOUNT használható. Egy baja van, hogy csak 32 bites, de szoftverrel ezt meg lehet kerülni. Ezzel nagyon pontos időzítések állíthatók be bármire."De nekem szerintem a NodeMCU van."
Az tökmindegy, a rajta lévő IC a lényeg. Az ESP32-k közül sem különösebben lényeges, hogy melyiket állítod be azok közül, amelyiken ESP-WROOM-32, vagy lánykori nevén ESP32S van. Mellesleg amit én használok, az pont úgy néz ki, mint a Tied, a lábak is ugyanúgy vannak. -
_q
addikt
Nekem is ugyan ilyen van kép alapján, nem innen vettem és ott nem is volt benne a nevében a nodemcu, ami nem véletlen hiszem ez ESP32S modul, nem ESP8266. Itt tévesen szerepel a nevében. Gondolom így több találatot ad ki ha valaki ESP32-re kerese vagy ESP8266-ra. ESP Dev Board-ként működik az Arduino IDE 1.8.5-el. Tehát inkább a code/library lesz a gond szerintem.
-
Tankblock
aktív tag
Hello,
mert un. "bit banget" használ....
a RMT használatával lehet megoldani. Nálam 96 W2812 led gond nélkül megy.
PL használd ezt: [GitHub repo
letöltöd a cpp és a h filet, includálod Ardunioba és a main szerint használod.....
Meg sem kell írdon.Még egy dolog, a földet közösítsd a controllerrel, de a táp legyen elegendően nagy. Nálam a végén 5V 5A ipari lesz addig meg jár 2,5A tápról de minimál fényerő van a kódban.
96 x 3 x 20 mA számolva = 5,76 A.... még ez is alul van tervezve, de nem tervezem 100% fehér fényen járatni.
-
Janos250
őstag
Ha végképp nem megy, tettem fel egy gyalogkakukk megoldást, amiben semmi más nincs, csak a CCOUNT a delay helyett. Ha megnézed a writeOneByte()-ot, látod, hogy felviszi a lábat magasra, helyben jár, ameddig magasan kell tartani, majd leviszi, és rögzíti az időt, hogy mikor kezdődhet az új bit kivitele. Az új kiírása előtt megnézi, hogy eletelt-e már a megfelelő idő.
link
Ebben tényleg semmi olyan nincs, ami miatt ne működne. Persze a másiknak is kell működni. -
Janos250
őstag
-
JozsBiker
aktív tag
Értem. Illetve így nem értem a delay szerepét, de mindegy. Én azért érdekességképpen tennék a for ciklusba is mondjuk 1 másodpercet, hogy szemmel látható legyen a működése
Írtad hogy az első led -del két verzióban is bajod volt. Lehet hogy egyszerűen csak hibás. Hagyd ki, kezdd a másodikkal.
Néhány led színe provizórikusan akkor szok megváltozni, ha a vezérlési láncban kontakthiba van, esetleg a táp nem megfelelő ( feszültség és/vagy áram szempontjából ). A kontakthiba az utolsó jól működő led után van. -
Janos250
őstag
"de mi van akkor ha én pl egyszerre akarom az első tíz LED-et vezérelni."
"Egyszerre" nem tudod vezérelni a 10 ledet. Mind a tíznek ki kell küldened egymásután ugyanazt a kódot.
A WS2812 úgy működik, hogy ami színkódot elsőként kiküldtél, azt elkapja magának az első led, amit másodszorra, azt az első továbbküldi, a második kapja el, stb.
Akkor kezdi elölről, ha nagyobb (pl. 10 microsec) szünet van a két kód érkezése között.Amit én feltettem, az tutorial céllal készült, ha valaki tanulmányozni akarja az ESP32 RMT használatát.
-
Janos250
őstag
Tettem fel egy hevenyészett fényképet a bekötésről, és azt a programot, amivel fut.
Ha akarod, megnézheted. A case után vannak, amit sorra vesz, azt kell átírogatni.
http://arduinouser.hu/esp32/WS2812/index.html -
Janos250
őstag
Ezért jó ez, mert minden egy helyen van, kevesebb, mint 600 Ft-ért:
https://www.ebay.com/itm/8-Tasten-Ziffern-Digital-LED-8-Bit-TM1638-Display-Module-f%C3%BCr-AVR-Arduino/172471641665?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2057872.m2749.l2649 -
Janos250
őstag
Az esp-wrom-32 a lényeg.
"Itt lehet olyat csinálni..."
Persze. Ez C++ , vagyis amit C++-ban lehet, azt lehet. A C++ tk. a C bővítése. Attól lesz arduino, hogy egy csomó (C++, C, assembly) fgv, type, constans már definiálva van, amit includol. Ugyanúgy main() is van , csak nem látod, de megkeresheted.
A main egyszer lefuttatja a setup függvényt, utána végtelen ciklusban hívogatja a loop-ot. -
Tankblock
aktív tag
Hello,
próbaképen egy delay(1000); tegyél a Wifi.begin... után
A Soros portton meg a sztem azért nem látsz semmit, mert Ő megpróbálja kiflushelni és mivel nincs a loopban semmi ezért vége lesz a programnak.
Serialt ha folyamatosan monitorozod akkor elkaphatod talán.
A kiíratást tedd a loopba a végére meg egy delay(5000); aztán további jó tesztelést.
-
itg
tag
én is szívtam vele, javaslom nézd meg ezt a linket:
https://github.com/esp8266/Arduino/issues/2182WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);ps:
egyébként most sem mondható stabilnak az ESP32, 100-ból 2-3x előfordul, hogy azt írja hogy csatlakozik, de mégsem éri el a belső oldalt. Kezdek is kiábrándulni belőle... -
Janos250
őstag
Kétféle verziót tölthetsz le:
1. Amit installálsz, és az felrakja magát ahova kell, a programjaid könyvtára - ha jól emlékszem - a dokumentumokba kerül.
2. Portable verzió:
Amit letöltöttél, azt egyszerűen kibontod egy könyvtárba valahova, de lehetőleg olyan helyre, hogy ne legyen túl hosszú a path.
Ahogy kibontottad, lesznek ilyen könyvtárak pl.: hardware, libraries, stb.
Ugyanide csinálsz egy portable nevű könyvtárat MÉG AZ ELSŐ INDÍTÁS ELŐTT.
Akkor néhány dolgot ebbe rak, pl. sketchbook könyvtárat csinál a programjaidnak, stb.
Én mindenben, még a video lejátszóban/szerkesztőben és egyebekben is azt a verziót szeretem, amit nem installálok, hanem csak futtatom ott, ahol kibontottam. -
Janos250
őstag
A nagyon nagy helyfoglalás reális.
Az ESP32-re felrakja az RTOS oprendszert, az kiteszi a helyfoglalás zömét, arra rakja rá a te pici programodat.
library:
Nekem kiválasztja a megfelelőt annak ellenére, hogy kiírja, hogy többszörös, stb.
Mivel én mindig a portable verziót használom, így könyvtárakat hová tegyük ügyben csak a portable verziót illetően tudok nyilatkozni. -
Teasüti
nagyúr
Jól gondolod. Két éve még azt se tudtam mi az a mikrokontroller, elektronikai tudás meg a nullához konvergált. Megtetszett a címezhető ledszalag és emlékeztem, hogy van az az Arduino izé, lehet az kell ide.
Azóta eltelt lassan két év és épp saját NYÁK-okat tervezek a hobbi projektemhez. A 3D nyomtató meg a dobozában várja a sorsát, hogy a NYÁK-okból használható eszköz szülessen. A héten megint berendeltem vagy 15 tételt kínából. Annyi pénzt költöttem már a projektre és a szükséges szerszámokra, felszerelésre, hogy megsaccolni se lenne egyszerű.
Szerinted függő vagyok?Igazából az alkotás öröme okoz függőséget. A siker, amikor órák óta próbálod kisilabizálni és végre összeáll.
-
Janos250
őstag
Olyan ESP32-t vegyél, amin van USB port. A maiak 99 %-a olyan.
Semmi nem kell hozzá, csak USB kábel.
A WS2812-höz való csatlakoztatáshoz én ilyesmi kábeleket használok:
link
Táphoz ilyet, de persze bármi jó:
link
meg ilyet:
link
Meg ez is jól jön:
link
Ha komolyabban akarsz majd a későbbiekben az Arduinoval foglalkozni, akkor egy ilyen is nagyon jól jön:
link
Egy ilyen is nagyon hasznos alkatrészek teszteléséhez:
link
Itt jobban látszik néhány példa azokból, amiket, tud. Nem csak tarnsistor tester, hanem szinte mindent, aminek nincs háromnál több lába. Bedugod, és megkeresi saját maga, hogy mi az, kirajzolja a bekötését, kiméri a paramétereit.
linkMilyen oldalt javasolok? Hát ez egy nehéz kérdés. Az Arduino rendszer a C++ nyelvet ismeri, a szabad fordítóval fordít. Az Arduino annyival több mint a sima C++, hogy bizonyos függvények minden kontroller típushoz kötelezően definiálva vannak, ebből adódik, hogy a specialitásokat nem használó programok bármely Arduino kompatibilis lapon ugyanúgy futnak.
Na, ennyi olvasnivalót mára. -
Janos250
őstag
Először azt kell eldöntened, hogy milyen ledet akarsz, mert minden további attól függ.
Az általad mellékelt linken analóg van: 60 led/m, azaz 20*(1 vörös, 1 zöld, 1 kék ). Ehhez kell a FET. A WS2812-ben minden pixel önmagában RGB, tehát egy pixelbe van berakva mind a 3 szín. Ha WS2812, akkor nem kell FET. -
Teasüti
nagyúr
Uno + ESP8266 felállásban nem tudok segíteni, de a többiek erről úgy 3,6 másodperc alatt fognak lebeszélni.
Az ESP is egy mikrokontroller, amit ugyanazon a nyelven, ugyanabban az Arduino IDE-ben lehet programozni.
Csak fejlettebb (lásd wifi).Az, hogy milyen szalag kell neked, azt te döntöd el. Vannak érvek mindkettő mellett és ellen is.
Az egyszerű megoldás az analóg szalag mind programozás, mind üzemeltetés (és megbízhatóság*) szempontjából. És olcsó is.Digitális szalag az drágább, bonyolultabb programozni, viszont egyszerűbb bekötni és mehet ugyanarról a tápról, mint a vezérlő. (Persze a tápot méretezni kell, és érdemes berakni a vezérlő elé egy diódát, hogy ha gépre kötöd, akkor a szalag véletlenül se tudja meghúzni az usb portot.)
Az egysávos adatbusszal rendelkezőknek megvan az a hátránya, hogy ha az egyik pixel vezérlőhibás lesz, akkor az utána következő pixelek is szemetelnek.
A szalagok gyártási minősége elég nagy szórást mutat. Simán előfordulhat, hogy egy 5 méteres szalagon az első bekapcsolásra lesznek hibás pixelek, vagy rövid időn belül megy tönkre egy-egy. Persze ha szerencsés vagy, akkor hosszú ideig nincs rá gond.*Egy pixel ha tönkremegy - vagy egy színkomponense -, nincs hatással a többire.
-
Teasüti
nagyúr
Szalag kapcsán ha nincs feltűntetve miről van szó, akkor a legegyszerűbben úgy tudod eldönteni analóg vagy digitális, ha megvizsgálod a vezetősávokat. Analóg RGB jellemzően 4 sávos és Vcc, R, G, B a neve a sávoknak. WS2812b-nél pedig 3 sáv van csak: Vcc, Data (Din -> Dout), GND. Vagy négy sávos digitális WS2801 esetén: Vcc, Data, Clock, GND. De van két adatbuszos WS2813 is Data és Backup sávokkal, amivel összesen 4 sávos lesz ez is.
Aztán van egy rakás elfajzott elnevezés is, mint az APA??? különböző variánsai (ahol a ? egy típusszám), de lényegüket tekintve pont ugyanaz, mint a WS???? széria.
-
Janos250
őstag
"A terv, hogy egy WS2812 fog futtatni egy http servert és azon keresztül tudom majd vezérelni a szín beállításokat az Arduino Uno-n keresztül."
Na, én már végképp nem értem. Milyen szalag, milyen kontroller?AZ IRL540 jó.
"A legfogósabb kérdés számomra a LED szalag, mert nem nagyon láttam leírásokat a szalagokról, hogy az most analóg, vagy digitális"
Nézd meg, hány madzag megy bele. ha négy (R táp, G táp, B táp, GND), akkor analóg. Ha 3 (GND, táp, vezérlés), és gyakran még külön 2, hogy azon is lehessen tápot adni, ha valaki úgy akarja, akkor digitális. Bár a WS2813-nak szintén több bemenete van, mert ott van még egy plusz data volanl valamiért, de az úgyis drágább még. -
Janos250
őstag
Még egy kis kiegészítés:
"Van esetleg Arduino-hoz szimulátor?"
Nem tudom, lehet, hogy van, de az a lábak, prifériák kezelését biztosan nem tudja azokon a kontrollereken, amiket ma használunk.
"Elvileg van annyi analóg pin a cuccon, hogy akár egy negyedik szalagot is tudjak vezérelni."
Attól függ, milyet használsz. STM32-n, ESP32-n jóval több is, ha mindenképpen analóg megoldást keresel. WS2812-re digitális pin meg aztán végképp.
"Teszek majd MOSFETeket a szalagok meghajtásához, bár elvileg el kellene bírnia a kb 50cm-es darabokat."
Szerintem FET nélkül nem fogja elbírni az analóg ledet. -
Janos250
őstag
Az én kommentem:
Színenként és szalagonként kell egy-egy FET, tehát összességében egy tucat. Ehhez kell valami panel, doboz, miegymás.
A fényerőt vagy úgy állítod, hogy szaggatod a jelet (PWM), vagy a FET részleges nyitásával fűtesz.
Az okosotthon témában sok androidos vezérlő megoldás van rengeteg dologra, egy része egész szép, de én ezeket nem használom/tam. Én szeretek saját WiFi/html megoldást használni.
Ahogy én csinálnám:
WS2812 RGB led, 810 Ft/m, 30 led/m. Én pár hete még 600-ért vettem, szépen múködnek, elég gyorsan be is érkezett.
link
Külön madzag van a tápnak, és külön a vezérlésnek. Kódok küldésével adjuk meg, hogy melyik szín milyen erővel világítson. Ami kódot egyszer kiküldtünk, az a táp kikapcsolásáig él, nem kell frissítgetni, csak amikor változtatni akarunk.
A vezérléshez használt madzag 3.3V-al is hibamentesen működik. Tápnak 5V kell, de kevesebbel is elmegy. A tévedésből rákötött 9V-ot egyszer régebben még elviselte, de a mostanában véletlenül ráadott 12-t már rossz néven vette.
A neten vannak rá programok, Teasüti gyakorlatban alkalmazza őket. Én nem ezeket használtam, mert túlbonyolítottnak találtam, én saját magam írtam rá egyszerűbbeket, ESP32-re (én mostanában mindenre az ESP32-t használom, mert olcsó. 2 ezer Ft alatti összegért gyors, 2 magos, sok szolgáltatással felvértezett kontrollert kapunk)
A több led használata a legegyszerűbben úgy oldható meg, hogy a pin számot váltogatod, mert minden megoldásban úgyis van egy változó, ami a GPIO számot definiálja.
Előnye, hogy ha a későbbiekben variálgatni akarod (pl. folyamatosan , akár pixelenként változó szín, fényerő), nem kell hozzá semmi hardver módosítás, csupán szoftver, arra meg azt írtad, ismered a C-t.
Van persze, az a távirányítóval vezérelhető led szalag is, valahogy bizonyára azt is lehet valahogy Arduinoról vezérelni, de annak az ára is közel van a WS2812-höz.Még utólag: ha wifi is van a tervek között, akkor kizárólag ESP8266, vagy ESP32 a mai világban. A net tele van régi, ma már elavultnak számító, drága, bonyolult megoldásokkal régebbi kontrollerekre, de - szerintem - nem érdemes energiát pazarolni rájuk. A korszerűbb olcsóbb, és egyszerűbb.
-
Teasüti
nagyúr
Digitális szalagokkal volt eddig dolgom, de az analóg is éppen ugyanúgy programozható. természetesen minden felsorolt igény könnyedén kivitelezhető.
A wifi lesz talán a megkomplikáltabb része, abban Janos250 az illetékes profi.Ami problémát okoz az a távvezérlő program. Na itt vagy készítesz magadnak egyet, vagy webserver-t futtatsz a mikrokontrolleren és HTTP alapon éred el bármilyen böngészőből, vagy keresel egy kész programot mondjuk Android-on, vagy ami tetszik.
Szimulátor nincs, úgy hogy én leadnám a rendelést Aliexpress-en. Mire ideér addigra kiművelheted magad a témában.
Új hozzászólás Aktív témák
Hirdetés
- Telefon felváráslás!! Xiaomi 13T, Xiaomi 13T Pro, Xiaomi 14T, Xiaomi 14T Pro
- Csere-Beszámítás! RTX Gamer Számítógép PC Játékra! I5 12400F / RTX 3070 / 32GB DDR4 / 1TB SSD
- Dell D6000 univerzális dokkoló USB-C/ USB-A, DisplayLink & Dell WD15 (K17A) USB-C + 130-180W töltő
- Azonnali készpénzes AMD Radeon RX 5000 sorozat videokártya felvásárlás személyesen / csomagküldéssel
- Bomba ár! Dell Latitude E7270 - i7-6GEN I 8GB I 256GB SSD I 12,5" FHD I HDMI I CAM I W10 I Gari!
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged