- Azonnali mobilos kérdések órája
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Google Pixel topik
- Megvan, milyen chipet használ a Pura 80 Ultra
- Xiaomi 15 - kicsi telefon nagy energiával
- Olcsó Galaxyk telepíthetik a One UI 7-et
- Mi nincs, grafén akku van: itt a Xiaomi 11T és 11T Pro
- Milyen okostelefont vegyek?
- iPhone topik
- Hat év támogatást csomagolt fém házba a OnePlus Nord 4
-
Mobilarena
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
válasz
lanszelot #21468 üzenetére
Mit jelent a "nagy felbontás"? A kódban FRAMESIZE_CIF van beállítva, ami 352 × 288 felbontás. A youtube videó alatt linkelt kóddal próbáltad? Nekem is van egy OV2640 kamera modulom, ebben a felbontásban nekem hozza kb azt a sebességet, ami a videón látható, kb 15 fps biztosan megvan. 160x120 módban 60fps körüli. Áramellátása rendben van? 1A körül igényel a kamera modul.
-
Undoroid
őstag
válasz
lanszelot #21108 üzenetére
Az autós -szerintem ha észreveszi a dudálásodat- akkor bemutatja, hogy az övé hangosabb...
...nem hinném, hogy lenne olyan, aki ezt a magas labdát kihagyná! Erre jó példa lehet az egyes kamionokon látható, hosszú (trombita alakú) légkürtök hangja! Egyszer kipróbáltuk az üzletbe behozott ilyen szörnyet...hát netuddmeg, hogy már 2Bar-on mekkorát szól a 6Bar-ra tervezett kürt!
Léteznek gyári megoldások erre, de ez 'csak úgy van'...szól, de egy nagyobb város zajában semmit sem ér!
-
válasz
lanszelot #21108 üzenetére
Ez inkább vakond- vagy patkányriasztónak használható, a piezzo kimondottan magasabb frekvenciákon működik jól, a driver is pont az ultrahang tartományra lett kitalálva. 120Hz-en nem hiszem, hogy jól teljesítene, hiszen a piezo kis elmozdulásra képes, nem tud nagy hangnyomást létrehozni.
szerk.: Nem hiszem, hogy hallható frekvenciákon képes 85dB-t elérni egy bélyeg méretű piezo-val
-
válasz
lanszelot #21082 üzenetére
Az ESP32 egy mikrokontroller. Te egy erre a mikrokontrollerre épülő fejlesztőpanelt vettél, amit úgy kell kezelned, mintha egy arduino lenne. Plusz mikrokontroller nem kell hozzá, de valamivel programoznod kell, mert ezeken nincs USB-Serial átalakító, mint mondjuk egy Nano esetén.
Programozni különböző fejlesztőkörnyezetekben lehet, akár Arduino IDE szoftverrel is tudsz rá programot írni, mint egy Arduino boardra.
Wifi-BT és még millió opció van benne, amit vagy használsz, vagy nem.Szvsz, ha felmerül a kérdés, hogy "Azzal mit csinálok?" akkor általában az a válaszom, hogy ha ez kérdés, akkor egyelőre semmit. Nézegess projekteket. Youtube, Instructables, Hackaday és majd megjön az ihleted.
-
cog777
senior tag
válasz
lanszelot #21080 üzenetére
Elvileg az Arduino IDE-ben vannak esp32-hoz kapcsolodo "camera" peldak.
Azokat probald meg feltolteni ugy hogy beirod a wifi azonositot es jelszot. Remelhetoleg szabvanyosan kotottek ossze a kameraval a esp32-t.En a Lilygo valtozatot fogom megvenni, azt legalabb latom a neten, hogy valaki mar kiprobalta.
Ha telepitesz egy VPN klienst, akkor Interneten keresztul is meg tudod nezni. [link]
-
válasz
lanszelot #21012 üzenetére
Amit néztem abból pár vezeték megy a kontrollerbe amin 4 gomb van, és semmi több. Előre, hátra, jobb, bal.
Azoknak a vezetékeknek jelet adok és kész.Ahogy te tévedsz.
Az ilyen vezetékes "kontroller" semmi mást nem csinál, mint a tápfeszültséget kapcsolja direktben a motorhoz vezető drótokra. Erre digitális kimenetet nem lehet direktben kötni, csak meghajtó fokozattal (pl az említett h-híd).
-
válasz
lanszelot #21007 üzenetére
Én azt javaslom, hogy ne kész kisautót használj és ne webkamerát. A kisautó irányítása triviálisnak tűnik, de nem az. Ha kis helyeken, kis távolságokra kell irányítani, sokkal fontosabb a jó manőverező képesség, és az a lánctalpas vagy a hasonló logikájú, 2 hajtott kerék + bolygókerék és ezeknek a kombinációja (4 hajtott kerék), ezek ugyanis tudnak helyben fordulni. Cserébe nem mennek annyira gyorsan és túl egyenesen sem, de ezt nem is fogod tudni kihasználni, mert akkora lesz a lag a netes kapcsolat + kamera miatt. A kész autónál a vezérlést is nagy valószínűséggel ki kellene cserélni, tehát azzal sem vagy előrébb. Egy dupla h-bridge vagy két 360°-os szervó pont meg is teszi hajtásnak.
A másik a külön kamera. Ehelyett inkább valamely ESP32CAM modult ajánlanám, de nem a legolcsóbb gagyi kamerával (pl ov2640), és akkor minden egyben lesz, ami fogyasztás szempontjából se mindegy.
-
Janos250
őstag
válasz
lanszelot #21007 üzenetére
Gondoltam, kipróbálom a ChatGPT-t erre.
Már többször próbáltam kíváncsiságból. Általában jó programot írt egyszerűbb dolgokra, de volt, hogy logikai hibát rakott bele.
Most azt írtam be neki:
"Írj egy programot ESP32-re, amivel egy ledet tudok ki-bekapcsolni neten keresztül!"
Ezt válaszolta:
"Az alábbiakban egy egyszerű példaprogram található, amely segítségével egy ESP32 mikrovezérlőn keresztül vezérelhetsz egy LEDet a hálózaton keresztül. A program egy egyszerű webes felületet biztosít, ahol egy gomb segítségével ki- és bekapcsolhatod a LEDet."
Ezt a programot írta:#include <WiFi.h>
#include <ESPAsyncWebServer.h>
// WiFi hálózati beállítások
const char* ssid = "WiFi_SSID";
const char* password = "WiFi_Password";
// LED pin
const int ledPin = 13;
// Web szerver létrehozása az AsyncWebServer használatával
AsyncWebServer server(80);
void setup() {
// LED pin inicializálása
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Sori monitor inicializálása
Serial.begin(115200);
// WiFi csatlakozás
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Webes útvonalak kezelése
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = "<html><body>";
html += "<h1>ESP32 LED Control</h1>";
html += "<p>LED Status: ";
html += (digitalRead(ledPin) == HIGH) ? "ON" : "OFF";
html += "</p>";
html += "<form action=\"/toggle\" method=\"post\">";
html += "<button type=\"submit\">Toggle LED</button>";
html += "</form>";
html += "</body></html>";
request->send(200, "text/html", html);
});
server.on("/toggle", HTTP_POST, [](AsyncWebServerRequest *request){
digitalWrite(ledPin, !digitalRead(ledPin));
request->send(200);
});
// Web szerver indítása
server.begin();
}
void loop() {
// Üresen hagyjuk a loop-ot
}
Én nem használnék AsyncWebServer-t, hanem csak símát, és nem is tudom eldönteni, hogy jó-e, mert nem használtam még, és most meg kipróbálni nem tudom, de érdekességként beírom ide, hogy felhívjam a figyelmet, hogy hol tart a todomány!
Ha nem tudod, hogy ez:[](AsyncWebServerRequest *request)
mi, akkor Google, C++ lambda -
ViZion
félisten
válasz
lanszelot #20770 üzenetére
ahh, OK. Nem tudom miféle macsek, vannak a giga pofátlanok, meg vannak a normálisabbak. A normálisabb az tanítható. Nekünk volt lakásban, a székre felült és lesett az asztalra, de nem ment fel (kiskorától volt szigor). Kutya az zsivány volt, a TV néző kanapén aludt, lebukott erősen. Nah innentől mondtuk neki, h a nappali padló az láva, nem mer lejönni. Gyerekek és én engedném, de asszony nem (Ő a gazda, neki fogad szót első sorban).
Amúgy alufóliát a pultra körbe, pár ugrás után megtanulja, h nem kellene.Wolfram: jól néz ki a cucc
-
biker
nagyúr
válasz
lanszelot #20762 üzenetére
Kezdjük előről
Te kértél egy szenzort
ajánlottak PIR-t ami NEM lát át semmin
Te közölted, nem jó, mert neked van egy RCWL-0516 és az átlát a munkalapon
Én közöltem hogy azért mert az redaros nem pir, a pir jó neked
Erre megerősíted igen, nem infrás és átlát a falonakkor le tudod követni hol a hiba? Neked PIR kell ami NEM lát át semmin, és most nem PIR van ami átlát és ez nem jó neked
-
válasz
lanszelot #20762 üzenetére
Szép, a miénk pont így tele van.
Valami ilyesmit tudnék elképzelni, bár nem tudom, hogy a gyakorlatban mennyire lenne zavaró pár pultból kiemelkedő alkatrész:
A két kék vonal tükör, a piros mondjuk egy lézer pointer, mellette pedig egy fotocella (nincs berajzolva), ami a visszavert fénysugarat detektálja. Tükörnek egy régi HDD-ből kimentett lemezből kivágott darabkát lehetne használni, alumínium, dremellel könnyen vágható. Vagy macskaszemet (ne a megfigyelt állatokat áldozd fel).
Illetve én nem vetném el az infra szenzorokat, két darab kellene, a felső szekrény aljára szerelve, a fal felé irányítva.
-
biker
nagyúr
válasz
lanszelot #20756 üzenetére
egy mezei passzív infra átlát a falon? vagy a bútorlapon? Hát érdekes lenne, mert akkor nem kellene getzidrága radaros érzékelő, ha azt akarom, hogy átlásson akárcsak az üvegen a mozgásérzékelő
amit jeleztél, az RCWL-0516 az radaros és ultrahangos mozgásérzékelő, ezért látja a földön a pulton át
A PIR nem fog átlátni semmin -
válasz
lanszelot #20756 üzenetére
Nincs más hátra, akkor egy ilyet kell a pultra építeni:
Rajzold már vagy fotózd le légyszi a pultot és a környékét, hátha eszembe jut valami jó ötlet! A pult széle alá nem lehet olyan optokaput tenni, ami magát a felugrást regisztrálja? Feltéve persze, hogy nem tud felülről ráugrani.Egyébként a HC-SR04 nem is hülye ötlet, ugyanis az ultrahang zavarja a macskákat, lehet, hogy nem is lesz kedve felugrani.
-
Janos250
őstag
válasz
lanszelot #20426 üzenetére
Az ilyen multishieldek alapvetően jók, sok minden van rajtuk. Ha nem a gyári programját használod, akkor valóban jó lesz sok mindenre.
Viszont idővel majd bizonyára átállsz az UNO-nál korszerűbb lapra, és akkor látod majd, mennyivel egyszerűbb lesz az életed, nagyjából ugyanannyi pénzből.
Breadboard:
Én ezért csináltattam az ESP32-mhöz panelt, amin sok minden rajtavan, és ha lehet, azt használom. Terveztem már a neten fennlévő, egészen jónak tűnő panelt is csináltatni, de egyelőre az még elmaradt. A 10 db. panel volt 5 $ (0.5 $ /db. , ha 10-et csináltattam.) igaz, hogy 3-4-nél többet nem használok, a többi megy a szemetesbe, de így is sokat segít. Bár a szállítás sajnos elég drága. -
Janos250
őstag
válasz
lanszelot #20424 üzenetére
Kíváncsiságból megnéztem ez a MultiFuncShield-et.
Sikerült olyan példát találnod, amire azt írják, hogy ÍGY NE!
Itt is leírták már párszor, hogy az isrCallBack() legyen a legrövidebb. Erre itt egy példa, ami mindent vizsgál, mindent csinál az ISR-ben. Persze, szegény ember vízzel főz, szegény kontrollerhez bonyolult szoftvert írunk, de a mai kontrollereken azért ennél már többet tudnak a hardverek, nem kell így csinálni.
Továbbá, ha már így csinálták meg, illet volna egy olyan függvényt beletenni, ami lekérdezve megmondja, hogy befejeződött-e az előző feladata, azaz jelen esetben beep-je, hiszen ez az ISR rutin a dolog jellegéből adódóan nem reentrant, azaz nem olyan, hogy futás közben egy másik szál megszakítsa, és újra elkezdje végrehajtani, majd miután ő befejezte, visszakerül a vezérlés az eredetire.
Itt persze alapfilozófiák ütköznek: mivel kezdjen a kezdő? Egyszerű, régi kontrollerrel, vagy modernebbel. Persze - némi artistamutatvánnyal - a régin is megcsinálható hasonló dolog, mint a korszerűbbön, de ez holt tudás lesz, mert idővel úgyis korszerűbbre áll át.Gimnázium első osztályában politechnika órán én is készítettem fémfűrésszel, és kézi reszelővel kalapácsot. Akkor ez egy alapnak számított. Ma inkább azt mondanám, hogy szívatás volt. Még kb 20 évvel ezelőtt is hallottam valakitől, hogy volt, ahol még akkor is csináltatták. Meg lehet persze így is csinálni, de CNC géppel könnyebb.
Én annak a híve vagyok, hogy kezdő is a korszerűbb dolgokkal kezdje, hogy ne holt információkat tanuljon meg, mint ez az interrupt kezelés a MultiFuncShield programjában, mert soha nem fogja így csinálni a későbbiekben. Ha csak nem mazochista.
-
vargalex
félisten
-
vargalex
félisten
válasz
lanszelot #20418 üzenetére
Csak belenéztem a lib-be, így egyáltalán nem biztos, amit írok. De azt látom, hogy a beep metódus csak belső változókat állít be és az osztály példány majd azzal dolgozik. Ez azt is jelenti, hogy a te kódod azonnal fut tovább (illetve lesz a 250 ms delay) és újra elkezdődik a loop, megint bemegy az if-be és újra inicializálja a beep-el a csipogást. Ezért hallod folyamatosan ugyan azt (szerintem).
-
-
Tomika86
senior tag
válasz
lanszelot #20412 üzenetére
De nem jól van paraméterezve a beep függvény. A mellette levő komment se jó.
Ahol a setup blokkban van ott csak egyszer fut le.
A másodiknál a loopban folyamatosan ismétlődik, 250ms delay van a végén csak. Tegyél nagyobb delayt a próba kedvéért, delay(10000)MFS.beep(5, // beep for 50 milliseconds
5, // silent for 50 milliseconds
4, // repeat above cycle 4 times
3, // loop 3 times
50 // wait 500 milliseconds between loop
); -
vargalex
félisten
válasz
lanszelot #20383 üzenetére
Szia!
A kolléga által bemásolt kódrészletben egyértelműen ott van megjegyzésként a value-nál:
deprecated,moved to decodedIRData.decodedRawData ///< Decoded value / command [max 32-bits]
Nyilván fejlődött, módosult közben a példához képest a lib. Ezt neked kell lekövetned, vagy aktuális példát kell keresni. A fenti struct-ból látszik, hogy neked nem a
decode_results
-ra van szükséged, hiszen szinte minden deprecated. Ahogy láthatod, átkerültek adecodedIRData
-ba.
De egyébként a readme-ban minden le van írva. Érdemes szétnézni az példák között esetleg.. -
-
-
válasz
lanszelot #20378 üzenetére
Nézd erősebben:
struct decode_results {
decode_type_t decode_type; // deprecated, moved to decodedIRData.protocol ///< UNKNOWN, NEC, SONY, RC5, ...
uint16_t address; // Used by Panasonic & Sharp [16-bits]
uint32_t value; // deprecated, moved to decodedIRData.decodedRawData ///< Decoded value / command [max 32-bits]
uint8_t bits; // deprecated, moved to decodedIRData.numberOfBits ///< Number of bits in decoded value
uint16_t magnitude; // deprecated, moved to decodedIRData.extra ///< Used by MagiQuest [16-bits]
bool isRepeat; // deprecated, moved to decodedIRData.flags ///< True if repeat of value is detected
// next 3 values are copies of irparams values - see IRremoteint.h
uint16_t *rawbuf; // deprecated, moved to decodedIRData.rawDataPtr->rawbuf ///< Raw intervals in 50uS ticks
uint_fast8_t rawlen; // deprecated, moved to decodedIRData.rawDataPtr->rawlen ///< Number of records in rawbuf
bool overflow; // deprecated, moved to decodedIRData.flags ///< true if IR raw code too long
}; -
-
its_grandpa
tag
válasz
lanszelot #20330 üzenetére
>>.... mindegy melyik chippen. Általában az a 2-es pin.
Nem mindegy - Uno WiFiRev.2, Due, Zero, MKR Family and 101 boards the interrupt number = pin number.>> Serial print -ek lényegtelenek, az csak az ellenőrzéshez kellettek.
Aha, ellenőrzés - sem a counter, sem a currentDir változó értékét nem módosítod.Egy kis olvasni/tanulni való - [link]
>>'digitalPinToInterrupt' was not declared in this scope.
Hát igen, ehhez a makróhoz bizony kell egy #include <pins_arduino.h>>>Mi az az ISR?
A milánói kedvenc kocsmámba van kiírva,rövidítés. Itt Senkisem Római.A többiek kommentjeit olvasva úgy látom a stílusod náluk sem aratott osztatlan sikert.
Én elgondolkoznék a helyedben. -
#68216320
törölt tag
-
Undoroid
őstag
válasz
lanszelot #20342 üzenetére
" amit osztottam link az usb-s, csak nem nézted meg. " Meg akartam nézni Én is, de a linked nem működik, elrontottad! Nincs ezzel baj, mindenkivel előfordulhat!
" nem értem miért ellenségeskedtek, semmi rosszat nem írtam, segíteni próbáltam, és hogy huszon év után rosszul emlékeztem a nevére, na bumm. " Sokak próbáltak neked olyan nyakatekert feladatokban segíteni türelemmel, lépésről - lépésre és nem váltottak olyan hangnemre egyből, mint ahogyan azt Te tetted! Azért vagyunk itt, hogy önzetlenül segítsük egymást és nem azért, hogy a legapróbb hiba miatt kifigurázzuk/kinevessük egymást! Nem akarlak kioktatni, de jobb a békesség!
-
#68216320
törölt tag
válasz
lanszelot #20334 üzenetére
Egyrész már 2x leírtam, hogy USB kell. Nem tudom ezen mi olyan érthetetlen.
Másrészt a pcie kártyán attól hogy van mondjuk IDE vezérlő, még nincs floppy vezérlő. Erre írtam hogy IDE nem ugyanaz, mint a floppy.
A nagy szakértelmeddel rohadtul nem segítettél semmiben.
Egyrészt kimatekoztad, hogy nem ebbe a csoportba való téma.
Másrészt ajánlgatsz pcie IDE vezérlőt floppy-hoz.
Mindezt úgy, hogy STM32/ESP MCU-t akartam USB-s eszközként használni, mert USB-s floppy kell!!!Tudod mit, inkább ne akarj segíteni!
-
#68216320
törölt tag
válasz
lanszelot #20332 üzenetére
Na akkor a részletek:
Az "IDE Controller" nagyon nem ugyanaz, mint a "Floppy Controller".
Másrészt USB-s megoldást szeretnék. De ezt említettem is.
"Azonban szükségem van USB-s floppy meghajtóra"Nem arra kértem tanácsot, hogy mit használjak, hanem arra, hogy mondjuk STM32-vel hogyan tudnék hagyományos pc floppy drive-ot USB-s eszközként illeszteni.
És szerintem pontosan ebbe a topic-ba tartozik.Közben talán találtam egy lehetséges, bár kezdetleges megoldást: [link]
-
lanszelot
addikt
válasz
lanszelot #20328 üzenetére
Már nem tudtam hozzá írni.
itt van a link ahol olvastam
Serial print -ek lényegtelenek, az csak az ellenőrzéshez kellettek.
Kikerültek volna, ha működik Digispark-al -
its_grandpa
tag
válasz
lanszelot #20318 üzenetére
Ez a kód (szerintem) annyi sebből vérzik, hogy kénytelen vagyok ....
Az ISR-ben használt változók, volatile, tehát a definiciók:
volatile int keses = 1000;
volatile uint32_t lastms= 0;ISR-ben nem írunk a soros portra, ha jót akarunk magunknak.
Vegyunk fel a változásra egy boolean-t.volatile bool tekertem = false;
void teker(){
if (millis() - lastms > 200)
{
lastms = millis();
tekertem = true;
if(digitalRead(DT) == currentStateCLK) keses = keses+100;
else if (keses > 100) keses = keses-100;
lastStateCLK = currentStateCLK;
}
else tekertem = false;
} /* teker fv end */A void loop() -ban lehet kiírni a soros portra ha volt tekerés
if (tekertem)
{
serial.print-ek
}Sem a counter, sem a currentDir változó értékét nem módosítod, mindig ua.-t fogja kiírni.
És a hab a tortán.
Nem is értem miért működik mert ugyan INPUT_PULLUP a 2,3-as pin de az ISR fv. a 0-as pin-re van konfigurálva, nem szépen.attachInterrupt(0, teker, CHANGE);
Így illene:attachInterrupt(digitalPinToInterrupt(PIN), teker, CHANGE);
-
lanszelot
addikt
válasz
lanszelot #20315 üzenetére
Először is nagyon szépen köszönöm a segítséget mindenkinek
Elfelejtem, hogy van nekem egy Arduino Mega 2560, amit a készlethez kaptam
Azal azonnal meg lett a probléma.Digispark nem tudja kezelni a Rotary Encoder-t.
51% memoria használat van, tehát nem az a gond.
Ugyanaz a program Mega-n tökéletesen fut.
Digispark-on a fent említett problémát dobja.
Annyi a Digispark-on a változtatás, hogy a pin-eket módosítom így:#define led 0
#define CLK 2
#define DT 1Itt a program ami Mega-n gond nélkül működik:
/*LED input*/
#define led 13
/*rotary encoder input*/
// Rotary Encoder Inputs
#define CLK 2
#define DT 3
int counter = 0;
int currentStateCLK;
int lastStateCLK;
int keses = 1000;
String currentDir ="";
uint32_t lastms= 0;
void teker(){
if (millis() - lastms > 200)
{
Serial.print("Direction: ");
Serial.print(currentDir);
Serial.print(" | Counter: ");
Serial.println(counter);
Serial.print(" | késés: ");
Serial.println(keses);
lastms = millis();
if(digitalRead(DT) == currentStateCLK){
keses = keses+100;
}else{
if(keses > 100){
keses = keses-100;
}
}
// Remember last CLK state
lastStateCLK = currentStateCLK;
}
}
void setup() {
// Set encoder pins as inputs
pinMode(CLK,INPUT_PULLUP);
pinMode(DT,INPUT_PULLUP);
/*LED pin output*/
pinMode (led, OUTPUT);
// Setup Serial Monitor
Serial.begin(9600);
// Read the initial state of CLK
lastStateCLK = digitalRead(CLK);
/* meghívjuk az fv.-t ha LOW-ra húzod a pin-t */
attachInterrupt(0, teker, CHANGE);
}
void loop() {
// Read the current state of CLK
currentStateCLK = digitalRead(CLK);
/*red led on off*/
digitalWrite(led, HIGH);
delay(keses);
digitalWrite(led, LOW);
delay(keses);
} -
Janos250
őstag
válasz
lanszelot #20315 üzenetére
Esetleg ezt is érdemes lehet megnézni, bár nem egy túlkommentelt program.
https://prohardver.hu/tema/arduino/hsz_9926-9926.html -
lanszelot
addikt
válasz
lanszelot #20311 üzenetére
Meg kell várjam a Nano -mat, mert lehet, hogy a RotEnc hibás.
A linkelt pelda sem működik, pedig annak már kellene.
/SW nincs bekötve, így semmit se jelent az a pár sor jelenleg/keses változó vagy nem változik, vagy nem kerül be a delay -be.
/*LED input*/
#define led 0
/*rotary encoder input*/
// Rotary Encoder Inputs
#define CLK 2
#define DT 1
#define SW 4
int counter = 0;
int currentStateCLK;
int lastStateCLK;
int keses = 1000;
String currentDir ="";
unsigned long lastButtonPress = 0;
void setup() {
// Set encoder pins as inputs
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT_PULLUP);
/*LED pin output*/
pinMode (led, OUTPUT);
// Setup Serial Monitor
Serial.begin(9600);
// Read the initial state of CLK
lastStateCLK = digitalRead(CLK);
}
void loop() {
// Read the current state of CLK
currentStateCLK = digitalRead(CLK);
// If last and current state of CLK are different, then pulse occurred
// React to only 1 state change to avoid double count
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
// If the DT state is different than the CLK state then
// the encoder is rotating CCW so decrement
if (digitalRead(DT) != currentStateCLK) {
counter --;
currentDir ="CCW";
if(keses > 100){
keses = keses-100;
}
} else {
// Encoder is rotating CW so increment
counter ++;
currentDir ="CW";
keses = keses+100;
}
Serial.print("Direction: ");
Serial.print(currentDir);
Serial.print(" | Counter: ");
Serial.println(counter);
}
/*red led on off*/
digitalWrite(led, HIGH);
delay(keses);
digitalWrite(led, LOW);
delay(keses);
// Remember last CLK state
lastStateCLK = currentStateCLK;
// Read the button state
int btnState = digitalRead(SW);
//If we detect LOW signal, button is pressed
if (btnState == LOW) {
//if 50ms have passed since last LOW pulse, it means that the
//button has been pressed, released and pressed again
if (millis() - lastButtonPress > 50) {
Serial.println("Button pressed!");
}
// Remember last button press event
lastButtonPress = millis();
}
// Put in a slight delay to help debounce the reading
delay(1);
} -
Janos250
őstag
válasz
lanszelot #20306 üzenetére
Én úgy gondolom, olyan nincs, hogy kétszer egymás után ugyanaz a csatorna változzon úgy, hogy közben a másik nem változik.
https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/ -
válasz
lanszelot #20299 üzenetére
Akkor viszont kapcsold ki az interruptot a teker() elején, és a végén kapcsold vissza.
Az a baj, hogy ezzel nem pergésmentesítesz, mert az interrupt megszakítja az interruptot minden váltásnál.
Szerk.: Pergésre egyébként inkrementális jeladónál nem lehet így kompenzálni. Alapelv, hogy semmilyen állapotot nem szabad elszalasztani, másképp ugrott az INKREMENTÁLIS jellege. Ha van is pergés, +/- 1 felbontást ugrál oda vissza, mert ahol a clk prellez, ott a dt nem, és vica versa. Ezt kell lekezelni, ha nagyon fontos a pergésmentesség, de saját szájízre nem szabad blokkolni a számolást.
Ugyanez igaz a nagy felbontásra. Ne az inkrementek skippelésével kezeld, hanem vezess be egy plusz változót, és a valós értékben az inkrementeket vezesd, és a keses legyen inkrementek/1000 például. Ez prellmentesít is.
-
válasz
lanszelot #20292 üzenetére
Ha külön-külön is szeretnéd működtetni a két LED-et, akkor a digispark pin0-ra az egyik LED rövid, a másik LED hosszú lábát kell kötni! Amelyik rövid lába van a pin0-n, annak a hosszú lábát az R1-re kösd (+5V), ez a pin0 alacsony szintjére kapcsol be, a másiknál pedig fordítva, a hosszú lábát a pin0-ra és a rövidet az R2-re (GND), ez magas szintnél fog világítani. Hogy egyik se világítson, a pin0-t INPUT-ra kell állítani.
-
válasz
lanszelot #20292 üzenetére
void teker(){
currentStateCLK = digitalRead(inputCLK);
if(digitalRead(inputDT) == currentStateCLK){
keses = keses+100;
}else{
if(keses > 100){
keses = keses-100;
}
}
previousStateCLK = currentStateCLK;
}
Ne korlátozd időben az interruptot, mert azzal lépéseket hagyhatsz ki.A currentState és a previousState pedig az interrupton belül legyen kezelve, mert az interrupt bárhol történhet a futás során. Akár a loopban lévő értékadás előtt vagy után is, ami következetlenné teszi a viselkedését.
-
-
válasz
lanszelot #20287 üzenetére
A kolléga nagyon szépen leírta helyettem a problémát és a megoldást is
A 3 és 4 lábat csak abban az esetben használhatod, ha nem tervezel semmilyen usb jellegű felhasználást (pl keyboard emuláció stb) és azok a lábak csak akkor fognak rendesen működni, ha a cucc nem adatportba van dugva, mivel a számítógép folyamatosan kommunikál azokon. Ezen kívül a 3as porton van egy 1,5k felhúzó ellenállás, amit nem tudsz kikapcsolni, ez általában nem zavar, mert amúgyis szokás felhúzni olvasáskor, de engem már tréfált meg, hogy nem vettem figyelembe:
Azért írtam, hogy használd csak az első 3 lábat (0-2):
- a 0-ra kösd a két LED-et,
- a 2 legyen a CLK, mert arra van külső interrupt,
- a DT meg legyen az 1. -
válasz
lanszelot #20283 üzenetére
Nem tudom milyen enkódered van, de kénytelen leszel vagy interruptot használni, vagy ütemezőt, ahogy Aryes is írta.
Ha az a tipik pozícióba billenős kattogós enkódered van, akkor hiába forgatod, mert annak a clock lába mindig ugyanaz a stabil állapotban.
Mivel a kódod csak két villogás között mintavételez, ezért mindig csak az az állapot számít, ami a kék led kialvása + keses utáni DE a piros felvillanása előtti időben, azaz pár mikroszekundumban áll fenn. Tehát neked akkor kellene a CLK egy pillanatra más legyen. De ezt nagyon nehéz elkapni, leginkább lehetetlen, ezért a kódod folyamat azt látja, hogy a CLK változatlan, így nem tesz semmit a keses értékével.Interrupttal azt tudod csinálni, hogy a uC figyeli az inputot, és amint az változik, végrehajt egy kódot (esetedben a loop
/*read current state of inputCLK*/)
Ennek köszönhetően a kód nem marad le a váltásokról, mert az interrupt szépen kierőszakolja a futást minden váltáskor.
Ütemezéssel pedig maradhat így a kódod, csak a delay-eket törlöd, és helyettesíted if() feltételekkel. Esetedben 4 ütemre van szükség: redOn, redOff, blueOn, blueOff. A kód elején meghatározod, hogy a piros először mondjuk a futás első másodpercében kell felvillanjon (redOn = 1000). Akkor kialudnia redOff = redOn+keses; időben kell. A blueOn ideje redOff+keses. blueOff = blueOn+keses. Ezután csak kitalálod if használatával, hogy a futásidő millis() éppen melyik ütemen belül van, és annak az ütemnek a feladatát hajtja végre. Mikor az utolsó ütemből is kilépsz, újra kell számolni az ütemek új időpontját. Így a loop nagyon gyorsan ismétlődik, és van esély, hogy nem marad le a futásod az enkóder mozgásáról. Igen, arra is van esély, hogy lemarad, főleg attól függően, hogy mennyire bonyolult marad egy-egy ütem.
-
válasz
lanszelot #20282 üzenetére
Ugye nem felejtetted el, hogy a 3-as pin egyben az USB egyik data vonala is? USB portba dugva nem fog működni, powerbank-ba dugva talán.
Szerk.: csak most néztem végig a programot, ez ebben a formában semmiképp nem fog működni, mert több másodperc delay van minden egyes beolvasás közt, miközben egy rotary encoder forgatása másodpercenként több tucat impulzust is generál. Vagy interrupt kell a beolvasáshoz, vagy minden delay-t likvidálni kell.
Egy tipp: ha lábat szeretnél spórolni, egy lábra két LED-et is rá tudsz kötni, egymáshoz képest fordítva (pin-GND és pin-+5V közé), így az egyik magas, a másik alacsony állapotnál világít, kikapcsolni pedig a port input-ra állításával lehetséges.
-
válasz
lanszelot #20229 üzenetére
Az a nagyon nagy baj, hogy amíg ezt ide leírtad, addig beírhattad volna a Google-be, ahol a legelső találat elmagyarázza, még a link is ott van, ahonnan le lehet tölteni.
A hex fájlon mi bonyolult van? Írtam én olyat, hogy meg kell érteni?
Be kell tallózni, ahová a kép mutatja, megnyomni a Go-t és kész.
-
válasz
lanszelot #20221 üzenetére
Ugye arra az Attiny85-re, amit a másik topikban tárgyalt programozóba dugsz, amihez utána nem tudod telepíteni a drivert, nem az Attiny85 board-ot kiválasztva próbálsz bootloader-t feltölteni, hanem a Digistump-ot választod ki hozzá és annak a bootloader-ét töltöd rá?
-
vargalex
félisten
-
its_grandpa
tag
válasz
lanszelot #20147 üzenetére
bool b_measure = false;
static bool measure_environment( float *temperature, float *humidity )
{Nem, mert ez így nem lokális változója a függvényednek.
Igy :static bool measure_environment( float *temperature, float *humidity )
{
bool b_measure = false;Gonosz kérdés, hány i változó van az alábbi kódrészletben ? :
int i = 5;
void teszt_elek() {
int i = 0;
for ( i = 10 ; i > 0 ; i-- )
{
..... ;
}
} -
its_grandpa
tag
válasz
lanszelot #20112 üzenetére
Alakul ez és közben a többiektől minden kérdésedre megkaptad a választ.
Néztem a kódodat, csak egy apró észrevétel.
A measure_environment() fv.-ben két return van.
Structured programming says you should only have one return statement per function.
Legyen egy fv. lokális változód - ebben az esetben pl. bool b_measure - és a fv. végén csak egy return( b_measure );
Ha megszokod a több return-ozást előbb-utóbb olyan fv.-ket fogsz írni ami n+1 return-t tartalmaz, ami (szerintem) nem szerencsés. -
-
lanszelot
addikt
válasz
lanszelot #20127 üzenetére
2ik kérdés visszavonva.
Valami miatt 4 jegyű számokat ít ki gombNyomas értékének, de valójában nem az
Ezt ne mértem miért.
Csak újra rátöltöttem ugyanazt a programot, semmit se változtattam, és gombNyomas értéke 1-4
Viszont akkor is jól működött amikor hülyeséget írt ki /4 jegyű számmal/.lehetséges, hogy a serial monitor hibásan működött?
-
-
válasz
lanszelot #20097 üzenetére
Egyszerű. Ha egy kód nem működik és kérdezni szeretnél róla, ahhoz nem elég, ha csak te látod a kódot. Egyrészt mert nem biztos, hogy ott van a hiba, ahol keresed, másrészt az ember nehezebben találja meg a saját maga által elkövetett hibát.
A *.h fájl azért pár soros, mert csak a definíciókat tartalmazza. Az érdemi kód a *.c, *.cpp fájlokban van. Ha szeretnéd tudni, hogy mit tartalmaz egy library, ezeket nyisd meg, fogsz benne látni egy nagy csomó függvényt, aminek remélhetőleg beszédes neve van és elmondja, hogy mit csinál, illetve meg tudod nézni, hogy pontosan milyen paramétereket vár. Ezen túl minden library mellé szoktak tenni example fájlokat, amikből kiderül, hogy hogyan kell ezeket használni, ezekből komplett kódrészleteket lehet némi módosítással átemelni a saját kódodba, illetve én például sokszor eleve ezeket szoktam átírni.
A kollégának amúgy igaza van, ez az Arduino topik, nem a programozás alapjai, szóval érdemes lenne valamilyen tutoriallal folytatni az ismerkedést, illetve használd többet a Google keresőt, mert a legtöbb kérdésedre nagyon jó leírások vannak az interneten...
Persze itt mindenki nagyon segítőkész, és sokszor van szó általános programozással kapcsolatos dolgokról is, de na...
-
Tomika86
senior tag
válasz
lanszelot #20097 üzenetére
Lehetséges, hogy jobb lenne egy kis elméletet is tanulni elöbb, mert itt annyi mindent mondanak, hogy elvesztetted a fonalat.
Vannak tök jó videók is mi miért van úgy, vannak jó könyvek pdf-ek.Tök jó hogy rakosgatod össze itt a programot, de valami alap kellene hozzá,hogy képben legyél.
-
válasz
lanszelot #20092 üzenetére
Na ezért mondtam, hogy kíváncsi lennék, hogy hogy tetted ki a változó definíciót, mert a nyakamat tettem volna rá, hogy az egész sort értékadással együtt átraktad, de persze az ember látatlanban találja ki egy felületesen megfogalmazott félmondatból...
Ez a definíció, ezt ki tudod tenni a program elejére:
int sensorValue;
int isgas;Ez pedig az értékadás:
sensorValue = analogRead(A0);
isgas = digitalRead(2);ezt értelemszerűen nem tudod kívülre tenni, egyrészt mert ott le sem fut, másrészt meg mert nincs is értelme, mert a függvény szerves részét képezi.
Új hozzászólás Aktív témák
Hirdetés
- ThinkPad T490 27% 14" FHD IPS i7-8565U 16GB 512GB NVMe ujjlolv IR kam új akku gar
- X1 Tablet Gen3 13" 3K IPS érintő i7-8550U 16GB 512GB NVMe ujjlolv IR kam 4G LTE gar
- Corsair CX750M 750W Moduláris Tápegység
- DJI Mini 3 Fly More Combo drón telefonos távirányítóval
- Core i7 9700 processzor - 6 hó garival
- Eredeti DELL 240W töltők (LA240PM160)
- REFURBISHED és ÚJ - HP Thunderbolt Dock G2 230W docking station (3TR87AA)
- ÖRÖK GARANCIÁVAL - OLCSÓ, LEGÁLIS SZOFTVEREK 0-24 KÉZBESÍTÉSSEL - Windows - Office - LicencAruhaz.hu
- iKing.Hu - Apple iPhone 14 Pro Max - Gold - Használt, szép állapot
- LG 45GS95QE - 45" Ívelt OLED / 2K WQHD / 240Hz 0.03ms / NVIDIA G-Sync / FreeSync Premium / HDMI 2.1
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest