- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Argos: Szeretem az ecetfát
- vrob: Az IBM PC és a játékok a 80-as években
- Magga: PLEX: multimédia az egész lakásban
- sziku69: Fűzzük össze a szavakat :)
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- gban: Ingyen kellene, de tegnapra
- sziku69: Szólánc.
-
LOGOUT
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
-
gordonfreemN
addikt
Megérkeztem, tudok tesztelni. Tehát akkor mit nézzek meg?
-
vargalex
félisten
válasz
bagarol #19797 üzenetére
Erre írtam, hogy
false
-t kellene visszaadnia, ha nem volt fogadott adat. Erre válaszoltad, hogy azt is ad. Tehát mégsem azt ad... Az is biztos, hogy nem 0-t, mert akkor azelse
ág futna (ami nincs). -
vargalex
félisten
válasz
bagarol #19795 üzenetére
Ezt így nem értem. Ha az
irrecv.decode false
-t ad, amikor nincs bejövő adat, akkor az eredeti kód szerint nem atrue
ág fut, azaz nincscase
, tehát nincs, ami kikapcsolja a ledet. Vagy nem erre gondoltál? -
vargalex
félisten
válasz
gordonfreemN #19786 üzenetére
A soros log alapján Ayres kolléga megoldása jó kell, hogy legyen. A case -1 ágába a break-on kívül más nem kell. Viszont azt gyanítom, hogy kellene valami timeout is, mert amíg nyomod, addig jön a -1, de ha elengeded, akkor nem fog jönni semmi és nem is fut be a default ágba. Vagy, ha nem nyomsz gombot, akkor az irrecv.decode-ban áll?
-
vargalex
félisten
válasz
gordonfreemN #19786 üzenetére
A break lényege, hogy utána más ág (így a default sem) hajtódik végre. Vagy nem értem, amit írsz...
-
bagarol
tag
válasz
gordonfreemN #19787 üzenetére
Látom más sem tud aludni.
VOLUME_UP DOWN != PLAY STOP.
Akkor mégis jó, amit itt [link] írtam, ezzel a változtatással:case -1:
lastms = millis();
break;
default:
Serial.println("Waiting ...");
if (millis() - lastms > 200) {
lastms = millis();
digitalWrite(pausePin, LOW);
digitalWrite(playPin, LOW);
} -
dew28
aktív tag
válasz
gordonfreemN #19786 üzenetére
Ha beteszem a break-et, nem hajlandó a benne lévő utasítást se végrehajtani
case -1:
***vegrehajtando feladat***;
break;
ugye igy csinaltad? ugye? -
gordonfreemN
addikt
válasz
gordonfreemN #19786 üzenetére
Na mostmár valamit a könyvtáraknál is szétcsesztem, le se tudom fordítani a kódot.
Ha valakinek lenne türelme ebben segíteni, akkor a maradék hajam hálával fog tartozni, amiért nem hullik ki.
Szerintem előlről kellene kezdeni, tehát, ahhoz hogy az IRremote.h lib nemtudom mitcsináljon kellene ez a lib, addig a kódban megírt "hivatkozások" nincs mire mutassanak szerintem. Tehát most fogom, törlöm az összes ilyen lib-et és akkor innen kezdjük.Na semmi. Van ez az IR remote könyvtár. Ezt lehet telepíteni többféle verzióban, az újjabbakban (2 felett) történt valami változtatás ami a régi hivatkozásokat (nem tudom mi ennek a neve, amikor a libben lévő megírt kódra egy paranccsal hivatkozunk) már nem ismerte, a példaprogramom meg a régi szerint volt megírva.
-
gordonfreemN
addikt
Nem ugrik be a defaultba, ha a
case -1:
break;
-et beteszem a kódba. Enélkül bemegy defaultba és waiting jön a com-on ahogy kell.
Nem értem.
Ha kiveszem a break-et a -1-es case után akkor belép, és végrhajtja a benne lévő utasítást, de ki is jön belőle ugye és megy tovább a default-ba.
Ha beteszem a break-et, nem hajlandó a benne lévő utasítást se végrehajtani
Másik távval is teszteltem, az is -1-et ad hosszú nyomásra, azzal is igyanez a hiba. -
gordonfreemN
addikt
Valami nem oké még, mindössze annyit tettem, hogy bemásoltam a -1-es caset ahogy mutattad. Most ugyanúgy működik mint eredetileg. Felvillan és úgy marad ha megnyomom.
Közben még: arra volna tiapasztalatotok, hogy a potméter DC motorját H-hidas vezérléssel milyen eszközel érdemes megoldani? Jó lenne a minél kevesebb fesz esés a vezérlőn, mert 5VDC-m van és a motornak is kell ennyi. Ez esetben csak szubminiatűr relé jöhet szóba?
-
válasz
gordonfreemN #19779 üzenetére
ezek szerint az ismétlés kódja a -1 ?
Akkor nyertem az 0xffffff-el, előjelesen az -1
(valójában 0xffffffff, nem tudtam hány byte-os az IR kód).
Így akkor egyszerű a megoldás:
...
case -1:
break;
default:
Serial.println("Waiting ...");
digitalWrite(pausePin, LOW);
digitalWrite(playPin, LOW); -
gordonfreemN
addikt
& vargalex: Ennyi az egész kód egyelőre.
Köszi.
Küldi a jelet nyomva tartáskor. A soros monitoron ezek szerint az ismétlés kódja a -1 ?
Ha igen, akkor gomdolkodom, hogyan lehetne megoldani ezt így ebben a formában.na még tovább olvasva a válaszok: igen ez a kód amit betettem még csak arra képes, hogy vagy az egyik led vagy a másik világít. Azt szeretném, hogy amíg nyomom a távon a gombot (hangerőt nyomom egyébként) addig világítson, azután ha elengedtem, kapcsoljon ki a led is. Az a LED világítson amelyik gombot épp nyomom.
Ebből majd egy DC motort fogok vezérelni hangerőszabályzásra: ALPS RK27112.Lehet látni S22-n az infrát.
-
bagarol
tag
válasz
gordonfreemN #19760 üzenetére
Így kb 1 másodpercig világít.
#include <IRremote.h>
int RECV_PIN = 11;
int playPin = 8;
int pausePin = 13;IRrecv irrecv(RECV_PIN);
decode_results results;
uint32_t lastms= 0;void setup()
{
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
pinMode(playPin, OUTPUT); // sets the digital pin as output
pinMode(pausePin, OUTPUT); // sets the digital pin as output
}
void loop() {
if (irrecv.decode(&results)) {
long int decCode = results.value;
Serial.println(decCode);
switch (results.value) {
case 6072407:
Serial.println("Play");
digitalWrite(playPin, HIGH); // sets the LED on
digitalWrite(pausePin, LOW);
lastms = millis();
break;
case 6066287:
Serial.println("Pause");
digitalWrite(pausePin, HIGH); // sets the LED on
digitalWrite(playPin, LOW);
lastms = millis();
break;
default:
Serial.println("Waiting ...");
if (millis() - lastms > 1000) {
lastms = millis();
digitalWrite(pausePin, LOW);
digitalWrite(playPin, LOW);
}
}
irrecv.resume(); // Receive the next value
}
} -
vargalex
félisten
Ezért kérdeztem a kollégától, hogy ez a teljes kód-e. Mert ugye a bemásolt kód csak a másik gomb megnyomásakor kapcsolná le a ledet, addig folyamatosan világítania kellene.
A telefon kamárájához megjegyzés: telefon kérdése is, mert pl. iPhone-ok esetén (talán már a 6-os, vagy 7-es óta) a kamerán van IR szűrő, ott nem látszik a villogás...
-
válasz
gordonfreemN #19760 üzenetére
Ha jól értem azt szeretnéd, hogy amíg tartod a gombot a távirányítón, addig világítson a LED, de írtam, hogy azért nem fog menni, mert a távirányító nem ismétli a kódot (nem küldi újra és újra amíg a gombot nyomod) csak bizonyos gomboknál, például a hangerő gombok. Illetve van olyan távirányító, ami ilyenkor nem a kódot küldi újra, hanem egy általános "ismétlés" kódot, ami azt jelenti, hogy "az előző gomb még nyomva van". Ha ez a helyzet, derítsd ki, mi ez a kód (például 16777215, ami 0xffffff-nek felel meg, úgy emlékszem egy távirányító ezt küldte ilyenkor). Egy telefon kamerájával könnyen tudod ellenőrizni, hogy a távirányító egyáltalán küld-e valamit: irányítsd a távot a kamera felé, a kijelzőn lilán fogod látni villogni a ledet.
-
agent_k
őstag
-
vargalex
félisten
válasz
gordonfreemN #19760 üzenetére
A soros monitoron ilyenkor mit látsz? Valami csak lekapcsolja azt a ledet, ha csak felvillan... Ennyi a teljes kód, vagy csak kiemelted a lényeget?
-
Tankblock
aktív tag
válasz
agent_k #19761 üzenetére
Szia,
N-channellel Low side tudsz kapcsolni "önmagában".
A high side-ot kapcsolnám (azaz a tápoldalt) a projectedben, nehogy valahol másfele elfolyon az áram....- Vagy egy high side drivert keresel a N-Channelhez,
- vagy P-channel logic level mosfetet használsz, mondjuk egy 100k ellenállással felkötöd a Gatet a tápra, majd földre rántod amikor kell. -
agent_k
őstag
Sziasztok!
Valamikor ilyen iskolába jártam, de már sok mindent elfelejtettem, elnézést kérek a feltehetően igen amatőr kérdésért.
Van egy esp8266-om meg egy kapacitív földnedvesség mérőm. Napelemről megy, aksival. Az mcu-t meg a szenzort is 3.3V-ról üzemeltetem. Gondolom már sejtitek, a probléma, hogy ha az mcu deep sleepben is van, a szenzor nyilván akkor is fogyaszt, hiszen direktben kapja a feszt.
Szeretném egy GPIO pinről hajtani, de a szenzornak minimum 40mA kell, tehát kellene nekem egy alkalmas mosfet. A google keresések valahova ide lyukadtam ki: AO3400A és IRLZ24N
Segítsetek nekem melyik legyen? Vagy ezek tök rossz választások és van ennél sokkal jobb?Köszönöm!
-
gordonfreemN
addikt
Szia!
Köszönöm mindenkinek a segítséget. Sajnos az említett kód nem segített, egyszer felvillan aztán süket a led. Delay-el is ez a helyzet. Próbálkoztam már én is ilyesmivel, de nekem se jött be. Esetleg más ötlet?
Gondolom a kódok miatt érdemes ennél a switch-case-nél maradni és ezt csűrni csavarni valahogy. -
KoVee84
senior tag
válasz
its_grandpa #19754 üzenetére
https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 ő lenne a lib, és a demo exampleből indultam ki.
A feladat végtelenül egyszerű (lenne, ha értenék hozzá). 18650-es akkuval üzemelne a kijelző, hetente más-más max 8 karakter hosszúságú szöveg jelenne meg a kijelzőn, 4 hetente újrakezdődik. + ha már az exampleben pont ott volt, minden szövegváltásnál kiírja az aktuális akkufeszt.
A kód működik, bár rtc modul nélkül csak úgy tudtam önerőből megoldani a heti egyszeri szövegváltást, hogy delay(604800000);
A problémám viszont, hogy megjelenítendő szöveg karaktereinek méretét nem tudom megnövelni... Azt honnan tudom egyébként, hogy az aktuális lib milyen fontokat kezel?köszönöm előre is ha tudsz/tudtok valami okosságot erre!
-
válasz
Janos250 #19756 üzenetére
Azért nyilván van egy ésszerű határ, amit mondjuk telefonról nézve már sokáig tart átgörgetni (én például szinte kizárólag telefonról nézem a fórumot, írni is arról szoktam), de aki asztali gépről nézi az oldalt, ott is zavaró lehet, ha egy beszúrt kód egyetlen hozzászólásban hosszabb, mint az oldalon lévő összes 49 további hozzászólás együtt.
-
Janos250
őstag
válasz
gordonfreemN #19751 üzenetére
Én úgy gondolom, hogy azokat a kódokat, ami még valamikor valakinek hasznára válhat a rá kapott magyarázatokkal együtt, azokat érdemes ide berakni. Nem kép, ami rengeteg helyet foglal, hanem szöveg.
-
válasz
gordonfreemN #19751 üzenetére
Szia! Szerintem ebből ne csinálj gondot, egy ilyen rövid kód simán elfér itt (hiszen pont ezért is van kódbeszúrás funkció az oldalon), ami hosszabb mondjuk 1-2 oldalnál, azt meg tedd fel mondjuk ide.
A kolléga már leírta a megoldást, én annyit tennék hozzá, hogy így viszont nagyon rövid ideig fog a LED világítani, hacsak a távirányító nem ismétli a kódot amíg a gombot nyomva tartod, de pont a play/pause gombokat nem szokták újraküldeni, inkább a hangerő, programváltó stb ahol számít, meddig nyomod, úgyhogy én tennék oda egy
delay(500);
sort minden felkapcsolás után:case 6072407:
Serial.println("Play");
digitalWrite(playPin, HIGH); // sets the LED on
digitalWrite(pausePin, LOW);
delay(500);
break;
case 6066287:
Serial.println("Pause");
digitalWrite(pausePin, HIGH); // sets the LED on
digitalWrite(playPin, LOW);
delay(500);
break;Ha ez a késleltetés zavarja a program működését (ugyebár ennyivel később fog kapcsolni) akkor állapotgépet kell használni helyette.
-
bagarol
tag
válasz
gordonfreemN #19751 üzenetére
default:
Serial.println("Waiting ...");. digitalWrite(pausePin, LOW);
digitalWrite(playPin, LOW); -
KoVee84
senior tag
Sziasztok!
Segítsetek lsz, mert felrobbanok
Adott egy Lilygo T5 E-ink 4.7 kijelző és az istennek nem jövök rá, hogy hogyan tudok nagyobb betűméretet megjeleníteni. Example fájlból indultam ki, tehát mondjuk azt, hogy a programozói tudásom végesEz nem működik:
uint8_t frame = 2;
writeln((GFXfont *)&FiraSans, (texts[i]), &cursor_x, &cursor_y, &frame);illetve még ezzel próbálkoztam, de miután hozzáadtam a libraryt includenál hibát dob:
U8g2_for_Adafruit_GFX -
gordonfreemN
addikt
Sziasztok!
Legutóbb meg lettem jegyezve, hogy feltöltöttem a kódomat ide. Isten lássa lelkem, most beregeltem a github-ra, de azért ezt egy nem ősprogramozói lélek 10perc alatt nem látja át. Vagy lehet csak én vagyok béna, mindegy. Most se hosszú a kód amiről kérdeznék, talán elfér itt.
#include <IRremote.h>
int RECV_PIN = 11;
int playPin = 8;
int pausePin = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
pinMode(playPin, OUTPUT); // sets the digital pin as output
pinMode(pausePin, OUTPUT); // sets the digital pin as output
}
void loop() {
if (irrecv.decode(&results)) {
long int decCode = results.value;
Serial.println(decCode);
switch (results.value) {
case 6072407:
Serial.println("Play");
digitalWrite(playPin, HIGH); // sets the LED on
digitalWrite(pausePin, LOW);
break;
case 6066287:
Serial.println("Pause");
digitalWrite(pausePin, HIGH); // sets the LED on
digitalWrite(playPin, LOW);
break;
default:
Serial.println("Waiting ...");
}
irrecv.resume(); // Receive the next value
}
}
Infra kommunikáció megvan, veszi az arduino a táv jeleket, de arra nem jövök rá, hogyan tudnám azt megcsinálni, hogy csak addig világítson a LED még nyomom a gombot a távon. Ebben tudna valaki segíteni? -
lanszelot
addikt
Hello,
Hogy tudom azt megoldani, hogy egy szöveg körül egy négyszög villogjon. Mintha villogó kerete lenne?
A négyszöget köré tudom rajzolni, de nem tudom villogtatni.
A szöveg és a négyszög is a "void loop" ban van -
ViZion
félisten
válasz
lanszelot #19746 üzenetére
De mi a terv? Mit szeretnél mérni?
Ahogy fentebb, más szenzoroknál is elhangzott, ezek amolyan DIY/játék dolgok. Szal. tiszta levegőnél kapsz egy "etalon" értéket, ahhoz képest tudsz mérni, h milyen a levegő. De ez nem alkoholszonda, mivel több gáz is befolyásolja az eredményt. Ez egy nagyon alap szenzor, sokat ne várj tőle. Ahogy nézem a jobbféle ipari szenzorok 120 dodó felett vannak. Itt egy lista, válogass. -
olli
tag
válasz
lanszelot #19744 üzenetére
Ez az érzékelő nem egyedi alkohol vegyi érzékelő, nem gázkromatográf, nem ilyen egyedi mérőeszköz: [link]
[link]
If you power off the heater letting the temperature goes down, you have to preheat it again, every time.
We can detect more than one gas, but, keep in mind that it's not a true single gas detection. The chemical resistance inside this sensor react (if heated), to more than one gas, it can not isolate a single gas. So, what you get by conversion, is a resistance value to a ppm value, of many gas. However, if just one gas changed, or the other gases remains almost constant, you can get that changes. If you are able to mantain constant values for all the gas, and modify just one gas, then you can obtain the gas response over the sensor. The builder of this sensor does this job, making the figure i use for gas convertion. You can not be shure you are measuring just one gas.
Also consider that, the chimical resistance degradate in a few years, I've read somewhere (can't remember well), 2 years. -
lanszelot
addikt
Először is köszönöm szépen a választ.
Én nem találom egyikben sem a választ.
Mind a 3nál csak annyit fog mutatni, hogy mennyi ppm.
De mit mér azt nem tudni.
Az volt a kérdésem, hogy hogy lehet váltani a mérendő gázok között?
Legutolsó linkben is ott van, hogy több féle gáz mérésére képes.
De ennyi. Azt nem látom, hogy honnan tudni épp mit mér. -
lanszelot
addikt
Hello,
Vettem egy MQ-135 GAS SENSOR -t.
Az volt írva, hogy teljes dokumentációt adnak hozzá.
Hát egy nagy semmit adtak hozzá.
"They are used in air quality control equipments for buildings/offices, are suitable for detecting of NH3,NOx, alcohol, Benzene, smoke,CO2 ,etc."
Ezt tudja. De hogy választom ki mit mérek?
Vagy hogy a ppm érték mit takar?
Mert ha pl alkohol szintet akarok mérni, és co2 -t mér a lehelletben, akkor azt honnan fogom tudni, hogy most ivott, vagy csak co2-t mért ?
Nem találok arduino-hoz semmit hozzá.
Tudna valaki segíteni? -
sonar
addikt
Arduino Programozási kézikönyv - ezt nem találtam meg múltkor.
-
vargalex
félisten
Én úgy értettem a kollégát, hogy a starter kit már megvan...
De, hogy valami értelmeset is írjak:
A topikon is volt kolléga, aki készített videós tanfolyamot.
Illetve nem tudom, mennyire jó, de a TavIR-nek is van egy 60 napos ingyenes tanfolyama. Minden nap küldenek egy e-mail-t egy-egye témával. -
válasz
VMatteo #19734 üzenetére
Szia! A kit mellé szoktak adni oktató anyagot, a tiédhez nem adtak?
Nézz szét itt: [link] az összes lényeges alap kapcsolás le van rajzolva. Valahol megvan összefűzve pdf formátumban, keress utána "Arduino basic connections by pighixxx" néven.
Példa programokkal tele van maga az Arduino IDE is, de ha valami konkrétan érdekel, a Google nagyon jól el tud látni tutoriallal és példa programokkal is. -
VMatteo
őstag
Sziasztok,
Arduinozáshoz van valakinek esetleg valami kezdő anyaga, ami példaprogramokkal elmagyarázná az alapokat, lehetőleg magyarul?
Van egy starter kit, így egy-két dolgot össze lehetne építeni már az elején is.
Köszönöm előre is, ha tud valaki segíteni -
Dißnäëß
nagyúr
válasz
its_grandpa #19731 üzenetére
-
ViZion
félisten
válasz
Dißnäëß #19729 üzenetére
Jah, Kalandor külföldön van, majd lesz cikk.
Ez a megoldás _nálam_ jó, Neked csak útmutató/gondolatébresztő lehet.A kép HA dashboard, de nincs időm csinosítani, még van pár cucc, amit integrálni kellene, de nagy része fűtés, szal. pont nyár lesz, mire elkészül. Nem para, azt mondták, h jövőre is lesz tél.
-
Dißnäëß
nagyúr
válasz
its_grandpa #19713 üzenetére
Nem az a gond, ha nincs 230V, hanem amikor visszajön
-
Ezeket általában C++ template-tel implementálják, én legalábbis azt csinálnám. Annyi a lényege, hogy a függvényparaméter típusa fordítás közben dől el.
Valami ilyesmi talán:
template <typename T>
void eeprom::put(T what)
{
eeprom::write((void*)&what, sizeof(what));
}És akkor kb. bármit tudsz menteni.
-
-
Jó ötlet! Ez esetben a
myMem.put(1000, (float) 60.0);
működhet. Nem kellene a fordítónak hibát jeleznie? 🤔Volt egy oldal, ahol leírták, hogy melyik Arduino boardon melyik adat típus hány bites, de nem találom. Arra emlékszem, hogy az UNO-n a float és a double is egyformán 32bit volt, de a Due-n már biztos nem így van.
-
-
tibi-d
tag
Belefutottam egy problémába. A szereplők: Arduino Due, 24C256 EEprom.
Utasítás 1:
myMem.put(1000, 60.0);
myMem.get(1000, x); //x értéke ez esetben 0Utasítás 2:
float y=60.0;
myMem.put(1000, y);
myMem.get(1000, x); //x értéke 60.0Mi lehet a probléma forrása?
-
Janos250
őstag
válasz
Blasius #19716 üzenetére
Én nem látok benne hibát. Viszont most döbbentem rá, hogy én a Serial.begin után mindig teszek egy delay(1000)-t, de már fogalmam sincs, miért.
Valami itt van róla:
https://forum.arduino.cc/t/delay-for-serial-print/954782
Nem látok benne kivetni valót, én legfeljebb az if-eket Case-el oldottam volna meg, mert az jobban áttekinthető, de ugyanarra fordítódik. -
válasz
Blasius #19716 üzenetére
Nem tákolt ez attól, hogy tettél bele késleltetést, miért lenne? Figyelembe kell venni a hardverek sajátosságait. Ha jól értelmezem, a GPS modul az adatot adagokban küldi az UNO-nak. Az UNO több sort vár a feldolgozáshoz, de a GPS egy sor után nem kezdi meg a következő adag küldését, hanem vár valamennyit (nyilván műszaki okból, nem kitolásból
). Neked ezt ki kell várni a fogadó oldalon.
-
Blasius
tag
válasz
vargalex #19710 üzenetére
Na, tálalhatóbb formába hoztam a kódot. Íme:
const byte numChars = 128;
char receivedChars[numChars];
bool newData = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("<Johet>");
}
void loop() {
// put your main code here, to run repeatedly:
recvWithStartEndMarkers();
showNewData();
}
void showNewData() {
if (newData == true) {
Serial.print("new data came:");
Serial.println(receivedChars);
newData = false;
}
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
static byte ndxmea = 0;
byte endKa = 0x0a;
byte startKa = 0x24;
byte starKa = 0x2a;
byte nmea = 0x00;
char rc;
char nmeaRd[2];
long nmeaRdL;
bool inhibi = false;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endKa) {//delay(2);//?????????????????????????????????????????????????????????????????
if (inhibi == true) {nmeaRd[ndxmea]=rc; ndxmea++;}
else if (rc == starKa) {inhibi = true;}
else if (inhibi == false){nmea ^=rc; receivedChars[ndx] = rc; ndx++;
//delay(1);//?????????????????????????????????????????????????????????????????
if (ndx >= numChars) {ndx = numChars - 1;}
}
}
if (rc==endKa) {
nmeaRd[2] = '\0';
char * pEnd;
nmeaRdL = strtol(nmeaRd, &pEnd, 16);
if (nmeaRdL==nmea){receivedChars[ndx] = '\0';} // terminate the string
else {memset(receivedChars, '0', 6); receivedChars[7] = '\0';}
recvInProgress = false;
ndx = 0;
ndxmea = 0;
newData = true;
nmea =0;
inhibi=false;
}
}
else if (rc == startKa) {recvInProgress = true;}
}
}
A második függvényben lévő késleltetések (...delay(x)/???...) nélkül a kód nem megy rendesen. Viszont, ahogy Aryes tippelte, a késleltetéssel jól megy. Ha késleltetések helyett sorosra írás lenne akkor is menne jól. Hát, kicsit tákolt, de megy. Gondolom erre mondják hogy nem egy robosztus kód
. De most már kíváncsi vagyok hogy mi lehet ennek a furcsa viselkedésnek az oka
.
(nmea ...^=rc... az egyfajta crc számítás. A startKa karakter utáni karakterekre kell számolni. Aztán a soroson jön egy * (starKa), egy byte két karakter hex ascii-ként (00-FF, ez a crc) majd egy 0x0a karakter (sorvég). Ha a számolt és fogadott crc egyezik, akkor kiírja sorosra ami jött ahogy van. Ha a crc nem stimmel akkor kinullázza az első pár karaktert.)
Ez egy rendes arduino unon fut (atmega chip). -
ViZion
félisten
válasz
Dißnäëß #19712 üzenetére
Ahogy Grandpa írta, nem kell túlgondolni, ezekre már gondoltak.
Enyémről írtam egy cikket, csak valamiért elnyelték a logout hullámai, nem tudom, h már publikus-e [link].
Mondjuk itt a termosztát maradt, a keringető lett ESP vezérlésű. Később ezt a Home Assistant fogja majd ellátni vezérléssel, egyelőre csak adatokat közöl vele.Termosztát állítgatás megint egyéni, nálunk folyamatos a kapcsolgatás, asszony random képes 25 foknál is kijelenteni, h fázik... megfogja a radiátort, az hideg -> hideg van bent. Már gondoltam, h csalok a hőmérőkkel, ráállítok +2-3 C°-t mindre
Ez mondjuk csak a nappalira igaz, emeleten termofejek beállítva, annyi.
-
válasz
Dißnäëß #19712 üzenetére
Én nem tudok mindenre válaszolni, csak örülök, hogy benéztél.
Esp32-n van permanens tár, ami nem EEPROM, de pont ilyen beállítások tárolására találták ki, még a hozzá való library-t is ennek megfelelően nevezték el (Preferences.h).
Én sem tudom, mit kell folyton állítgatni egy termosztátot...
Amikor kazános fűtésű házban laktunk, vettem egy okosabb termosztátot, ahol időzítve minden nap minden órájára be lehetett állítani a hőfokot. Eleinte élveztem, játszottam vele, aztán elkezdtem szépen törölgetni a beállításokat, míg egyszer csak azt vettem észre, hogy mindent kitöröltem és már hónapok óta ugyanaz az egy a hőfok van beállítva.
-
-
Dißnäëß
nagyúr
Sziasztok Urak !
Rég jártam erre
A DIY jegyében szeretném megcsinálni kezdôként életem elsô wifis termosztátját.
Az alap egy ESP8266 vagy 32-es, ez sztem mindegy, mindegyik jó az igényeimnek.
Hogyan védenétek ki egy esetleges áramszünet hatását ? Szóval eeprom-on kattogok még mindig, illetve hogy minden egyes beállítást
- vagy magában tárol el eeprom-on
- vagy induláskor felveszi az adatokat vmi szerverrôl, pl. MQTT-n, hogy mire álljon vissza, ami fut egy szünetmentes Pi4-en mondjukUtóbbinál nem kérdés, hányszor lehet hôfokot beállítani a rendszernek.
Elôbbinél is max a kis elemmel támogatott RTC+eeprom lehet az, ami az írások számában limitálhat. Mennyit tudnak ezek ? Elég lehet egy ilyen kis kieg. modul hozzá, melyben egy kétjegyû szám letárolódik, csak állításkor ?
Az ultimate question: hányszor állítgathatja az ember vajon úgy 20-30 év alatt a termosztáton a hôfokot, miután belakott vmit ?
Mehetne eleve minden a Pi-rôl is, igen, ha az szünetmentes, de a fûtést önállóra tervezném, szóval ha a Pi lehal vagy bármi anomália adódik, a termosztát akkor is tegye azt, ami a dolga, ezért nem központosítom a funkciót a Pi-be.
-
Janos250
őstag
válasz
Blasius #19708 üzenetére
Bocs, nem tudom milyen kontrollert használsz. ESP32-n lefordul.
A volatile azt jelenti, hogy ha egy változót nemrégiben használt a processzor, akkor annak a tartalma a cache-ben van még, és ha nincs volatile, akkor onnan kivehető. Ha van volatile előtte, akkor minden egyes használatkor az eredeti helyőről kell beolvasni. Ez akkor létszükséglet, ha "valaki más " (pl. másik szál, interrupt) is változtat a változó értékén. Ilyenkor lehet figyelni pl. arra, hogy ha egy vektorba rakjuk az értékeket, és a foglaltságot növeljük, akkor mi történik, ha a kettő között kéri a program (pl. interrupttal) valamelyik értéket. A legősibb, hogy addig letiltjuk az interruptot, a korszerűbb meg a mutex, hogy nem engedjük, hogy másik szál használja.
Amit linkeltél, ott nem látok bajt a sorrendiséggel, vagy párhuzamos hozzáféréssel. -
Blasius
tag
Igen, egy delay(5) segített. Még egy másik helyen a kódban előfordult egy hasonló eset. Azta... itt ilyenek vannak?
@Janos250
volatile char receivedChars[numChars]; el nem fordult le. (A volatile nem tudom pontosan mit csinál).A kód soros partról olvas. Van egy függvény ami karakterenként beolvassa ami a soros porton van. Ezeket hozzá csapja char receivedChars[numChars] -hoz (még néhány más dolog is történik, crc számítás stb) Ha jött egy 0x0a a soroson, az adat fogadás befejezettnek tekintett, és a függvény egy boolt átvált igazról hamisra. Egy másik függvény kezd valamit a beolvasott receivedCharsal, majd visszaváltja a boolt. A második függvénynél reklamált a fordító a volatile miatt. A hármas példa alapján indultam el. https://forum.arduino.cc/t/serial-input-basics-updated/382007
-
Janos250
őstag
-
Janos250
őstag
"Mi az a 24"
Kétféle mask megadás terjedt el:
Az egyik (eredeti), hogy a mask 32 bitjében az első valahány bitet "folyamatosan" 1-re, az utána következőket pedig 0-ra állítod. Ezt használja pl. a windows
Másik, hogy /valamennyivel adod meg, hogy a mask első hány bitje egyes. A UNIX alapú rendszerek ezt használják, és ez persze jobb, mert nem lehet pl. a maskban mondjuk 50-et megadni, bármilyen kezdő is hálózat témában az illető.
A szabály a következő:
Van a Te IP címed, és van az, akivel dumálni akarsz.
A maskkkal mindkettőt bitenként logikai ÉS-eled. Azaz mindkettőben kinullázod azokat a biteket, ami a maskban 0.
Ha az így kimaskolt két cím "maradéka" megegyezik, akkor ugyanazon az alhálón, "dróton" van a két eszköz, azért küldesz egy broadcast (mindenkinek az alhálón szóló) üzenetet,
amivel megkérdezed, hogy kié az az IP cím. Ha valakié, akkor az válaszként elküldi a MAC címét, mert az alhálón nem IP, hanem MAC szerint kommunikálsz majd.
Ha senki nem válaszol, akkor levonod azt a következtetést, hogy nincs ilyen bekapcsolt gép -> hibajelzés. Ha valaki válaszolt akkor az küldi a MAC címét, és indulhat MAC cím alapján a kommunikáció. Ha a két maszkolt cím nem egyezik meg, akkor a gatewaynek (kapu a világ felé) kell küldened, és az ő dolga, hogy megkeresse, hogyan tovább, mert akkor az az állomás nem a Te alhálódon van.
Régen, amikor még nem a csillagpontos topológiát használtuk általánosan, hanem a busz topológiát, ott egyetlen koax kábelre voltak sorban felfűzve a gépek, akkor az szemléletesebb volt, mert akkor ami egy kábelen volt, az volt egy alháló.
Aztán, mivel egy gépen több alkalmazás is csatlakozhat a nethez (pl. két megnyitott Firefox), valahogy meg kell különböztetni, hogy ami válasz jön, az melyik FF-hez menjen. Ehhez az állomásod egyetlen IP címét még "kiegészíted a gépen belül még 2 bájttal", ennek a neve a port, amit a PHP átnevezett, ha jól emlékszem sessionra. Hogy kevesebben értsék meg, miről is van szó.Mivel az IPv6 már rengeteg IP címmel dolgozik, ott már az egy gépen belül is jut mindenkinek külön IP, ezért az IPv6-ban nincs port.
-
Janos250
őstag
válasz
Blasius #19703 üzenetére
Ennyiből nem látom át, de nem az a baj ugye, hogy "máshol is elérhetõ kell hogy legyen:", nincs volatile, hogy ne optimalizáljon a fordító?
volatile char receivedChars[numChars];
Továbbá - nem tudom mitől receive, tehát valahonnan jön - ahhoz is kellhet idő. Ehhez viszont Aryes javaslata a megoldás -
Blasius
tag
Sziasztok,
Nagyon különös problémával találkoztam. Nézzétek meg az alábbi kódrészletet. Ha a kódot úgy futtatom hogy a soroson író részeket kikommentelem, "nmea" nem számolódik jól. Ha a sorosra írás nincs kikommentelve, akkor "nmea" jól számolódik
. Erre nem tudok gombot varrni. Jópár órám ráment mire rájöttem hogy ezzel van a hiba... Van valakinek esetleg ötlete hogy mi történik itt?
...
else if (inhibi == false
){nmea ^=rc; receivedChars[ndx] = rc; ndx++;
Serial.print(" nmea in calc ");
Serial.println(nmea, HEX);
Serial.print(" inhibi in nmeabuild: ");
Serial.println(inhibi);
Serial.print(" rc recorded ");
Serial.println(rc);
if (ndx >= numChars) {ndx = numChars - 1;}
}
...
A kódrészlet egy függvény része.
Az érintett változók a függvényen belül vannak definiálva a következõképpen:bool inhibi = false;
byte nmea = 0x00;
char rc;
static byte ndx = 0;
Kivéve ez, ami a kód legelején van, mert máshol is elérhetõ kell hogy legyen:
char receivedChars[numChars];
-
JozsBiker
aktív tag
Hát ha nem is egyszerre 255, de ha minden eszköznek fix ip címet adsz, ahogy én teszem, előbb-utóbb el tud az fogyni[...]
Az IP cím elfogyással kapcsolatban egy kis szösszenet. Bocs az offtopicért, de talán az érdekessége miatt tetszeni fog:
Új hozzászólás Aktív témák
Hirdetés
- Formula-1
- EAFC 25
- Milyen videókártyát?
- A Fehér Házban marad a Starlink Trump és Musk rossz kapcsolata ellenére
- Hobby rádiós topik
- Kazy Computers - Fehérvár - Megbízható?
- Fotók, videók mobillal
- Kecskemét és környéke adok-veszek-beszélgetek
- Lakáshitel, lakásvásárlás
- Azonnali notebookos kérdések órája
- További aktív témák...
- FÉL ÁR ALATT! Lian Li UNI FAN SL120 RGB 1db-os és 3db-os ventilátor szett garanciával
- Game Pass Ultimate előfizetés azonnal, élettartam garanciával, problémamentesen! Immáron 8 éve!
- AKCIÓ! ASUS MAXIMUS VIII HERO Z170 chipset alaplap garanciával hibátlan működéssel
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RX 9070 16GB GAMER PC termékbeszámítással
- 10% -tól elvihető. Országosan a legjobb BANKMENTES részletfizetés! Lenovo Legion Pro 7
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest