Hirdetés

2024. április 27., szombat

Gyorskeresés

Téma összefoglaló

Téma összefoglaló

  • Utoljára frissítve: 2023-03-11 00:46:52

LOGOUT.hu

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.

Összefoglaló kinyitása ▼

Hozzászólások

(#20001) ReFleXx válasza lanszelot (#20000) üzenetére


ReFleXx
addikt

felhúzo ellenallast nem használsz a gombnal?
anelkul lebeg a port bemenete es erzekelhet gombnyomasokat

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20002) bagarol válasza ReFleXx (#20001) üzenetére


bagarol
junior tag

Pont ezt akartam írni, gomb input_pullup.

[ Szerkesztve ]

(#20003) lanszelot válasza ReFleXx (#20001) üzenetére


lanszelot
addikt

azért vettem ki, mert legtöbbször nem érzékel gombnyomást.
de ellenállás nélkül sem érzékel legtöbbször

nem tudom miért.
azért gondoltam, hogy rosszul kötöttem be a gombot
színhelyesen van kötve.
piros- pozitív 5V
fekete - gnd
kek - 5 pin
[kép]

(#20004) ReFleXx válasza lanszelot (#20003) üzenetére


ReFleXx
addikt

stotno

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20005) lanszelot válasza ReFleXx (#20004) üzenetére


lanszelot
addikt

félre értettél, ha benyomom a gombot, akkor nem érzékel.

de valami gond lesz a programmal azért:
mivel ha be van kötve úgy ahogy a képen, akkor
avrdude.exe: stk500_recv(): programmer is not responding
avrdude.exe: stk500_getsync() attempt 1 of 10: not in sync: resp=0xee

hibával nem tudok feltölteni a nano-ra semmit

ha lehúzom a kéket, akkor megszűnik a hiba

tehát vagy a bekötésem nem jó, vagy a program.
és ezért nem reagál a gombnyomásra.

Az normális, hogy ha le van húzva pin5, akkor változik a "gombNyomas " nevű változó értéke, aminek pin5 inputnál kellene változni?

(#20006) ReFleXx válasza lanszelot (#20005) üzenetére


ReFleXx
addikt

normalis , mert akkor lebeg a pin5, ha bekotod akkor az ellenallassal lehuzod GNDre.
igy a kep alapjan jonak tunik a bekotes, eloszor elforgatva neztem :DD
mekkora az ellenallas amit hasznalsz?
vagy vedd ki az ellenallast es hasznald az input_pulldownt ha van olyan.
ha nem akkor megkell forditani a logikat, pullupolni kell a pint es a gombbal meg a gndre kell lehuzni, ehez a programot is igazitani

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20007) bagarol válasza lanszelot (#20005) üzenetére


bagarol
junior tag

Amúgy a gombnak 0-ra kéne zárnia a pint, úgy jobb lenne.
INPUT_PULLUP

[ Szerkesztve ]

(#20008) ReFleXx válasza bagarol (#20007) üzenetére


ReFleXx
addikt

marmint GNDre, ahogy nezem nanoban nincs belso pulldown csak pullup.
de erdekelne mekkora az ellenallas.

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20009) lanszelot válasza bagarol (#20007) üzenetére


lanszelot
addikt

De hát a közelebb lévő lábakat zárja, úgy van bekötve.
gnd -> R -> kék ---- ez alapból zárva van, és gombnyomásra zárva is marad
5V -> piros ---- ezt zárja a gomb össze a kékkel

Nem így kell?

ReFleXx - sajnos ezt nem értem, kezdő vagyok nagyon :B
barna fekete fekete piros barna - 10k
ha fordítva van akkor - 120
képen látszik, de nem tudom eldönteni melyik a kezdő szín
sztem 10k

valami nem ok ezzel így
hibák:
5-ös pin , ha ezen van a gomb a gáz érzékelő nem mér
ezért át raktam 4-es pin-re
így a gáz érzékelő mér, de a gomb így se működik jól.
random váltogat, amikor épp kedve van, ha nyomkodom a gombot, és van hogy 1 nyomást 2-nek vesz.
tehát a változó értékét nem növeli a gomb nyomás, csak néha, és van hogy 2-vel növeli meg az értéket
tuti ezzel lesz gond:
else if (gombNyomas > 3) {
gombNyomas = 1;
}

mert van 4-es érték , ha Serial Monitoron nézem a változó értékét

(#20010) Tankblock válasza bagarol (#20007) üzenetére


Tankblock
aktív tag

A kódban le kellene kezelni a váltást is, mert jelenleg ha lenyomja folyamatosan fogja pörgetni a számlálót felfele ....

4 értékű állapotot nem kellene elérni a feltétel vizsgálatakor. Előtte a modulóját illene venni, vagy ha 4 értékű akkor számlálót 1re tenni....

Release the Beast....

(#20011) ReFleXx válasza lanszelot (#20009) üzenetére


ReFleXx
addikt

persze hogy van, eloszor kiiratod es utana allitod 1re, 5 mar nincs is.
helyedbe kiprobalnam csak a gombot, kiveszed az ellenallast, pinmodenal input_pulluppal allitod be nem csak inputtal.
4 v 5-s pin -gomb - GND
gomb benyomaskor igy LOW lesz , alapbol meg HIGH.
a kod tobbi reszet kivennem es csak a gomb reszt hagynam bemt, ha az mar megy akkor menj tovabb.

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20012) bagarol válasza lanszelot (#20009) üzenetére


bagarol
junior tag

pinMode(gombPin, INPUT_PULLUP);
if (gombAllapot == LOW)

Szoftveres gombkezelés kéne mert most prellezik a gomb, ideiglenesen köss vele párhuzamosan egy kis kondit.

(#20013) lanszelot válasza ReFleXx (#20011) üzenetére


lanszelot
addikt

"pinmodenal input_pulluppal allitod be nem csak inputtal." - ezt nem értem

bagarol
ezt sem értem "Szoftveres gombkezelés", "prellezik a gomb",
- "ideiglenesen köss vele párhuzamosan egy kis kondit." - mivel?

[ Szerkesztve ]

(#20014) bagarol válasza lanszelot (#20013) üzenetére


bagarol
junior tag

Amit írtam nem kell külön ellenállás, gomb a pinre és a gndre.
A gombbal párhuzamosan egy 1-10 nanos kondi.

(#20015) Tankblock válasza lanszelot (#20013) üzenetére


Tankblock
aktív tag

[link]

A kapcsoló fizikai volta végett nem egyetlen egységugrást fog végrehajtani, hanem sok kicsit. Mivel gyors contorollered szépen mindegyiket állapotváltásnak fogja regisztrálni.
Ha a gombot megnyomva egy ellenálláson keresztül egy kondenzátort töltesz akkor ez pergés nem fog látszani a uControllered számára.

A másik effekt ha csak egy állapotot figyelsz a relatíve gyors loop() függvényeddel akkor azt fogod tapasztalni, hogy folyamatosan változik az értéked....

Erre vannak megoldások : [link] vagy van még sokkal másabbak is lsd első link, és még azon kívül is....

Release the Beast....

(#20016) lanszelot válasza lanszelot (#20003) üzenetére


lanszelot
addikt

A programmal lesz gond, nem a kapcsolóval, ez tuti.

Jelen állapotában, ha be van kötve a kapcsoló, akkor indulásnál, vagy amikor bedugom a kapcsolót, akkor kifagy

#include <MQ135.h> /*gaz erzekelo, de nem kell neki igazabol*/
#include <Adafruit_SSD1306.h> /*oled display*/
#include <splash.h> /*oled display -nek kell*/
#include <max6675.h> /*homero*/

int thermoDO = 10; /*valtozo a homero DO pin -nek*/
int thermoCS = 9; /*valtozo a homero CS pin -nek*/
int thermoCLK = 8; /*valtozo a homero CLK pin -nek*/
int gombNyomas = 1; /*valtozo a gomb nyomas szamlalasara*/
int gombPin = 4; /*valtozo a gomb pin -nek*/
int gombAllapot = 0; /*valtozo a gomb allapot olvasasahoz*/
byte a = 0; /*valtozo a gaz erzekelo negyzet villogashoz*/




MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);


Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);


void mindenRajtaVan() {
int sensorValue = analogRead(A0); /*valtozo a gaz erzekelo alalog pin -nek*/
int isgas = digitalRead(2); /*valtozo a gaz erzekelo digitalis pin -nek, ez arra kell, ha gas van akkor jelet ad, nem kell kulon erteket adni*/
String gas; /*valtozo a gaz erzekelo gas vagy no gas kiirasahoz*/
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(10,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("C = ");
display.print(thermocouple.readCelsius());/*Celsius*/
display.setTextSize(1); /*text size 2*/
display.setCursor(10,40); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("F = ");
display.print(thermocouple.readFahrenheit());/*Fahrenheit*/
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 ");
/*sensorValue < 90 ellenorzeshez, amugy igas valtozo kell ami a digitalis pin*/
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
if(a) {display.drawRoundRect(80, 47, 40, 15, 2, WHITE);} /*negyzet a gas felirat kore feher*/
else {display.drawRoundRect(80, 47, 40, 15, 2, BLACK);} /*negyzet a gas felirat kore fekete*/
a^=1;
}
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}

void homeroVanRajta() {
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(10,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("C = ");
display.print(thermocouple.readCelsius());/*Celsius*/
display.setTextSize(2); /*text size 2*/
display.setCursor(10,40); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("F = ");
display.print(thermocouple.readFahrenheit());/*Fahrenheit*/
display.display(); /*to shows or update your TEXT*/
}

void gazVanRajta() {
int sensorValue = analogRead(A0); /*valtozo a gaz erzekelo alalog pin -nek*/
int isgas = digitalRead(2); /*valtozo a gaz erzekelo digitalis pin -nek, ez arra kell, ha gas van akkor jelet ad, nem kell kulon erteket adni*/
String gas; /*valtozo a gaz erzekelo gas vagy no gas kiirasahoz*/
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(0,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("CO2= ");
display.print(sensorValue);
display.setTextSize(1);
display.print(" PPM");
/*sensorValue < 90 ellenorzeshez, amugy igas valtozo kell ami a digitalis pin*/
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
if(a) {display.drawRoundRect(30, 39, 60, 22, 2, WHITE);} /*negyzet a gas felirat kore feher*/
else {display.drawRoundRect(30, 39, 60, 22, 2, BLACK);} /*negyzet a gas felirat kore fekete*/
a^=1;
}
display.setTextSize(2);
display.setCursor(20,42);
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}

void megnyomva() {
if (gombNyomas == 1) {
mindenRajtaVan();
gombNyomas++;
} else if (gombNyomas == 2) {
homeroVanRajta();
gombNyomas++;
} else if (gombNyomas == 3) {
gazVanRajta();
gombNyomas = 1;
}
}

void setup() {
Serial.begin(9600); /*elindítja a sorosportot, 9600 baud beállítással. Ez azért jó, mert a Serial Monitoron a program futását tudod monitorozni*/

pinMode(gombPin, INPUT); /*inicializálja a gomb pin -jet inputnak*/

Serial.println("MAX6675 test");
/*wait for MAX chip to stabilize*/
delay(500);
/*SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally*/
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); /*Address 0x3C for 128x32*/

display.display();
delay(2000);


}

void loop() {

/*For the MAX6675 to update, you must delay AT LEAST 250ms between reads!*/
delay(500);

/*read the state of the pushbutton value:*/
gombAllapot = digitalRead(gombPin);

/*check if the pushbutton is pressed. If it is, the buttonState is HIGH:*/
if (gombAllapot == HIGH) {
megnyomva();
}

Serial.println(gombNyomas);



}

Egyenlőre feladtam, kiszellőztetem a fejem.

(#20017) Aryes válasza lanszelot (#20016) üzenetére


Aryes
nagyúr

A programmal lesz gond, nem a kapcsolóval, ez tuti.

A gond az, hogy nemigen fogadod meg, amit az itteniek sok év tapasztalattal állítanak.
Valamint olyan dolgokra kérdezel rá, amit egyébként 2 perc guglizással egyedül is ki tudnál deríteni (pl felhúzó ellenállás, prell). (Az angol nyelvű leírások, fórumok tudtommal nem jelentenek akadályt)

[ Szerkesztve ]

(#20018) ReFleXx válasza Tankblock (#20015) üzenetére


ReFleXx
addikt

nem hiszem h prelleges a gond jelenleg, van a loopjaban egy 500as delay, na ha most pont ez alatt az 500ms alatt klikkel a kapcsolon, akkor azt pont nem fogja észrevenni a kontroller.
most ha a tobbi utasitas a loopban durvan eltulozva is instant lefut a legjobb esetben masodpercenkent 2x nezi meg a button allapotot.

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20019) Aryes válasza ReFleXx (#20018) üzenetére


Aryes
nagyúr

Nem az a baj, hanem, hogy a kapcsoló valószínűleg nem jól van bekötve. Onnantól kár a programban keresni a hibát.

(#20020) lanszelot válasza Aryes (#20017) üzenetére


lanszelot
addikt

Azt nem értem hogy ha sok kis kapcsolásnak érzékeli, akkor miért nem vált 1-et se. Hiába nyomkodom.
Erre írtam hogy nem a kapcsoló lesz a gond.

Pl delay közben nyomom a gombot. Nem tudom hogy pontosan hogy futnak a programok. Így nem tudom nem az okoz e gondot.
De a delay kell a max6675 -nek.

(#20021) Aryes válasza lanszelot (#20020) üzenetére


Aryes
nagyúr

Nyisd meg a két linket amit küldtem.

(#20022) ReFleXx válasza Aryes (#20019) üzenetére


ReFleXx
addikt

mar miert nem lenne baj, szerinted akkor mi tortenik ha az 500as delay alatt kattint a gombbal? ha kiveszi akkor fog prellegni

itt az arduinos debounce tutorial: https://docs.arduino.cc/built-in-examples/digital/Debounce

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20023) Aryes válasza ReFleXx (#20022) üzenetére


Aryes
nagyúr

Természetesen az információ elveszik, de furcsa lenne, ha az összes próbálkozás alatt egyszer sem találta volna el véletlenül azt a pillanatot, amikor éppen olvas a uC. Mert ugye azt írta, hogy nem működik, nem azt, hogy csak néha.

(#20024) bagarol válasza lanszelot (#20020) üzenetére


bagarol
junior tag

Alapvetően egy gombnak gnd-re kell zárnia, ritkán + ra.
A gombAllapot-ot kidobnám - minek?
if(digitalRead(gombPin) == LOW)

(#20025) ReFleXx válasza Aryes (#20023) üzenetére


ReFleXx
addikt

de pont azt mondta, hogy nem mindig mukodik:

"azért vettem ki, mert legtöbbször nem érzékel gombnyomást."

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20026) bagarol válasza bagarol (#20024) üzenetére


bagarol
junior tag

Sőt jobb lenne while (digitalRead(gombPin) == HIGH) {}
             megnyomva();
Persze ha a gomb gnd-re van kötve.

[ Szerkesztve ]

(#20027) Tomika86 válasza lanszelot (#20016) üzenetére


Tomika86
senior tag

A gombnyomás számlálód, ha 3-nál nagyobb mi lesz? Mitől lesz újra 1 mondjuk?
Prell mentesítés csináld meg amit mindenki mond

(#20028) ReFleXx válasza Tomika86 (#20027) üzenetére


ReFleXx
addikt

else if (gombNyomas == 3) {
          gazVanRajta();
          gombNyomas = 1;
        }

nem lehet nagyobb

lanszelot nincs otthon egy multimetered?

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20029) lanszelot válasza ReFleXx (#20028) üzenetére


lanszelot
addikt

van itthon multimeterem

A megosztott progiban van egy nagy hiba, amit már nem javítottam, mert elegem lett és elmentem kicsit sportolni.
A hiba, hogy induláskor nem fut le semmi, csak a serial print
Meg kell nyomni a gombot, hogy legyen valami
Próbáltam a function-t elindítani az elején, de hibát dob /tuti nem úgy kell azért/
Hogy kell egy function-t elindítani, de nem a loop-ban? Mert csak indulásnál kell lefusson.

#20025 pontosan, van amikor működik, teljesen random.
Ezért gondoltam a delay -re
van, hogy 5-ből 1szer működik, de van hogy 2-ből 1szer

ez alapján van a gomb
ugyanez a gomb, ugyanez az ellenállás, ugyanez a bekötés működik digispak -al, ott a videó a #19986 -ban
Ezért gondolom, hogy a program lesz a gond.

Tomika86: azért raktam function-ba, hogy ne legyen 4 az érték

(#20030) Aryes válasza lanszelot (#20029) üzenetére


Aryes
nagyúr

Hogy kell egy function-t elindítani, de nem a loop-ban? Mert csak indulásnál kell lefusson.

A setup()-ba tedd be.

ugyanez a bekötés működik digispak -al, ott a videó a #19986 -ban
Ezért gondolom, hogy a program lesz a gond.

Értsd meg, hogy a Digispark lapon van egy csomó kiegészítő elektronika néhány lábon (1,3,4). Tehát nem ugyanez a bekötés.

Írták az INPUT helyett az INPUT_PULLUP beépített felhúzó ellenállás használatát, valamint a gomb állapota beolvasásánál ne a HIGH legyen a gombnyomás, hanem a LOW (a gomb a +5V helyett a GND-re zárja a pin-t), és nem kell kiegészítő ellenállás (a prell-t ez nem szünteti meg), ezt már megfogadtad?

[ Szerkesztve ]

(#20031) ReFleXx válasza lanszelot (#20029) üzenetére


ReFleXx
addikt

csak hogy tisztazzuk A4 vagy D4 pinre dugod a kapcsolot?

[ Szerkesztve ]

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20032) lanszelot válasza ReFleXx (#20031) üzenetére


lanszelot
addikt

D4 /fáradt vagyok elírtam, bocsánat/

Most már tuti, hogy a delay.
kivettem, és minden gombnyomás tökéletes.

Viszont a hőmérőnek kell a delay.
300 -ra tettem, így kevesebb gombnyomás nem érvényesül

[ Szerkesztve ]

(#20033) ReFleXx válasza lanszelot (#20029) üzenetére


ReFleXx
addikt

itt egy egyszeru kod:

const int buttonPin = 4;
int buttonState = 0;
void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT_PULLUP);
  delay(1000); 
}
void loop() {
  buttonState = digitalRead(buttonPin);
  Serial.print("buttonState: ");
  Serial.println(buttonState);
  delay(50);
}

ha ezt feltoltve a gombot benyomva 0-ra kell veltozzon a buttonState, ha elengeded akkor 1, az ellenallast vedd ki, a kapcsolo legyen a 4-es pin es a GND között.

2020-as dakota közmondás: "Intel a csórók AMD-je"

(#20034) bagarol válasza lanszelot (#20029) üzenetére


bagarol
junior tag

Tanácsért fordulsz a fórumhoz, de nem fogadod meg. :(
Szomorú, hogy a hivatalos arduino oldalon így van a gomb.
A legnagyobb gond, hogy nem frissül a programod csak ha gombot nyomsz.
Tehát egyszer kiírja az adatokat és kész, utána a loopban pörög.
A setup utolsó sora legyen mindenRajtaVan(); így nem üres képernyő fogad.

(#20035) lanszelot válasza bagarol (#20034) üzenetére


lanszelot
addikt

a program a gomb működését nézi
Azt mondtátok vegyek ki mindent, kivettem.
Csak mindig másolgatnom kellett a kódot ezért akartam, hogy lefusson egy function egyszer.
De már megtaláltam a hibát, a delay az.
A hőmérőnek viszont minimum 270-es delay kell, amúgy nem mutat semmit.
ezért raktam 300-ra, így már kevés a nem vett gombnyomás
Amit nem értek nem tudom megcsinálni. Kérdeztelek fentebb, hogy mivel legyen párhuzamosan kötve a kondenzátor. Nem kaptam választ. Így azt nem tudtam kipróbálni.

ReFleXx:
igen, tökéletesen működik a progi
minden gombnyomás megvan.
ellenállás nélkül, és ellenállással is

(#20036) bagarol válasza lanszelot (#20035) üzenetére


bagarol
junior tag

#20014

(#20037) Janos250 válasza lanszelot (#20035) üzenetére


Janos250
őstag

Ne delay-el old meg, hanem egy max6675 olvasás után tárold el a ms értéket, és csak akkor olvass, ha az aktuális ms, és a letárolt közti különbség nagyobb egy megadott értéknél. A gomnyomást meg állapotban tárolhatod, és ha állapot is, ms is jó, akkor alvasol.
Ha egyszer átállsz ESP32-re, akkor ez egyszerűbb lesz.

Az amerikaiak $ milliókért fejlesztettek golyóstollat űrbéli használatra. Az oroszok ceruzát használnak. Én meg arduinot.

(#20038) lanszelot válasza bagarol (#20036) üzenetére


lanszelot
addikt

oh, azt nem vettem észre :B
megcsináltam, egyáltalán nem jó
a képernyő folyamatos loop-ban van, és nem lehet kihozni belőle
hiába a változó értéke

Janos250
ez azért nem jó, mert ha szobahőmérségletről berakom a fagyasztóba, akkor nem lesz 300-as delay és nem fog mérni, újra kell indítani
olyan megoldás kell ahol minimum 270-et minden esetben késleltet a lekérés
az pedig a delay vagy ha berakok egy relét az áramkörbe :DDD

(#20039) Tomika86 válasza lanszelot (#20038) üzenetére


Tomika86
senior tag

Delay tudod mit csinál?
Amíg az ideje letelik, nem fut a program, áll azon a ponton.
Felejsd el a delay-t, maximum setupban használd.

Janos250 amit írt, azzal old meg.
Nem bonyolult egyáltalán, nagyon sok minta van a neten

(#20040) lanszelot válasza Tomika86 (#20039) üzenetére


lanszelot
addikt

Leírtam hogy miért nem lehet úgy megoldani.
Nagy hőkülönbségnél nem azonnal mutatja , hanem kell neki pár masodperc, míg a helyes hőfokot mutatja.
Ekkor nem lesz meg a 270 -es delay.
A hőmérő mérései között minimum 270 ezredmp kell.
Ott van a leírásában.
Tehát minden körülmény között így kell működnie.
Delay nélkül hogy ne kérje le addig a program?
Lehet az is hogy hogy csinálok egy stoppert, és minden 300-al osztható egesz számnál futtatja csak a lekérést.
Ekkor nem áll a program, tehát a gomb fog működni, de eszi a memóriát.
És ez jobb mint amit fent írtak, mert itt tuti nem fog addig lekerni.

(#20041) Aryes válasza Tomika86 (#20039) üzenetére


Aryes
nagyúr

Én inkább kiszállok, meguntam, hogy lyukas hordóba hordom a vizet. :))

(#20042) Tomika86 válasza lanszelot (#20040) üzenetére


Tomika86
senior tag

Mit hogyan?
Elöször pont mérni fog egyet, utána meg 300ms-onként csinál 1 mérést.
Meséld el, hogy mivel másabb a delay? (arról beszélek ami a loopban van).
Belép a loop függvénybe a program és szünetelteti a delay a programfutást, amikor letil tovább megy, lefut minden kiírja az adatokat, megint szünet... Stb
Delay esetén ha a delay közepette van esemény akkor azt nem is látod, pl ha akkor nyomsz gombot.

Setup blokk utolsó 2000ms is sok szerintem.

(#20043) lanszelot válasza Tomika86 (#20042) üzenetére


lanszelot
addikt

Aryes mutatta nekem:
uint32_t lastms= 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
if (millis() - lastms > 1000) {
lastms = millis();
Serial.println(lastms/1000);
}


}

ez az időzítő , ebben lévő másodpercenként fut le
ezen kívül van :
if (gombNyomas == 1) {
mindenRajtaVan();
} else if (gombNyomas == 2) {
homeroVanRajta();
} else if (gombNyomas == 3) {
gazVanRajta();
}

tehát a gombnyomást érzékeli, és a változó értéke megváltozik, viszont 1mp múlva hajtja végre ami az első "if" -ben van

delay, de még sem az, hisz a program nem áll meg

[ Szerkesztve ]

(#20044) Tomika86 válasza lanszelot (#20043) üzenetére


Tomika86
senior tag

De csak a szenzor kiolvasást kell beletenni esetleg egyszerűbb akkor a kiiratást(ami vele együtt van)
A gombnyomásos részt nem

Olvasd el itt is, (blocking function=blokkolja a programfutást) [link]

(#20045) lanszelot válasza Tomika86 (#20044) üzenetére


lanszelot
addikt

A gombnyomás az kívül van. Írtam is a program sor felett közvetlenül.

Link: igen, ezért nem működik a gomb, ezt fentebb írtam, hogy a delay a gond.

(#20046) its_grandpa válasza lanszelot (#20000) üzenetére


its_grandpa
tag

Előrebocsájtom, hogy nem ismerem ezt a Digispark lapot, úgy ötletelek.
A gombnyomások számát a loop-ban figyeljük 10 sec-enként.

A gombnyomás(ok) számolásához kell egy interrupt fv. a pin, meg egy változó.
const byte interruptPin = 2;
volatile int gombNyomas = 0 ; /*valtozo a gomb nyomas szamlalasara*/
void gombotnyom(){
gombNyomas ++;        /* növeljük 1-el a gombnyomások számát */
}

A setup: (zanzásítva)

void setup() {
Serial.begin(9600); /*elindítja a sorosportot ...*/
pinMode(interruptPin, INPUT_PULLUP); /*inicializálja a gomb pin-t inputnak , default HIGH !!! */
attachInterrupt(digitalPinToInterrupt(interruptPin), gombotnyom, LOW); /* meghívjuk az fv.-t ha LOW-ra húzod a pin-t */
/* ami még a setupba kell */
} /* setup_end */

És most jöjjön a loop.
void loop() {
if (millis() - lastms > 10000)    /* eltelt 10 sec ? */
{
lastms = millis();
    if gombNyomas > 0    /* volt valamennyi gombnyomás */
    {
    megnyomva();
    gombNyomas = 0 ;    /* nullázzuk a nyomások számát
    }
} /* gombnyomások számának olvasás időzítése */
Serial.println(gombNyomas);    /* kiírjuk hány gombnyomásnál tartasz */
} /* loop_end */
Jöjjön a megnyomva fv.

void megnyomva() {
    switch (gombNyomas) {
    case 1:
    mindenRajtaVan();
    break;
    case 2:
    homeroVanRajta();
    break;
    case 3:
    gazVanRajta();
    break;
    }
} /* megnyomva_end */

Most látom írtál közben.
A kódomban az interrupt pin a 2-es, neked ott a gázérzékelő van, szóval valamit módosítani kell. Én az arduinóból indultam ki, ott az Uno, Nano, Mini, other 328-based lapokon csak a 2,3 pin használható interruptra.

(#20047) Aryes válasza its_grandpa (#20046) üzenetére


Aryes
nagyúr

Ha kódot illesztesz be, előtte állítsd át a szerkesztőt a "régi szerkesztő"-re, mert akkor olvasható lesz a kód!

(#20048) its_grandpa válasza Aryes (#20047) üzenetére


its_grandpa
tag

roger that

(#20049) Aryes válasza its_grandpa (#20048) üzenetére


Aryes
nagyúr

🫡

(#20050) lanszelot válasza lanszelot (#20043) üzenetére


lanszelot
addikt

Ezzel a módszerrel sikerült.
Ma reggel neki ültem, mert tegnap már nagyonm fáradt voltam.
Minden gombnyomásra vált.
Mindenkinek köszönöm szépen a segítséget :R

#include <MQ135.h> /*gaz erzekelo, de nem kell neki igazabol*/
#include <Adafruit_SSD1306.h> /*oled display*/
#include <splash.h> /*oled display -nek kell*/
#include <max6675.h> /*homero*/

int thermoDO = 10; /*valtozo a homero DO pin -nek*/
int thermoCS = 9; /*valtozo a homero CS pin -nek*/
int thermoCLK = 8; /*valtozo a homero CLK pin -nek*/
int gombNyomas = 1; /*valtozo a gomb nyomas szamlalasara*/
int gombPin = 4; /*valtozo a gomb pin -nek*/
int gombAllapot = 0; /*valtozo a gomb allapot olvasasahoz*/
byte a = 0; /*valtozo a gaz erzekelo negyzet villogashoz*/
int period = 1000; /*ennyi idot var a futtatashoz*/
unsigned long time_now = 0;



MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);


Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);


void mindenRajtaVan() {
int sensorValue = analogRead(A0); /*valtozo a gaz erzekelo alalog pin -nek*/
int isgas = digitalRead(2); /*valtozo a gaz erzekelo digitalis pin -nek, ez arra kell, ha gas van akkor jelet ad, nem kell kulon erteket adni*/
String gas; /*valtozo a gaz erzekelo gas vagy no gas kiirasahoz*/
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(10,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("C = ");
display.print(thermocouple.readCelsius());/*Celsius*/
display.setTextSize(1); /*text size 2*/
display.setCursor(10,40); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("F = ");
display.print(thermocouple.readFahrenheit());/*Fahrenheit*/
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 ");
/*sensorValue < 90 ellenorzeshez, amugy igas valtozo kell ami a digitalis pin*/
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
if(a) {display.drawRoundRect(80, 47, 40, 15, 2, WHITE);} /*negyzet a gas felirat kore feher*/
else {display.drawRoundRect(80, 47, 40, 15, 2, BLACK);} /*negyzet a gas felirat kore fekete*/
a^=1;
}
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}

void homeroVanRajta() {
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(10,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("C = ");
display.print(thermocouple.readCelsius());/*Celsius*/
display.setTextSize(2); /*text size 2*/
display.setCursor(10,40); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("F = ");
display.print(thermocouple.readFahrenheit());/*Fahrenheit*/
display.display(); /*to shows or update your TEXT*/
}

void gazVanRajta() {
int sensorValue = analogRead(A0); /*valtozo a gaz erzekelo alalog pin -nek*/
int isgas = digitalRead(2); /*valtozo a gaz erzekelo digitalis pin -nek, ez arra kell, ha gas van akkor jelet ad, nem kell kulon erteket adni*/
String gas; /*valtozo a gaz erzekelo gas vagy no gas kiirasahoz*/
display.clearDisplay(); /*this line to clear previous logo*/
display.setTextSize(1); /*text size 3*/
display.setCursor(3,0); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("Thermometer by Gabor");
display.setTextSize(2); /*text size 2*/
display.setCursor(0,20); /*ez tartja egy helyben a szöveget*/
display.setTextColor(WHITE); /*without this no display*/
display.print("CO2= ");
display.print(sensorValue);
display.setTextSize(1);
display.print(" PPM");
/*sensorValue < 90 ellenorzeshez, amugy igas valtozo kell ami a digitalis pin*/
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
if(a) {display.drawRoundRect(30, 39, 60, 22, 2, WHITE);} /*negyzet a gas felirat kore feher*/
else {display.drawRoundRect(30, 39, 60, 22, 2, BLACK);} /*negyzet a gas felirat kore fekete*/
a^=1;
}
display.setTextSize(2);
display.setCursor(20,42);
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}

void megnyomva() {
if (gombNyomas == 1) {
gombNyomas++;
} else if (gombNyomas == 2) {
gombNyomas++;
} else if (gombNyomas == 3) {
gombNyomas = 1;
}
}


void setup() {
Serial.begin(9600); /*elindítja a sorosportot, 9600 baud beállítással. Ez azért jó, mert a Serial Monitoron a program futását tudod monitorozni*/

pinMode(gombPin, INPUT); /*inicializálja a gomb pin -jet inputnak*/

Serial.println("MAX6675 test");
/*wait for MAX chip to stabilize*/
delay(500);
/*SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally*/
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); /*Address 0x3C for 128x32*/

display.display();
delay(2000);


}

void loop() {

/*For the MAX6675 to update, you must delay AT LEAST 250ms between reads!*/
//delay(300);

/*read the state of the pushbutton value:*/
gombAllapot = digitalRead(gombPin);

/*check if the pushbutton is pressed. If it is, the buttonState is HIGH:*/
if (gombAllapot == HIGH) {
megnyomva();
}

//time_now = millis();

if(millis() >= time_now + period){
time_now += period;

if (gombNyomas == 1) {
mindenRajtaVan();
} else if (gombNyomas == 2) {
homeroVanRajta();
} else if (gombNyomas == 3) {
gazVanRajta();
}

}

Serial.println(gombNyomas);



}

Copyright © 2000-2024 PROHARDVER Informatikai Kft.