Hirdetés
- A Sony megmutatja milyen monitor illik a PlayStation 5-höz
- E-book olvasók
- AMD GPU-k jövője - amit tudni vélünk
- SteamOS gyere már PC-re! Nem, még nem jött el az idő.
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Milyen széket vegyek?
- AMD Navi Radeon™ RX 6xxx sorozat
- Home server / házi szerver építése
- Projektor topic
- Milyen billentyűzetet vegyek?
-
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
-
tvamos
nagyúr
válasz
Teasüti
#3395
üzenetére
A MCU-k világában már inkább software-es a prellmentesítés. (En speciel ritkán nem teszek fel legalább egy kis kerámia kondit.) Régen, amikor még kevés volt a program memória, (pl. fél kByte-nál is kevesebb,) meg amikor kapukból építettük a logikát, akkor az volt, amit a kolléga írt.
-
Teasüti
nagyúr
Nyitáskapcsolóhoz miért kell a CHANGE?
Miért nem egyszerűbb egy eseményt figyelni kettő helyett?
Az ilyen state = !state féle váltók amúgy se túl praktikusak ilyen exakt dolgokra, ahol azt kell figyelni, h mikor történik meg egy esemény. Ez szvsz inkább ott használatos, ahol az on/off állapotoknak semmi jelentőségük (akarom mondani felcserélhetők), mint egy LED villogtatása. De azért egy biztonsági kapcsolót nem így kezelnék.Nem macerás egyáltalán, ha megnézed a linken - amit a prell-nél raktam ide - mi történik a jelszinttel kapcsolás közben, akkor láthatod, hogy itt nem egy és nem is kettő megszakítás történik, de minden tüske felfutásánál és lecsengésénél lesz egy CHANGE állapotváltozás. Ezt írták feljebb, hogy ha épp páros számú megszakítás érkezik, akkor ebből te nem veszel észre semmit, mintha mi sem történt volna.
-
Zahze
csendes tag
válasz
Teasüti
#3385
üzenetére
"mint az őrült azt a ledet" - Hogy kéne írnom ?

Amúgy ez csak egy egyszerű példa lenne rá, hogy valami nem kóser a megszakításkezeléssel egy ekkora programba se. (Lehetőség szerint, kizárni a programozási hibát...)
Amúgy ez egy riasztórendszerhez kéne, szebb lett volna így megoldani, ha már van benne ilyen lehetőség hogy megszakításokat használjak. Eddig amúgy a loop-ba volt simán if(digitalRead(2)) - el megoldva, az működött...
Kapcsolási hibát... hát, ennél egyszerűbben nem tudnék semmit összekapcsolni
Szóval szerintem nem ott a hiba.A kapcsolást is és a képet is az Elektromanoid-ról szedtem. Annyi változtatás van az én kapcsolásomban hogy egy NC-s nyitásérzékelővel működik.

Ennyire macerás/instabil ez a jelszint váltás elkapása az arduino számára ?

