- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- iPhone topik
- Poco X6 Pro - ötös alá
- Amazfit GTS 4 Mini - bármely csuklóra
- Apple iPhone 14 Pro Max - sziget fesztivál
- Motorola Moto G24 Power - hol van az erő?
- Apple Watch Ultra - első nekifutás
- Mobilinternet EU-n kívül, eSIM adatcsomagok használata
- MG4 menetpróba
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
Hirdetés
-
AMD Radeon undervolt/overclock
lo Minden egy hideg, téli estén kezdődött, mikor rájöttem, hogy már kicsit kevés az RTX2060...
-
A személyre szabott reklám lehet a streaming következő slágere
it A jobb célzott hirdetések érdekében adatplatformot indít a Warner Bros Discovery.
-
A Video AI lehet a One UI 6.1.1 ütőkártyája
ma Vagy hogy fogja a mesterséges intelligencia manipulálni a mozgóképeket?
-
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
-
gordonfreemN
addikt
válasz gordonfreemN #19790 üzenetére
Ez jelenleg szintén azt teszi, hogy megnyomom: felvillan és marad akkor is ha elengedem a gombot.
(#19791) vargalex
A -1-es case esetén (eset esetén ) ha betettem a break-et, akkor a case -1 és a hozzá tartozó break közti műveleteket sem hajtotta végre.(#19792) vargalex
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. Akkor ez pipa, így is csináltam, de nem a kívánt (még nyomom addig világít) módon működött továbbra sem.
Viszont azt gyanítom, hogy kellene valami timeout is, mert amíg nyomod, addig jön a -1, igen ez így van
de ha elengeded, akkor nem fog jönni semmi igen, ez is így van
és nem is fut be a default ágba. pontosan ezt próbáltam meg lentebb kevesebb sikerrel megosztani
Vagy, ha nem nyomsz gombot, akkor az irrecv.decode-ban áll? Ott hogyan állhat, ezt honnan tudom? Az a baj, azt se tudom az irrecv.decode mit jelent vagyis mit csinál, számomra ismeretlen arduino parancs. Keresgéljek utánna? Vagy van kedved esetleg segíteni megérteni? A jelentése gondolom én az lenne, hogy IR receiver decode, azaz az IR vevő dekódolás, tehát a fogadott jel dekódolása, vagyis a fogadott, IR adó által küldött kódból különböző szűrőfázisokon és demoduláláson átesett jel[ Szerkesztve ]
¯\_(ツ)_/¯ ▁ ▂ ▃ ▅ ▆ ▇ Üdv, Andris.
-
bagarol
junior tag
válasz gordonfreemN #19801 üzenetére
Kicsit megkavart a waiting,de ennek jónak kell lenni:
#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;
case -1:
lastms = millis();
break;
default:
Serial.println("Waiting ...");
}
irrecv.resume(); // Receive the next value
}
if (millis() - lastms > 150) {
lastms = millis();
digitalWrite(pausePin, LOW);
digitalWrite(playPin, LOW);
}
} -
gordonfreemN
addikt
válasz bagarol #19802 üzenetére
Ugyanaz. Miután lenyomtam a gombot, világít és úgy is marad gomb felengedésre is. Váltani persze vált a két led közt.
(#19791) vargalex: egy kérdés még a break-kel kapcsolatban: tehát ha befut egy case-be, akkor végrehajtja ami ott van, majd ha a végén ott figyel a break, akkor ez azt jelenti a loop innen indul ujra. Jól gondolom?
[ Szerkesztve ]
¯\_(ツ)_/¯ ▁ ▂ ▃ ▅ ▆ ▇ Üdv, Andris.
-
bagarol
junior tag
válasz gordonfreemN #19803 üzenetére
Pedig rá kéne futnia az utolsó if-re.
A break-re kilép a switch-ből. -
bagarol
junior tag
válasz gordonfreemN #19805 üzenetére
-
gordonfreemN
addikt
válasz bagarol #19806 üzenetére
kérdésem még az volna, hogy ha értem mi történik az már egy lépés előre?
Annak ellenére, hogy most pl. te írtad meg a kódot helyettem, azért ilyenekből is tanulok, vagy ezt teljesen más szinten kellene művelnem?Ezekre keresem a választ, hogy mit csinálnak:
1) IRrecv irrecv(RECV_PIN);
2) decode_results results;
3) irrecv.enableIRIn();
4) if (irrecv.decode(&results)) {
5) long int decCode = results.value;
6) irrecv.resume();[ Szerkesztve ]
¯\_(ツ)_/¯ ▁ ▂ ▃ ▅ ▆ ▇ Üdv, Andris.
-
lanszelot
addikt
válasz lanszelot #19750 üzenetére
Hello,
Akkor ebben senki sem tud segíteni?
Nem lehet megoldani?Ez nem működik /loop ban van/:
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
delay(200);
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
delay(200);} -
lanszelot
addikt
válasz bagarol #19809 üzenetére
Hello,
A program az ennyi.
Ha a szenzor érték 90 alatt van akkor írja ki nincs gáz, ha felette akkor villogjon a négyszög
Utána még annyi van hogy azt is kiírja, hogy gáz, bele a négyszögbe
De az már az "if" -en kívül van, az nem szól beledisplay.print(gas);
Amit írtál az sehogy se jó: - "a" nincs létrehozva.
- így nincs értéke, se tipusa.
- ezért "if" -en belül nem igaz/hamis lesz "a", így "if" nem működik
- te ha létrehozom "a" -t akkor se müködik, mivel minden esetben ugyanaz az ág fog lefutni a loop miatt. Attól függ igaz vagy hamis "a" -t hozok létre.kérdéseim:
- Az enyém miért nem működik? loop indul, kirajzoja a fehér négyzetet, vár, kirajzolja a fekete négyzetet, vár, loop újra indul. vagy nem ezt írtam?
- "a^=1;" mi az a ficak, és mit csinál?
- -
nagyúr
válasz lanszelot #19811 üzenetére
uint32_t lastms= 0;
bool blink = true;
void loop() {
if (sensorValue < 90) {
gas = "No Gas";
}else{
gas = " Gas";
if (millis() - lastms > 200) {
lastms = millis();
if (blink)
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
blink = !blink;
}
}
} -
lanszelot
addikt
Mindenkinek nagyon szépen köszönöm
(millis() - lastms > 200)
ezzel a villogás idejét szabályozom, ha jól értem
ha 200 helyett 4000 -et írok, akkor lassabban villog.
Fura megoldás, mert így csak a feketét késlelteti, tehát a fehér ugyanúgy rövid ideig vam.
Így meg olyan mintha nem villogna, ha pl 8000 -et írok.
Tudom, hogy kell átírni delay-el, csak értelmezni próbálom, hogy miért csak a fekete kapja meg a delay időt. Hiszen az mindenképpen lefut ha fehér ha fekete.
Nagyon kezdő vagyok programozásban
Agyalnom kellett mi micsoda.
uint32_t sem ismertem.
De legalább utána kellett járnom, és tanulhattam -
DigitXT
félisten
válasz lanszelot #19815 üzenetére
Nem lehet, hogy valami LCD frissítési turpisság van mögötte? Vmi felülír valamit? Milyen kijelző? Szerintem a display.print(gas)-t sem kellene állandóan kitolni neki, csak ha változott az érték. Meglehet, hogy maga a felirat tünteti el a fehér keretet: ha így van, megpróbálkoznék kicsit nagyobbra venni, hogy kilátsszon mögüle.
[ Szerkesztve ]
-
lanszelot
addikt
válasz DigitXT #19816 üzenetére
Ez a kijelző.
Nem frissítési turpisság.
És nem írja felül semmi. Ha egymásra iratok vmit, mind a kettő ott van egymáson. Nem takarja ki.
Az érték folyamatosan változik.
A fehér a loop futtatási idejét tartja, a fekete a beírt értéket.
Pl 200 nál szinte egyformán váltanak, hisz 0.2s. 8000 nél pedig a fekete 8s míg a fehér ugyanannyi mint volt 200 nál. De írhatok be bármilyen számot.
Biztos hogy vmilyen bug, hogy páratlan futásokkor miért nullázódik. Valami a lastms alap ertéke miatt lesz. Csak én nagyon kezdő vagyok. Nem tudom miért.[ Szerkesztve ]
-
lanszelot
addikt
válasz bagarol #19818 üzenetére
A tiéd azért jobb, mert jól működik.
A másik vmiért bug -os. Sztem a millis() function működése okozhatja.Igazából mivel a kijelző nem színes, így a fekete valójában kikapcsolja. Mivel pont ugyanazokat a pixeleket irom felül, ezért mind a 2 esetben ki be kapcsolgatom a pixeleket.
-
Tomika86
senior tag
Sziasztok!
Kettő részből áll a kérdésem:
- Tud valaki jó tutorial-, vagy leírást, hogy a weboldalon lévő javascript kód hogy adja át az adatokat az esp32-nek. ESPAsyncWebservert-t használok, ebbe hogy jönnek át az adatok.
- Ki van aki beleásta magát az ESPAsyncWebserver könyvtár rejtelmeibe?
Egy WebServer könyvtárral íródott programot szeretnék átalakítani async könyvtárra, de nem akar menni.Példaként, itt egy html kód:
<!DOCTYPE html>
<html>
<head>
<script type='text/javascript'>
var file,cmp,partSize=100,offset=0;
function upload(){
file=document.querySelector('input[name=file]').files[0],
partSize=parseInt(document.querySelector('input[name=partSize]').value),
cmp=document.getElementById('completed'),
file?sendInfo(file.size):alert('Choose firmware file.')
}
function sendDataHandler(e){
if(null==e.target.error){
cmp.innerText=(100*offset/file.size).toFixed(1)+'%',
offset+=e.target.result.byteLength;
var t=new XMLHttpRequest;
t.onreadystatechange=function(){
4 == t.readyState && 200 == t.status && (offset<file.size?sendData():cmp.innerText='All data was sent')
},
t.open('post','/nextion_update'),
t.send(e.target.result)
}
else alert('Error: '+e.target.error)
}
function sendData(){
var e=new FileReader,
t=file.slice(offset,partSize+offset);
e.onload=sendDataHandler,
e.readAsArrayBuffer(t)
}
function sendInfo(e){
var t=new XMLHttpRequest;
t.onreadystatechange=function(){
4==t.readyState&&200==t.status&&sendData()
},
t.open('post','/nextion_fs'),
t.send(e)
}
</script>
</head>
<body>
<input type='file' name='file'/>
<input type='button' value='upload' onclick='upload()'/> <br/>
<label id='completed'></label>
<br/> Chunk size: <input type='text' name='partSize' value='1024' size='4'/>
</body>
</html>
Ebben történik adatküldés esp felé, és ESP programban megérkezik, de hogyan?// Receive file size
server.on("/nextion_fs", HTTP_POST, [](AsyncWebServerRequest * request){},
NULL,
[](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
uint32_t fsize = atoi((const char*)data);
Serial.println("Nextion prepare message: " + String(nextion.prepareUpload(fsize)));
Serial.println("File size: " + String(fsize) + "bytes");
// Filesize and connection test
if(nextion.prepareUpload(fsize)) {
Serial.println("Start upload. File size is: " + String(fsize) + "bytes");
request->send(200);
}
else {
Serial.print("Bad file size");
Serial.println(nextion.statusMessage + "\n");
request->send(500);
}
});Nem működik a kód egyébként
Köszönöm!
-
nagyúr
válasz lanszelot #19819 üzenetére
Miután nem láttuk az egész programot, nem is lehet így megmondani, hogy okozza a "bugot". Amit írtam, logikailag nem hibás, valószínűleg a te programod törli a kijelzőt ezért a fehér keret eltűnik kirajzolás után. A másik megoldás azért "nem bugos", mert az minden ciklusban rajzol.
-
lanszelot
addikt
Nem tűnik el. Van fehér keret. Csak rövid ideig.
Ha törölné a fekete tovább lenne.
display.drawRoundRect -> ez újra rajzolja és ott van a fehér és fekete előtt is.
Nem értem mi az hogy nem rajzolja minden ciklusban.
Kijelzőt a loop elején törli. A megosztott oled linkemben is ott van.
Majd ha este haza érek megnézem, ha felcserélem akkor a fehér lesz e hosszabb ideig , vagy akkor is a fekete.Mielőtt kötekedésnek venné bárki, nagyon kezdő vagyok, és próbálom megérteni. Ezért azt írom le amit látok. Lehet rosszul írom. Csak megérteni szeretném.
-
nagyúr
válasz lanszelot #19823 üzenetére
Ha törölné a fekete tovább lenne.
v.s.
Kijelzőt a loop elején törli.Ha a loop végén rajzolsz valamit a kijelzőre, amit a loop elején azonnal törölsz, akkor miért csodálkozol, hogy csak egy pillanatig látszik?
Továbbra sem értem ezt a "fekete keret látszik, a fehér nem" helyzetet, mikor monochrome a kijelző, fekete alapon te hogy látod a fekete keretet?
A megosztott oled linkemben is ott van.
Én nem láttam, hogy bármikor linkelted volna a teljes programot.
Szóval ha minden loop ciklus elején törlöd a kijelzőt, akkor mindent újra kell rajzolni, a keretet is, sőt, ez esetben nem is kell fekete keret, hiszen a ciklus elején a fehér keret törlésre kerül... Jó, hogy úgy kell kibarkóbázni belőled a részleteket.
-
DigitXT
félisten
Egyébként teljesen felesleges az egész képernyőt törölni, csak villogni fog.
De amúgy igaz, hogy így részleteiben beszélgetni egy baromi egyszerű, kicsi
kódsorról, nem fog megoldást hozni, ha a teljes program máshol van elszúrva.
(És itt nem bántásból írom, hogy elszúrva. Én is elkövettem "koncepcionális"
hibát, még a minap is, pedig már programozgattam Arduinora is, és mégis...)Kérjük a teljes kódot, és megköpködjük... Helyesen: segítünk debuggolni!
[ Szerkesztve ]
-
Janos250
őstag
válasz Tomika86 #19820 üzenetére
Nem ástam bele magam az ESPAsyncWebserver rejtelmeibe, nem is tervezem, mert én szeretem "gyalog" megoldani a dolgokat.
Ennek ellenére - mivel a kíbicnek semmi sem drága - azért leírom, hogyan próbálnám
Én így próbálnám meg:t.open("GET","/nextion_update",true)
t.send()
vagy:t.open("GET","/nextion_update="+e.target.result,true)
t.send()
bár annyira nem bogarásztam végig, mi az a e.target.result, gondolom valami érték, amit küldeni akarsz.Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
lanszelot
addikt
feketét fehéret felcserélve is fekete van hosszan, tehát törli a kijelzőt az a gond.
Nincs bug.Valami alap dologban szerintem el vagyok tájolódva.
Nem úgy működik a program, hogy egy sor lefut, majd csak utána a következő, es csak utána a következő..stb fentről le.... ballról jobbra?
Kivéve function, mert ott oda ugratjuk, és végeztével vissza ugrik.Tehát bemegy "if"-be ott tru/false utat követ.
Bent "if" -ben, ha van delay , akkor addig ami meg van ott adva megáll és csak a késleltetési idő leteltével folytatja?
Ha igen, akkor hogy lehet, hogy folyik a delay, és a loop elejére ugrik?
Ha nem, akkor hogy működik?#19817 erre a linkre utaltam
-
DigitXT
félisten
válasz lanszelot #19829 üzenetére
A 200 ms delay nagyon rövid, ha normálisan működne, akkor se villogás, inkább vibrálás lenne az, amit látsz. Amúgy azért nem szerencsés a delay, mert addig nem csinál semmi az MCU, tehát pl. nem mintavételezi az analóg bemeneteket, így ugyanennyivel később fogod észrevenni, ha változott. (Nyilván 0.2 mp nem a világ, de ha felrakod mondjuk 0.5-re, akkor már látható, és felesleges késleltetés a program érdemi működésében, egy minimalista animáció/keret villogtatás miatt.)
Valami alap dologban szerintem el vagyok tájolódva.
Másold be a teljes kódot, kérlek![ Szerkesztve ]
-
Janos250
őstag
válasz Janos250 #19828 üzenetére
Nem tudom, mennyire érthető, mert a sajátot az emberfia nem tudja megítélni, de itt
https://prohardver.hu/tema/arduino/hsz_19675-19675.html
próbáltam írni egy demót.
Más, persze, de van egy input. Igaz, hogy az is range, de input<input type="range"
.
.
.
onchange="servernekElkuld('F',this.value)"
>
servernekElkuld= function(keszulekKod,mitKuldErtek) {
var futesXML = new XMLHttpRequest();
futesXML.open("GET", keszulekKod+"="+mitKuldErtek, true);
futesXML.send();
}
Ezzel valami ilyesmi érkezik meg
GET F=26 ......[ Szerkesztve ]
Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.
-
-
DigitXT
félisten
válasz lanszelot #19834 üzenetére
Nincs ezzel baj, senki nem úgy kezdte, hogy mindent tud, bár bizonyára
könnyebb úgy az élet, hogy az ember legalább nagy vonalakban ismeri a
koncepciót. Viszont úgy segíteni, hogy nem írod meg, pontosan miben...De örülünk, hogy megoldódott. Ha lenne bármi kérdés, biztos tudunk vmi
segítséggel szolgálni, csak ilyenkor látni kellene, miben kell segíteni...Ui: ha már mindent megértettél, akkor rátérhetünk a megszakításokra.
(Vagy nekem még nagy kedvenceim a mutatók, és a type casting, LOL.)Sőt, egy időben a bitshifting is valami fekete mágiának tűnt. Pont csak a
minap vetettem bele magam, és tök könnyű vele dolgozni... Ez van.
Ez a belevetés erős túlzás, de maga a koncepció ott is tök egyszerű, és
ha érted a szintaxist, akkor teljesen triviális a megfogalmazás...
De ha egyik sincs meg, akkor tényleg csak néz az ember, hogy EZ MI?![ Szerkesztve ]
-
DigitXT
félisten
válasz lanszelot #19836 üzenetére
Nagy vonalakban úgy, ahogy írod, egymagos processzoron: pont erre céloztam,
hogy azért a megszakítás ennek keresztbe tud verni rendesen, illetve többszálú
programnál egyéb problémák is felmerülnek a párhuzamosítással kapcsolatban.
(Márpedig egy ESP32 pl. kétmagos, szóval nem teljesen elrugaszkodott dolog.)Az a baj, hogy feltételezed, hogy adott programrészbe került és ott volt a baj a
delay funkcióval, pedig ez a legkevésbé valószínű. Sokkal valószínűbb, hogy
a kód nem is ott tartott. Ilyenkor hasznos beszúrni egy pár Serial.print(akármi)
hívást a kritikus részekre, és nézni a Serial Monitor-on, hogy mit írtál el...Nagyon könnyű elgépelni valamit, s ha megeszi a fordító, akkor sz.rul fog futni:
az egyik ilyen legtriviálisabb (kezdő*) hiba valami értékének a téves vizsgálata,
nevezetesen ha véletlenül nem az "==" operátort használod, hanem az "="-t...
Simán lefordul, simán fut, csak nem azt csinálja, amit gondoltál, hanem amivel
hasonlítanád, azt adja értéknek, majd értékeli, hogy 0 vagy 1* az eredmény.*: de nem csak kezdők követhetik el, hiszen lehet elgépelés is, emiatt néhány
fejlesztői környezet direkt nézi az ilyet, warningot dob rá, hogy ezt akartad-e...*: pontosabban "nem nulla", nehogy valaki belekössön... Egy gyors példa erre:
if (sensorValue = 90) { valami } else { egyéb } Ennél nem csak az a baj, hogy
az "egyéb" soha nem fog lefutni, hanem az is, hogy a sensorValue utána végig
90 lesz, egészen amíg újra be nem olvastad... (És ez egyetlen pici elgépelés.)[ Szerkesztve ]
-
lanszelot
addikt
De milyen programot látok?
Bármelyik program futásáról kérdeztem.
Hogyan fut le egy program?
Ez volt a kérdés.
Írtam hogy hogyan gondolom.
Azt is valószínű hibásan.DigitXT:
Az a program amit bemásoltam az annyi.
Nincs" ==" nincs semmi. Nincs vizsgálat.
Tanulok, és par soros programokat próbálok írni.
Vettem egy készletet, van benne minden.
Kiveszek valamit a készletből és megpróbálom működésre bírni.
Van hozzá program a dvd-n, de azzal mit tanulnék, ha megírt programokat töltögetnék fel a leírás szerint?Az előbb kivettem egy gáz érzékelőt:
Érzékelő egy adatot küld.
Ezt kiiratom, és ennyi.
Semmit se csinálok vele, nincs semmi más.
Oled programja ott van a linkben, gáz érzékelő pedig x pin -rol bejön.
A gaz érzékelőnek még library se kell.
Semmi sincs a programban.
If-et azért raktam be hogy gyakoroljam az 'if' et.
Ennyi. Nincs hova rakni a serial print -et, mert van az 'if' és nincs más.
Nincs program. Csak kezdő vagyok. A legelején tartok.
De azt a programot már megoldották.
2 megoldás is jött.
Utána irtam, hogy nem értem az egyiket.
Majd azt hittem jól gondolom a program futásának menetét az arduino -n, és emiatt rosszul értelmeztem a programot.
Rájöttem hogy rosszul értelmezem.
Leírtam hogy képzelem el a program futását.
De oda írtam valószínű rosszul kepzelem.
Ezért kérdeztem, hogyan fut le egy program?
Most már az egymagos két magost sem értem.
Valószínű mivel az alap futást sem tudom. -
tibi-d
tag
Adott egy fűtőberendezés. A teljesítmény szabályozása PWM jellel történik. A teljesítmény fokozatnak van egy engedélyező bemenete is. Ha az engedély "H" akkor a PWM vezérli a teljesítményt. Ha "L" a PWM csinálhat akármit, a teljesítmény "0". Ezt egy Arduino vezérli. A probléma akkor keletkezhet, ha mondjuk az Arduino "lefagy", tönkre megy, és az engedélyező bemenet és a PWM jel is "H"-ban ragad. Ekkor a fűtőberendezés kontrollálatlanul elfűtheti magát, és akár tüzet is okozhat. Ennek a lehetőségét is el kéne kerülni. Arra gondoltam, hogy az engedélyező jelet nem közvetlenül az Arduino vezérelné, hanem egy védelmi áramkör közbeiktatásával, ami érzékelné, ha az Arduino lefagyna, vagy meghibásodna. Arra gondoltam, hogy az engedélyező jelet ciklusonként kapcsolgatnám ki-be, így kapnék egy szaggatott jelet. Ezt egy kondival leválasztva, egyenirányítva vezérelnék egy tranzisztor, vagy fetet és ez engedélyezné a teljesítmény fokozatot. Ha a jelváltozás megszűnik, az engedély egy idő múlva megszűnne, és leáll a fűtés. Az elképzelés életképességére lennék kiváncsi, vagy, ha van egyszerűbb megoldás, azt is szívesen fogadom.
-
sonar
addikt
-
DigitXT
félisten
válasz lanszelot #19842 üzenetére
Az a program amit bemásoltam az annyi.
Nem, nem annyi, mert csak egy részét másoltad be, a többiről meg vagy írtál,
vagy nem. Így nem lehet érdemben segíteni, hogy félinformációkat közölsz.Nincs vizsgálat.
Mert a sensorValue < 90 az szerinted mi, ha nem egy feltétel vizsgálata?mit tanulnék, ha megírt programokat töltögetnék fel a leírás szerint?
Nagyon sokat: megnézed mit csinál, lépésről-lépésre megpróbálod megérteni.Nincs program. Csak kezdő vagyok. A legelején tartok.
Attól még amit megírtál, és feltöltöttél egy program. Arduino esetén van neki
egy setup része, meg egy loop. Te a loop-ot sem osztottad meg velünk...Mondok egy vicceset. Annak idején egy programozási versenyen sajnos már
nem maradt időm az egyik feladatra egyáltalán, de mivel volt példa, hogy mit
kérdezhetnek a programtól tesztként, annyit írtam, hogy azt választ írja ki.Még csak if sem volt benne, egyszerűen ilyen jellegű megoldás volt: print(42)
Ha és amennyiben a teszt kérdésre jó volt a válasz, érhetett egy pontocskát.Azt mindenkire rábízom, hogy mi volt a kérdés...
-
lanszelot
addikt
válasz DigitXT #19845 üzenetére
Először is köszönöm szépen a választ.
Mint írtam, már #19815 óta nem a programról van szó, hanem csak általános programozási kérdéseket tettem fel.
Valószínű nem jól fogalmazok, ezért elnézést kérek.Itt az a program az érzékelőhöz aminél a négyzet nem működött. /de nem erről kérdeztem/
#include <Adafruit_SSD1306.h>
#include <splash.h>
uint32_t lastms= 0;
bool blink = true;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
display.display();
delay(2000);
}
void loop() {
int sensorValue = analogRead(A0);
int isgas = digitalRead(2);
String gas;
delay(1000);
display.clearDisplay(); //this line to clear previous logo
display.setTextSize(2); /*text size 3*/
display.setCursor(3,0); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("Gasmeter");
display.setTextSize(1); /*text size 2*/
display.setCursor(0,50); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("CO2 = ");
display.print(sensorValue);
display.print(" PPM ");
if (sensorValue < 90) {
gas = "No Gas";
}else{
gas = " Gas";
if (millis() - lastms > 4000) {
lastms = millis();
if (blink)
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
blink = !blink;
}
}
display.print(gas);
display.display(); //to shows or update your TEXT
}
pont ezért nem szúrtam be, mert lehetetlen ide berakni
Mint láthatod, nincs benne semmi az "if" -en kívül[ Szerkesztve ]
-
DigitXT
félisten
válasz lanszelot #19848 üzenetére
Most, hogy bemásoltad a kódot, lehet érdemben beszélgetni róla.
Szóval Arduinonál úgy működik, hogy először lefut a setup, aztán meg
átmegy a loop-ba, s az végtelenül ismétlődik. Esetedben ugye a setup
egyrészt inicializálja a kijelzőt, másrészt (meglepetés!) elindítja a soros
portot is, 9600 baud beállítással. Ez azért jó, mert a Serial Monitoron a
program futását tudod monitorozni és tudod debuggolni, ha vmi "gázos".A delay használata egyszerű programoknál rendben van, vagy ha vmire
kifejezetten várni kell, hogy megtörténjen. Ellenben, egy olyan program,
ami folyamatosan (kellene hogy!) nézzen egy bemenetet megakad tőle:
tehát az a delay(1000) az elején feleslegesen vár egy másodpercet. És
amit utána kiértékelsz, az NEM az aktuális mért érték! Hanem még az
egy másodperccel korábbi: nyilván "tanulós" programban ez is elmegy,
amennyiben az ember tisztában van vele. De ha nem, kigyomlálandó...
Erre jött a jótanács a millis() használatról, hiszen az egy mindenkoron
növekvő számláló, a bekapcsolástól kezdve, ezredmásodpercben.
(Tehát, anélkül tudsz mondjuk ~1 másodpercenként csinálni "akármit",
hogy az MCU kifejezetten addig az 1 másodpercig ne csinálna mást...)A koncepcionális különbség pedig annyi, hogy nem megállsz és vársz,
hogy elteljen egy adott időszak (közben nem csinálsz semmit), hanem
szépen csinálod a dolgod, csak időről időre az órádra pillantasz, és ha
azt látod, hogy eltelt már az adott (várakozási) idő, akkor csinálod meg
az időzített/ütemezett feladatot. (Így több dolgot is kényelmesen tudsz
más-más időközönként végrehajtani.) Első körben szerintem ennyi...pont ezért nem szúrtam be, mert lehetetlen ide berakni
Nekem nem úgy néz ki, mintha lehetetlen lenne, ha egyszer sikerült... -
nagyúr
válasz lanszelot #19848 üzenetére
A kolléga már szépen elmagyarázta ( neki ), én csak a beszúrás részéhez szólnék hozzá:
A hozzászólás írásakor a szövegmező fölött van egy "Váltás a régi szerkesztőre" link. Ez azt csinálja, amit ígér.
Ezzel hibátlanul lehet kódot beszúrni:#include <Adafruit_SSD1306.h>
#include <splash.h>
uint32_t lastms = 0;
bool blink = true;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
display.display();
delay(2000);
}
void loop() {
int sensorValue = analogRead(A0);
int isgas = digitalRead(2);
String gas;
//delay(1000);
display.clearDisplay(); //this line to clear previous logo
display.setTextSize(2); /*text size 3*/
display.setCursor(3, 0); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("Gasmeter");
display.setTextSize(1); /*text size 2*/
display.setCursor(0, 50); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("CO2 = ");
display.print(sensorValue);
display.print(" PPM ");
if (sensorValue < 90) {
gas = "No Gas";
}else {
gas = " Gas";
if (millis() - lastms > 4000) {
lastms = millis();
blink = !blink;
}
if (blink)
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
}
display.print(gas);
display.display(); //to shows or update your TEXT
}Ez javított kód, minden loop ciklusban kirajzolja a keretet, csak a színét változtatja 4000ms-onként (ez szerintem sok, én 500-at állítanék be).
Ez a két sor a rendszeres törlés miatt valószínűleg nem is kell:
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);[ Szerkesztve ]
Új hozzászólás Aktív témák
- Sony 55-210mm f/4.5-6.3 OSS (Sony E)
- Eladó több mint 2 év garanciával - LG OLED48C21LA / 4K/UHD/2160P/120Hz/OLED
- Razer Blade 16 2023 (i9 13950HX,RTX 4090 16Gb, 32GB DDR5 5600Mhz, 2x 1TB, 16" Dual UHD+FHD+ MiniLED)
- S23 Ultra 4 hónapos tokkal, garanciával eladó!!
- Üzletből,DELL garanciával, Dell XPS 9310 2in1 ultrabook, i7-1165G7/32RAM/1TBSSD/13,4"UHD TOCH