-
gyapo11
őstag
válasz
Gergosz2
#3392
üzenetére
A hardware-es a legtutibb, a kondi is jó lehet, ha jól el van találva a kapacitása, de lehet akár két nand kapuból váltókapcsolóval, az holtbiztosan egyet billen a lenyomásra és vissza a felengedésre. Vagy lehet hiszterézises hall cella egy mágnessel, vagy valami optokapu stb.
-
zka67
őstag
válasz
Teasüti
#3390
üzenetére
Jaja, rossz a megközelítés. Én 100ms-es timer megszakítással szoktam lekérdezni a nyomógombokat, így simán ki lehet szűrni a prelleket, és a megszakítás alatt még azt is lehet ellenőrizni, hogy a gomb most lett lenyomva, vagy már le volt nyomva stb, stb... és egy inkey() rutinnak átadni a paramétert. Én úgy szoktam, hogy ha az inkey() 0 értékkel tér vissza, akkor nem volt gombnyomás, különben a gomb értékét adom vissza.
-
tibi-d
tag
Sziasztok!
Nekem is kellett olyan feladatot megoldani, hogy egy nyomógomb megnyomására csak egyszer hajtson végre egy műveletet. Úgy oldottam meg, hogy egy időzített megszakítás minden 100ms alatt 1X lefut, és ez alatt a ciklus alatt figyeltem a gomb állapotát. Ha eltért az alaphelyzettől, egy segédváltozót 1-be állítok, és elvégeztetem a feladatot(kat), és a segédváltozót csak azután állítom vissza, ha minden végrehajtódott. Addig nem is figyelem a gomb állapotát. Ez akkor hasznos, ha a köztes időben is tudni kell, hogy meg lett nyomva a gomb, és így nincs korlátozva az egyéb feladat végrehajtása sem. Természetesen az időzítés mértéke szabadon állítható. -
gyapo11
őstag
válasz
Teasüti
#3387
üzenetére
A te megoldásod se jó, ha van prell. A prell ugyanis pont olyan, mint a nyomógomb rendes működése, csak gyorsan történik. Tehát ha nincs a beolvasásban időzítés, hanem rábízzuk a sebességet a processzorra, akkor az olyan gyors, hogy simán feldolgozza a ms nagyságrendű prellt is, és lekezeli mint gyors gombnyomkodást.
Kis késleltetés (10 ms körüli) megoldja, persze nem elegáns delay-jel, hanem millis-sel, hogy közben azért a program futhasson. Az interruptos megoldásnál meg az kell, hogy amikor beérkezik az első állapotváltás, akkor egy időzítést indítani, és ezt figyelni az interrupt függvényben, ha az időzítés még nem járt le, akkor figyelmen kívül kell hagyni az állapotváltásokat, mert azok a prell miatt vannak. Ha lejárt az időzítő, akkor megint ki lehet szolgálni a következő 1 db állapotváltást. Az interrupt függvényben ugyan nem működik a millis, de a meghíváskori állapota is megfelelő.
És lehet azt is csinálni, hogy két állapotváltás közötti időt mérni, és ha az kisebb egy adott értéknél, akkor figyelmen kívül hagyni. Pl. 20 ms-en belül ember nem tudja megnyomni kétszer, a prell meg ez idő alatt lecseng. -
Teasüti
nagyúr
válasz
gyapo11
#3386
üzenetére
Gombnyomásra én ezt alkottam:
//button press
if (digitalRead(8) == HIGH && !button) {
button = true;
Serial.println("Pressed");
}
else if (digitalRead(8) == LOW) button = false;Loop-ban fut természetesen és fogalmam sem volt eddig ilyen pergés effektről.
Sosem aktivál egynél többször; ezért merem ajánlani a kollégának.
Felengedésre ír vmit az else if-be és voilá!
Nem volt róla szó milyen gombról van szó.
Talán akkor a pergésmentesítéssel jobban jár, ami a linket van.Vagy lehet olyat, hogy egy lábra két megszakítást kapcsolok?
LOW és RISING? -
gyapo11
őstag
válasz
Teasüti
#3385
üzenetére
Nem az lehet a gond, hogy a gombnak prellje van, és egy nyomás vagy fölengedés valójában n db change, és ezeket a gyors interrupt kiszolgálás mind meg is csinálja? Ha páratlan számú, akkor jól működik, ha páros, akkor viszont látszólag nem történik semmi, valójában annyiszor váltott, csak ezt nem lehet látni.
-
Teasüti
nagyúr
-
Zahze
csendes tag
Sziasztok.
Kérnék egy kis segítséget a megszakításkezeléssel kapcsolatban.
Ami leírást találtam róla így első körbe, az alapján leírtam ezt a kódot.int led = 9;
volatile int state = LOW;
void setup() {
pinMode(led,OUTPUT);
attachInterrupt(0,blink,CHANGE);
}
void loop() {
digitalWrite(led,state);
}
void blink() {
state = !state;
}Nah most annyi lenne a bajom, hogy nem működik stabilan a Led ki/bekapcsolása amikor lenyomom a gombocskámat, amit a Mega 2-es lábára kapcsoltam, persze felhúzó ellenállást használva.
Ez mitől lehet ? A leírásokból úgy vettem ki hogy a CHANGE-el, akkor is változnia kéne a Led állapotának amikor lenyomom a gombot, és akkor is amikor felengedem a gombot. Ugyanakkor, van amikor nem veszi figyelembe valamelyik eseményt...
Ez mitől lehet ? -
quint
aktív tag
Felraktam egy viszonylag tömör megoldást az általad használt bekötéssel (a szegmensek hivatalos elnevezését használtam, a bekötés pontosan megegyezik a tiéddel). Közös anódos kijelzőhöz készült (a tiéd is), közös katódoshoz a 12.-18. sorokból ki kell venni a negálást.
Először bökj a "Code Editor" gombra, ott majd meg tudod nyitni a "Serial Monitort", aztán mehet a szimuláció (a soros monitoron írhatod be a megjeleníteni kívánt számjegyet).
A 25. sorban a 0-9 tartományon kívül eső számok esetén minden szegmens törlődik.
A 31. és 32. sorban nincs korrekt hibakezelés, de annyit láthatsz belőle, hogy a soros vonalról jövő ASCII kódot ("0" - 48 ... "9" - 57) át kell alakítani a megfelelő számjeggyé (ez nálad hiányzott).A tizedespont kezelésével nem foglalkoztam. Ha libraryt akarsz készíteni belőle, akkor valószínűleg nem fog különösebb gondot okozni.
-
Sokimm
senior tag
válasz
Janos250
#3380
üzenetére
Igen igen, a következő lett az eredmény (csak konzolról nem tudom beolvasni az értéket... A switch case-ig nem jut a beolvasott érték. :\)
sevensegment.ino
#include "sevensegment.h"
sevensegment kijelzo(7, 9, 11, 8, 10, 6, 12, 13);
void setup()
{
Serial.begin(9600);
Serial.println("csak 1-9 kozotti erteket adj meg!");
}
void loop()
{
kijelzo.kiir(Serial.read());
delay(500);
}sevensegment.h
#ifndef sevensegment_h
#define sevensegment_h
#include <Arduino.h>
class sevensegment
{
private:
byte _f; byte _k; byte _a; byte _bf; byte _ba; byte _jf; byte _ja; byte _p;
public:
byte szam;
sevensegment(byte f, byte k, byte a, byte bf, byte ba, byte jf, byte ja, byte p);
void kiir(byte szam);
};
#endifsevensegment.cpp
#include "Arduino.h"
#include "sevensegment.h"
#include "pins_arduino.h"
sevensegment::sevensegment(byte f, byte k, byte a, byte bf, byte ba, byte jf, byte ja, byte p)
{
pinMode(f, OUTPUT);
_f = f;
pinMode(k, OUTPUT);
_k = k;
pinMode(a, OUTPUT);
_a = a;
pinMode(bf, OUTPUT);
_bf = bf;
pinMode(ba, OUTPUT);
_ba = ba;
pinMode(jf, OUTPUT);
_jf = jf;
pinMode(ja, OUTPUT);
_ja = ja;
pinMode(p, OUTPUT);
_p = p;
}
void sevensegment::kiir(byte szam)//
{
switch (szam) {
case 0:
Serial.println("nulla");
break;
case 1:
digitalWrite(_jf, LOW);//1
digitalWrite(_ja, LOW);
digitalWrite(_f, HIGH);
digitalWrite(_bf, HIGH);
digitalWrite(_k, HIGH);
digitalWrite(_a, HIGH);
digitalWrite(_ba, HIGH);
break;
case 2:
digitalWrite(_jf, LOW);//2
digitalWrite(_ja, HIGH);
digitalWrite(_f, LOW);
digitalWrite(_bf, HIGH);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, LOW);
break;
case 3:
digitalWrite(_jf, LOW);//3
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, HIGH);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, HIGH);
break;
case 4:
digitalWrite(_jf, LOW);//4
digitalWrite(_ja, LOW);
digitalWrite(_f, HIGH);
digitalWrite(_bf, LOW);
digitalWrite(_k, LOW);
digitalWrite(_a, HIGH);
digitalWrite(_ba, HIGH);
break;
case 5:
digitalWrite(_jf, HIGH);//5
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, LOW);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, HIGH);
break;
case 6:
digitalWrite(_jf, HIGH);// 6
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, LOW);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, LOW);
break;
case 7:
digitalWrite(_jf, LOW);//7
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, HIGH);
digitalWrite(_k, HIGH);
digitalWrite(_a, HIGH);
digitalWrite(_ba, HIGH);
break;
case 8:
digitalWrite(_jf, LOW);//8
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, LOW);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, LOW);
break;
case 9:
digitalWrite(_jf, LOW);// 9
digitalWrite(_ja, LOW);
digitalWrite(_f, LOW);
digitalWrite(_bf, LOW);
digitalWrite(_k, LOW);
digitalWrite(_a, LOW);
digitalWrite(_ba, HIGH);
break;
default:
break;
}
} -
Sokimm
senior tag
Sziasztok guruk!
Nem látom a hibám, kérlek segítsetek.
A hiba az inu-ban, kommentezve.
Jah ez egy 7 szegmenses kijelző vezérlése lenne, de nem tudok tovább jutni. :\sevensegment.inu:
#include "sevensegment.h"
void setup()
{
sevensegment kijelzo(7, 9, 11, 8, 10, 6, 12, 13);
}
void loop()
{
sevensegment.kiir(); // expected unqualified-id before '.' token
}sevensegment.cpp:
#include "Arduino.h"
#include "sevensegment.h"
#include "pins_arduino.h"
sevensegment::sevensegment(byte f, byte k, byte a, byte bf, byte ba, byte jf, byte ja, byte p)
{
pinMode(f, OUTPUT);
pinMode(k, OUTPUT);
pinMode(a, OUTPUT);
pinMode(bf, OUTPUT);
pinMode(ba, OUTPUT);
pinMode(jf, OUTPUT);
pinMode(ja, OUTPUT);
pinMode(p, OUTPUT);
}
void sevensegment::kiir(byte szam)
{
switch (szam) {
case 0:
Serial.println("anyad");
break;
default:
break;
}
}sevensegment.h:
#ifndef sevensegment_h
#define sevensegment_h
#include <Arduino.h>
class sevensegment
{
private:
public:
//byte f, k, a, bf, ba, jf, ja, p;
sevensegment(byte f, byte k, byte a, byte bf, byte ba, byte jf, byte ja, byte p);
void kiir(byte szam);
};
#endif -
tvamos
nagyúr
válasz
Teasüti
#3377
üzenetére
Szerintem nem megoldhatatlan ez a probléma. Ha nem sikerül kiküszöbölni 1-1 byte elvesztését, akkor azt kell megoldani, hogy a vevő tudja, hogy ott elveszett valami, és a küldő újra küldje a csomagot.
(#3375) Janos250 válasza gyapo11 (#3373) üzenetére
Persze... ez az professzionális alkalmazás lesz... -
Teasüti
nagyúr
válasz
Janos250
#3375
üzenetére
Érthető, hisz utóbbi úgy indul, h képezd ki magad cnc-ből és forgácsolásból. Majd vegyél cnc gépet.
Persze átvitt értelemben, de akár szó szerint is.
Ha meg szakembert bízok meg vele és gépet bérlek, akkor meg nem DIY.(#3363) gyapo11
Nem hiszem el, h ezt az arduino közösség még nem oldotta meg.
Elég alapvető igénynek tűnik, h parancsot lehessen küldeni az MCU-nak. -
gyapo11
őstag
válasz
Janos250
#3369
üzenetére
Köszi, akkor most már ezt is láttam.
Nem mondom, hogy mindent értek benne, de nyilvánvalóan nem assembly, tehát ez még csak egy utasítássorozat a fordítónak.
De a lényege a dolognak az, hogy ha megy a byte-ok kifütyülése (vegy beolvasása), és jön egy megszakítás, mert ki akarom szolgálni a távirányítót pl., akkor ezt hogy kezeli le a program, és hogy kezeli le az én programom, amiben meghívtam a soros portkezelő függvényt. És hogyan tudom kitalálni, hogy ha elveszett valami, akkor az miért történt?
Olyan ez, mint az állatorvos, aki nem tud átlépni a kerítésen, és bent van a beteg ló.
Az, hogy a c, c++ forrás elveszi előlünk a gépi kódot egyszer előny a könnyű használhatóságban, máskor hátrány a hibakeresésben.
Ezért van az, hogy ha hibába ütközik valaki, és föltesz egy kérdést, akkor a próbáld másik libbel, tölts le másik sku-t, próbáld másik IDE-vel tanácsok jönnek. Észre kell venni, hogy ez nem informatikai szakmunka hanem legozás, próbálgatás. -
gyapo11
őstag
válasz
Janos250
#3368
üzenetére
Mint ahogy írta valaki megvette az Atmelt.
De egyébként is az várható, hogy mindenféle mikrovezérlő meg fog jelenni arduino kompatibilisen lapon. Ez a nagy dolog az arduinoban. Amit szidok a debugolás hiánya, az pont előny abban, hogy ugyanazt a forrást le lehet fordítani a világ összes processzorára. És nem az a lényeg, hogy atmel ketyegjen rajta, hanem hogy működjön, az összes hobbista velem együtt ezért szereti. -
Janos250
őstag
válasz
gyapo11
#3366
üzenetére
"én pl. még nem láttam azt a kódot, ami akkor fog lefutni, amikor ezt a sort hajtja végre és küldi ki a soros portra a byte-okat"
Tessék:
size_t HardwareSerial::write(uint8_t c)
{
_written = true;
// If the buffer and the data register is empty, just write the byte
// to the data register and be done. This shortcut helps
// significantly improve the effective datarate at high (>
// 500kbit/s) bitrates, where interrupt overhead becomes a slowdown.
if (_tx_buffer_head == _tx_buffer_tail && bit_is_set(*_ucsra, UDRE0)) {
*_udr = c;
sbi(*_ucsra, TXC0);
return 1;
}
tx_buffer_index_t i = (_tx_buffer_head + 1) % SERIAL_TX_BUFFER_SIZE;// If the output buffer is full, there's nothing for it other than to
// wait for the interrupt handler to empty it a bit
while (i == _tx_buffer_tail) {
if (bit_is_clear(SREG, SREG_I)) {
// Interrupts are disabled, so we'll have to poll the data
// register empty flag ourselves. If it is set, pretend an
// interrupt has happened and call the handler to free up
// space for us.
if(bit_is_set(*_ucsra, UDRE0))
_tx_udr_empty_irq();
} else {
// nop, the interrupt handler will free up space for us
}
}_tx_buffer[_tx_buffer_head] = c;
_tx_buffer_head = i;sbi(*_ucsrb, UDRIE0);
return 1;
}Nem gondolom, hogy az Arduinot használók között túl sokan vannak, akik az assembly kódot akarják bogarászni. Aki mégis, az meg azt is tudja, hogyan kell a fordítót paraméterezni, hogy legyen egy közbülső assembly kódod is.
-
Janos250
őstag
Egy "amatőr" cég [Microchip
] honlapjáról egy ajánlás:"chipKIT Development Platforms Professional Tools Inspired by Arduino"
"Simple code development with the official Arduino IDE (v1.6.7 or later);
compatible with most Arduino functions and libraries"[link]
http://ww1.microchip.com/downloads/en/DeviceDoc/00001423C.pdfMár a Microchip saját oldalának ajánlatai között is szerepel Arduino?
-
gyapo11
őstag
Ha én írok minden utasítást, amit a processzor végrehajt, akkor ez igaz. A megszakításokat, a soros port kezelést, és mindent. És még ez sem pontos, hiszen egy a=5; programsor valójában lesz vagy 20 gépi kódú utasítás, és ha hibát/időzítést kell keresni, akkor nem az a=5; és társai sorokban kell, hanem a gépi kódban.
Rágen, még a dosos időkben volt a turbo pascal meg a turbo debugger. A debuggerbe betöltve a pascal forrást, mellette mutatta a forrásból fordított gépi kódot, a futási időket, na az hibakeresés volt. Az arduinon a beszúrt sorokkal led villogtatás vagy soros portra írás, az nem hibakeresés, csak annak egy nagyon halvány lenyomata.
Arduinonál írok egy programot, amibe belinkelek egy halom libraryt, van egy bootloader. A soros portot nem bitenként billegtetem időzítve, hanem serial.print, én pl. még nem láttam azt a kódot, ami akkor fog lefutni, amikor ezt a sort hajtja végre és küldi ki a soros portra a byte-okat. Ha nem láttam, akkor hogy tudnék benne hibát keresni? Ha nem tudok hibát keresni, akkor honnan tudnám megmondani, hogy miért vesznek el adatok?
Vagyis amikor kiírom a soros portra hogy hello, akkor nem tudom mit csinál a processzor.
Ha a hex file-t visszafordítanám assemblyre, ugyanezt a libekkel is meg a bootloaderrel is, akkor láthatnám, hogy mit csinál a processzor, de addig nem. -
zka67
őstag
válasz
gyapo11
#3363
üzenetére
Szia, bocs, hogy beleszólok, de
Amíg nem tudjuk pontosan, hogy bármely pillanatban mit csinál a processzor
az elég komoly probléma, elég gyenge programozóra vall.
Nem a processzor programoz minket, hanem mi programozzuk a processzort, az pedig végre kell hogy hajtsa az utasításainkat. Nem mást, hanem azt, amit leírunk neki. Ha tudjuk, hogy mit írunk le, akkor tudni fogjuk azt is, hogy melyik pillanatban mit csinál a processzor. Szerintem...
-
Janos250
őstag
válasz
Teasüti
#3361
üzenetére
Az okát jól leírta gyapo11.
Amatőr megoldás a problémára:
1. Az öregecske 328-as proci helyett egy korszerűbb. Nem drágább pl. egy ARM, ami sokkal gyorsabb, nagyobb a memóriája, korszerűbb. A megírt arduino program úgyanúgy (általában) fut rajta.
2. Multiprocesszor amatőr megoldása, hogy ha ragaszkodsz a 328-as procihoz, hogy egy picike külön 328-as Arduino panel (5-600 Ft), ami semmi mást nem csinál, csak a soros portot kezeli, ha lehet/szükséges előfeldolgozást végez, és akkor küldi át a ténylegesen dolgos procinak, amikor az kéri. -
gyapo11
őstag
válasz
Teasüti
#3361
üzenetére
A program feltöltése közben a mikrovezérlőn nem fut a kód, resettel kezdődik a feltöltés. Tehát minden figyelmét a soros porton érkező byte-okra fordítja.
Amikor viszont fut a kód, akkor ugrálnia kell a kód és a soros port etetése között, és itt bejöhet időzítési probléma, akadozás, ami adatvesztést eredményez. Sokszor elég egy kis delay, de a pontos megoldás mélyebb ismereteket igényel mind a mikrovezérlő működése mind a librarykban található kódot illetően.
Amíg nem tudjuk pontosan, hogy bármely pillanatban mit csinál a processzor, addig nem tudhatjuk az okot se a hibajelenségre. Ezért nem annyira alkalmas az arduino rendszer profi feladatmegoldásra, nincs megfelelő szintű debug, léptetés, regiszterek kiíratása, amivel meg lehetne találni a hibát. -
gyapo11
őstag
válasz
Daszkalosz19
#3360
üzenetére
A Relay változó nem a relé állapotát tárolja, hanem a port számát (4).
Ezt hiába vizsgálod az ifben, hogy HIGH-e az értéke.
Ezért kell egy másik változó, ami a port állapotát tartalmazza, ahogy írtam a kódban (rel). És ebbe a változóba be kell írni az aktuális állapotot, amit kivettél a kódból. -
Teasüti
nagyúr
válasz
gyapo11
#3354
üzenetére
Ez egy remekül összeszedett eszmefuttatás!

Amúgy mi az oka annak, h elvesznek bájtok a soros porton?
Én is küzdök ezzel a problémával és most már csak széttárom a karjaim.
De csak serial monitorból érkező adatok vesznek el, a küldött az hibátlan és a program feltöltés se hibázik. -
Daszkalosz19
aktív tag
válasz
gyapo11
#3359
üzenetére
Szia!
Jelenleg így néz ki a dolog. kiírja,hogy off,de a relé állapotváltozásra nem reagál
#include "DHT.h"
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define Relay 4
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110}; // Ez az é betű
byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ó betű
byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110}; // Ez a rövid ö betű
byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ő betű
byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111}; // Ez az á betű
byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101}; // Ez a rövid ü betű
byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101}; // Ez a hosszú ű betű
byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110}; // Ez a hosszú í betű
int maxHum = 80;
int maxTemp = 33;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
pinMode(Relay, OUTPUT);
Serial.begin(9600);
Wire.begin();
dht.begin();
lcd.begin(20, 4);
lcd.backlight();
{
lcd.setCursor(2, 0);
lcd.print("Kelteto vezerles");
lcd.setCursor(8, 0);
lcd.write(4);
lcd.setCursor(13, 0);
lcd.write(1);
lcd.setCursor(16, 0);
lcd.write(1);
lcd.setCursor(3, 1);
lcd.print(" By:Daszkalosz ");
lcd.setCursor(4, 2);
lcd.println(" 2016.07.26 ");
delay(3000);
lcd.clear();
}
lcd.createChar(1, e1); // Ez az é betű
lcd.createChar(2, a1); // Ez az á betű
lcd.createChar(3, o1); // Ez a hosszú ó betű
lcd.createChar(4, o3); // Ez a hosszú ő betű
lcd.createChar(6, u2); // Ez a rövid ü betű
lcd.createChar(7, u3); // Ez a hosszú ű betű
lcd.createChar(0, i1); // Ez a hosszú í betű
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
lcd.println("Szenzor ERROR!");
return;
}
if(h > maxHum || t > maxTemp) {
digitalWrite(4, HIGH);
} else {
digitalWrite(4, LOW);
}
// Hőmérséklet.
lcd.setCursor(0, 0);
lcd.print("Homerseklet: ");
lcd.setCursor(1, 0); //Kurzor 3. sor 2. karakternél
lcd.write(4); //Átírjuk az o betüt ő-re
lcd.setCursor(3, 0); //Kurzor 3. sor 4-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(6, 0); //Kurzor 3. sor 7-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(13, 0); //Kurzor 3. sor 14-es karakternél
lcd.print(t); //Hőmérséklet érték kiírása
lcd.print((char)223); //Fokjel előhívása memoriából
lcd.print("C");
// Páratartalom.
lcd.setCursor(0, 1);
lcd.print("Paratartalom: ");
lcd.setCursor(1, 1);
lcd.write(2); //Átírjuk az a betüt á-re
lcd.setCursor(14, 1); // A páratartalom kijelzés a 14.sortól kezdődik
lcd.print(h);
lcd.print("%");
delay(200);
//Vízmelegítő.
lcd.setCursor(0, 2);
lcd.print("Vizmelegito :");
lcd.setCursor(1 ,2);
lcd.write(0);
lcd.setCursor(8 ,2);
lcd.write(0);
lcd.setCursor(10 ,2);
lcd.write(4);
if(Relay == HIGH)
{
lcd.setCursor(13,2);
lcd.print(" ON ");
}
else
{
lcd.setCursor(13,2);
lcd.print(" OFF ");
}
} -
gyapo11
őstag
válasz
Daszkalosz19
#3358
üzenetére
Akkor a vízmelegítő kiíratása után állitsd be a kurzort a kívánt helyre, és oda tedd a kiíratást.
Változót (rel) gondolom deklaráltad a megfelelő helyen. -
gyapo11
őstag
válasz
Daszkalosz19
#3352
üzenetére
Kicsit átformáztam a kódot:
if(h > maxHum || t > maxTemp) {digitalWrite(Relay, HIGH); rel="be";}
else {digitalWrite(Relay, LOW); rel="ki";}és ide az if után:
lcd.println(rel); -
gyapo11
őstag
válasz
Teasüti
#3351
üzenetére
Valójában a villogás nem a megfelelő szó, jobb az akadozás. Simán el tudom képzelni, hogy valaki megírja az animációt, valaki más a távirányító kezelését, és a kettőt összeeresztve akadozni kezd, mert pont akkor nyomok rá a távirányítóra, amikor léptetni kellene az animációt, és a processzor egyszerre csak egy dologgal tud foglalkozni, a szem meg érzékeny az akadozásra. Ilyenkor jön az, hogy meg kellene találni az okát, de ezt idegen kódban és nem profi programozási tudással elég nehéz. Ha meg profi a tudás, akkor nem kell netről vadászni a kódot, hanem meg kell írni az első byte-tól úgy, hogy az infrát is le tudja kezelni a legkisebb akadás nélkül.
A megszakítás jó dolog, de nem tud csodát. Vagy az eredeti kód fut, vagy a megszakítást szolgálja ki, de addig az eredeti kód áll. Ahhoz több processzormag, közös memóriakezelés stb. kellene, hogy egy beérkező megszakítás ne állítsa meg az egyik magon futó kódot, és a másik magon azonnal futhasson a megszakítás.
Egy távirányítóról érkező parancs kiszolgálása persze elég rövid idő, de ha nem jól van megírva a kód vagy a library, akkor akár látható nagyságú idő is elmehet, és gond van.
Nem beszélünk konkrét számokról, mert ahhoz kellene a kód, és még akkor sem könnyű összeszámolni a szükséges órajel ciklusokat. Ehelyett ha írunk egy kis ciklust, az kb. 100 ezer/s, ha csinál is valamit, akkor legyen 10 ezer/s, ez 100 μs, ha pl. hangfrekis hullámformát generálunk, és egy megszakítás elvesz ennyi időt, akkor az már hallható lesz.
Sokszor láttuk már itt a fórumon is, meg más forráskódokban is a delay(1)-et vagy hasonlót, mert különben elvesznek byte-ok a soros vagy egyéb csatornán. Pedig a processzor 16 MHz-en pörög, és az ehhez képest rettentő lassú soros porton is el tud veszni adat, ha nem állítjuk meg egy ms-ig a futást.
Már egy ilyen kis processzorocska is annyi mindent csinál, hogy nem elemezzük órajel szinten. Ráadásul mi c++ forráskódódot látunk, de a processzorba egy ebből generált bináris kód megy, nem tudjuk, hogy melyik arduino utasításból milyen bináris kódot generál, így nem tudjuk az időigényeket se. Ráadásul ott vannak a libek, amiknek még a forráskódját se nézzük, hanem csak include-oljuk és reménykedünk benne, hogy működik és nem ütközik semmivel.
Ezért mondom, hogy ez hobbyra van kitalálva, mert pillanatok alatt tud bárki működő programot futtatni. Amint bonyolódik a program, mindenféle korlátokba ütközünk, az időzítést is nehéz kézbentartani, a libek minősége ismeretlen, a szigorú tesztelése időigényes. Mindezek elkerülése meg oda vezet, hogy elhagyjuk az arduino hw-t és sw-t is, és magát a mikrovezérlőt programozzuk profi eszközzel, debuggal, teszteléssel.
Vannak komoly házvezérlések, és egyéb bonyolultabb projectek, tehát sikerülhet a dolog, de erre nem lehet építeni, nem lehet megélhetést alapozni rá. -
norbert1998
nagyúr
üdv
érdeklődnék, hogy egy win xp-t futtató gépre mennyi macerával jár egy már grbl-t futtató arduino-t csatlakoztatni, hogy utána offline működjön végre az a kramanc?
-
Daszkalosz19
aktív tag
Sziasztok!
egy relay állapotát hogyan tudom kiiratni lcd-re
kezdőként itt küszködök vele
ez lenne a kódom:köszönöm a segítséget!
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define Relay 4
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110}; // Ez az é betű
byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ó betű
byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110}; // Ez a rövid ö betű
byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110}; // Ez a hosszú ő betű
byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111}; // Ez az á betű
byte u1[8] = {B10,B100,B10001,B10001,B10001,B10011,B1101}; // Ez a hosszú ú betű
byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101}; // Ez a rövid ü betű
byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101}; // Ez a hosszú ű betű
byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110}; // Ez a hosszú í betű
int maxHum = 95;
int maxTemp = 29;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
pinMode(Relay, OUTPUT);
Serial.begin(9600);
Wire.begin();
dht.begin();
lcd.begin(20, 4);
lcd.backlight();
lcd.createChar(1, e1); // Ez az é betű
lcd.createChar(2, a1); // Ez az á betű
lcd.createChar(3, o1); // Ez a hosszú ó betű
lcd.createChar(4, o3); // Ez a hosszú ő betű
lcd.createChar(5, u1); // Ez a hosszú ú betű
lcd.createChar(6, u2); // Ez a rövid ü betű
lcd.createChar(7, u3); // Ez a hosszú ű betű
lcd.createChar(0, i1); // Ez a hosszú í betű
}
void loop() {
delay(2000);
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
lcd.println("Szenzor ERROR!");
return;
}
if(h > maxHum || t > maxTemp) {
digitalWrite(Relay, HIGH);
} else {
digitalWrite(Relay, LOW);
}
// Hőmérséklet.
lcd.setCursor(0, 0);
lcd.print("Homerseklet: ");
lcd.setCursor(1, 0); //Kurzor 3. sor 2. karakternél
lcd.write(4); //Átírjuk az o betüt ő-re
lcd.setCursor(3, 0); //Kurzor 3. sor 4-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(6, 0); //Kurzor 3. sor 7-es karakternél
lcd.write(1); //Átírjuk az e betüt é-re
lcd.setCursor(13, 0); //Kurzor 3. sor 14-es karakternél
lcd.print(t); //Hőmérséklet érték kiírása
lcd.print((char)223); //Fokjel előhívása memoriából
lcd.print("C");
// Páratartalom.
lcd.setCursor(0, 1);
lcd.print("Paratartalom: ");
lcd.setCursor(1, 1);
lcd.write(2); //Átírjuk az a betüt á-re
lcd.setCursor(14, 1); // A páratartalom kijelzés a 14.sortól kezdődik
lcd.print(h);
lcd.print("%");
delay(200);
//Vízmelegítő.
lcd.setCursor(0, 2);
lcd.print("Vizmelegito:");
lcd.setCursor(1 ,2);
lcd.write(0);
lcd.setCursor(8 ,2);
lcd.write(0);
lcd.setCursor(10 ,2);
lcd.write(4);
} -
Teasüti
nagyúr
válasz
gyapo11
#3336
üzenetére
Villogni kezd?
Az animáció?
Ezért lehet érdemes grafikus futószalag elvén megírni, ahol minden egyes loop() ciklus egy képkockát generál.
A parancsokat megszakítással veszi és polling-gal rakja össze a pufferből. Annyi, hogy amíg a LED frissítése zajlik, arra a rövid időre kikapcsolom a megszakítást. (BAAAAZDMEG lehet ezért veszik el egy-egy vezérlőbájtom a BT átvitel során??
Há Móóónika! Megyek dolgom van!
)
Így nálam bármilyen fps mellett működőképes marad minden egyéb funkció.
És persze a LED-ek sem villognak, hisz a PWM vezérlő sample&hold elven működik, legfeljebb az animáció akadozik, ha nagyon beesik az fps, de itt csak 120 ledről (meg pár paletta, ami mi is pontosan?) beszélünk és az animáció erőforrásigénye se óriási. Egy 8 bites Atmel328p vígan elviszi a tapasztalataim alapján több száz fps-el.(#3334) printpro
Azt hiszem tudok segíteni neked, viszont határozatlan időre tudnám csak vállalni a feladatot. Hetekig tartana ráérő szabadidőmben. Nem számolva a posta idejével, amíg megérkeznek a kellékek hozzá ebay-ről.
Új hozzászólás Aktív témák
- A Sony megmutatja milyen monitor illik a PlayStation 5-höz
- Star Wars rajongók
- Elektromos (hálózati és akkus) kéziszerszámok, tapasztalatok/vásárlás
- Milyen okostelefont vegyek?
- Okos Otthon / Smart Home
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- OTP Bank topic
- Hét új család perli az OpenAI-t öngyilkosság miatt
- Hardcore café
- exHWSW - Értünk mindenhez IS
- További aktív témák...
- Microsoft Surface Pro 7 Érintős Szétszedhető Laptop Tablet 12,3" -80% i5-1035G4 8/256 Retina
- Garmin Fenix 6X Pro
- AMD Ryzen 7 5800X3D + ASUS ROG STRIX B550-A + Corsair DOMINATOR PLATINUM 32GB (4x8GB) DDR4 3600Mhz
- Bluetti AC70 1000W Power Station
- Erős gamer PC Ryzen 7 5800X / RX 6900 XT / Asus Prime B450-Plus / Jonsbo MOD 3 550 000 Ft
- Xbox one X konzol 1Tb
- Telefon felvásárlás!! Apple Watch Series 9/Apple Watch Ultra/Apple Watch Ultra 2
- Xiaomi 15 256GB, Kártyafüggetlen, 1 Év Garanciával
- Azonnali készpénzes AMD Radeon RX 6000 sorozat videokártya felvásárlás személyesen/csomagküldéssel
- Sima Vs.Windows Logitech Mx keys s plus és hagyományos Mx keys magyar bemutatása. Új videó linkel
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest








Há Móóónika! Megyek dolgom van!
ekkold

