- Microsoft Excel topic
- Gyorsabban hozná el az önvezetést Kína
- Zyxel NAS326
- Kanada feltalálta a Netflix-adót
- Megpróbálják a spanyolok: megvédenék a gyerekeket a közösségi médiától
- Otthoni hálózat és internet megosztás
- SkyShowtime
- Musk átirányította a Teslának szánt AI-chipeket
- DIGI kábel TV
- Windows 10
-
IT café
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
-
lanszelot
addikt
válasz its_grandpa #20046 üzenetére
Köszönöm szépen.
Meg fogom próbálni ezzel is.
De ez nekem még nehezen érthető.
Át kell rágnom magam rajta.
Ha sikerül, megírom, hogy működik e.pinmode és a attachInterrupt - ezeket nem értem.
pinmode:pinMode(gombPin, INPUT);
ezt töröljem ki? de akkor hova megy a high?
attachInterrupt:
"meghívjuk az fv.-t" - mi az az fv? /function?//másik már nem volt szerkeszthető mire átolvastam, ezért van külön íva/
[ Szerkesztve ]
-
its_grandpa
tag
válasz lanszelot #20051 üzenetére
pinMode(interruptPin, INPUT_PULLUP); /*inicializálja a gomb pin-t inputnak , default HIGH !!! */
A 2-es pint inputra használod és default HIGH a státusza.attachInterrupt(digitalPinToInterrupt(interruptPin), gombotnyom, LOW); /* meghívjuk az fv.-t ha LOW-ra húzod a pin-t */
A gombotnyom függvényt meghívjuk, ha a 2-es pin LOW lesz.A #20050-ben írt kódod nem tűnik 100-asnak még, a megnyomva()-ban az
else if (gombNyomas == 3) {
gombNyomas = 1;
}
A loop-ban emiatt a
mindenRajtaVan()
szerintem minden periódusban le fog futni. -
lanszelot
addikt
válasz its_grandpa #20046 üzenetére
Beírtam a kódot, és nem működik.
Mivel sok hiba volt benne, és azokat javítottam, valószínű valamit nem jól csináltam.
Arra viszont még nem jöttem rá mit.kód jelenleg:
#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 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;
const int ledPin = 6; /*LED pin*/
const byte interruptPin = 4;
volatile int gombNyomas = 0 ; /*valtozo a gomb nyomas szamlalasara*/
uint32_t lastms= 0;
void gombotnyom(){
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
}
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*/
digitalWrite(ledPin, HIGH);} /*LED bekapcsol*/
else {display.drawRoundRect(80, 47, 40, 15, 2, BLACK); /*negyzet a gas felirat kore fekete*/
digitalWrite(ledPin, LOW);} /*LED kikapcsol*/
a^=1;
}
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}
void homeroVanRajta() {
digitalWrite(ledPin, LOW); /*LED kikapcsol*/
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*/
digitalWrite(ledPin, HIGH);} /*LED bekapcsol*/
else {display.drawRoundRect(30, 39, 60, 22, 2, BLACK); /*negyzet a gas felirat kore fekete*/
digitalWrite(ledPin, LOW);} /*LED kikapcsol*/
a^=1;
}
display.setTextSize(2);
display.setCursor(20,42);
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}
void megnyomva() {
switch (gombNyomas) {
case 1:
mindenRajtaVan();
break;
case 2:
homeroVanRajta();
break;
case 3:
gazVanRajta();
break;
}
} /* megnyomva_end */
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(ledPin, OUTPUT); /*inicializálja a LED pin -jet outputnak*/
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 */
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() {
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.*/
}
}egy hibát már meg is találtam:
volatile int gombNyomas = 1 ;
1-nek kell lenni, mert semmi se fut le induláskor.
Most már mutatja a kijelző, de azonnal kifagy[ Szerkesztve ]
-
lanszelot
addikt
válasz lanszelot #20053 üzenetére
Meg van még egy hiba:
ez a program sehogy se műköik.
A loop-ban nincs ami frissítse az adatokat,
tehát nem történik semmi, ezért van a képernyő kifagyva.
A gomb pin-tt valószínű rosszul raktam be a programba, így gombnyomásra se történik semmi.const byte interruptPin = 4;
D4 -esen van a gomb, és az eredeti//int gombPin = 4;
kiszedtem.
Nem tudom hogyan kell helyesen.Valahogy frissíteni kell a képernyőt, és a gombot rendesen bevinni.
Azután lehet működneMost látom, hogy sose futhat rá a switch 2 -es vagy 3-as pontjára, hisz 1 után minden esetben nullázza.
[ Szerkesztve ]
-
lanszelot
addikt
válasz lanszelot #20054 üzenetére
frissítés:
void loop() {
if (millis() - lastms > 1000) /* eltelt 10 sec ? */
{
lastms = millis();
if (gombNyomas > 3) /* 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 */
} else {
megnyomva();
Serial.println(gombNyomas); /* kiírjuk hány gombnyomásnál tartasz */
}/* loop_end */
/*Jöjjön a megnyomva fv.*/
}
}már csak a gomb nem működik
atraktam 3-asra, mert 4 -es nem Interrupt pin, de így se működik a gomb[ Szerkesztve ]
-
lanszelot
addikt
-
nagyúr
válasz lanszelot #20057 üzenetére
Cseréld a gombotnyom függvényt erre:
void gombotnyom(){
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
if (gombNyomas >3) gombNyomas = 1;
}Ezzel jó lesz.
Valószínűleg egyszerűen túlcsordul a gombNyomas változó, mert sehol nincs figyelve, csak növelve.[ Szerkesztve ]
-
lanszelot
addikt
#20055
ott nullázza, bár nem értem miért nulla
- már egy gombnyomásra is kifagy, úy hogy csordul túl?beraktam azt az extrát, bár már nem fagy ki, de össze vissza váltogat, illetve hiába nyomkodom sokszor nem történik semmi.
1
1
1
2
2
2
3
3
3
3
3
3
3
3
2
2
2
2
2
2
1
1
1
1
1
1
2
2
2
2
2
2
2
2[ Szerkesztve ]
-
nagyúr
válasz lanszelot #20061 üzenetére
Így?
A kondi szerintem kevés lesz oda. [link]
30-80ms közt érdemes beállítani a debounce idejét.De szoftverből sokkal jobb ezt (is) csinálni.
volatile uint32_t debounce= 0;
void gombotnyom(){
if (millis() - debounce < 80){ /* eltelt 80 msec ? */
debounce = millis();
}else{
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
if (gombNyomas >3) gombNyomas = 1;
}
}[ Szerkesztve ]
-
lanszelot
addikt
Huh, ez nekem magas. Nagyon kezdő vagyok még ehhez.
Az ellenállás nélkül, de úgy raktam be.
Tegnap azt írta vki vegyem ki az ellenállást, és 1-10 nano -s kondenzátort rakjak be. Azért úgy csináltam.Amit írtál azt nem értem. A kalkulátort se tudom hogy használjam.
Az addig ok, hogy berakok egy kondenzátort .
Ezt a debounce-t egyáltalán nem értem.80ms kevés a hőmérőnek. Minimum 270ms kell.
Nem tudom hol allitom az interrupt idejét. -
-
nagyúr
válasz lanszelot #20064 üzenetére
Az ellenállás nélkül, de úgy raktam be
Tehát nem úgy.
Tudom, hogy sok információ, de:
1. A prellmentesítést/debouncing-ot nem hardveresen szokás megoldani, mivel szoftverből jól kezelhető a probléma.
2. Ha mégis hardverből szeretnéd, akkor az ellenállás és a kondenzátor értéke együtt fogja neked kiadni a debounce idejét. A beépített ellenállás 30kΩ-50kΩ közti random érték, amivel nem igazán lehet számolni
3. Ha szoftverből csinálod, nem kell külső felhúzó ellenállás, a beépített pont elég, hogy a lebegést megszüntesse, hiszen erre kell az ellenállás.
4. Felejtsd el a kalkulátort, csináld szoftverből, hiszen ez a bevett, kipróbált módszer.
5. A 80ms debounce és a 270ms mérési késleltetés egymástól teljesen független. Ha a fenti kódot beteszed a programba, észre fogod venni, hogy egyik nem befolyásolja a másikat. A működése egyébként az, hogy amikor prellez a gomb érintkezője, az utolsó alacsony szint után vár 80ms-ot, és csak utána reagál. Ha 80ms előtt új impulzus érkezik, akkor nem reagál rá.szerk.: Most jöttem rá, hogy rossz a kód, ez interrupt esetén nem fog működni... Ez lesz a jó:
void gombotnyom(){
if (millis() - debounce > 80){ /* eltelt 80 msec ? */
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
if (gombNyomas >3) gombNyomas = 1;
debounce = millis();
}
}[ Szerkesztve ]
-
bagarol
junior tag
válasz lanszelot #20064 üzenetére
Na akkor utoljára
void loop() {
if (millis() - lastms > 500)
{
lastms = millis();
if (gombNyomas) /* volt valamennyi gombnyomás */
{
gombNyomas++;
gombNyomas = gombNyomas%3 ;
Serial.println(gombNyomas); /* kiírjuk hány gombnyomásnál tartasz */
}
megnyomva();
}
}Írd át a megnyomva() -ban is 0,1,2 az 1,2,3 helyett.
[ Szerkesztve ]
-
bagarol
junior tag
byte gomb = 0;
void gombotnyom(){
gomb++; /* növeljük 1-el a gombnyomások számát */
}void loop() {
if (millis() - lastms > 500)
{
lastms = millis();
if (gomb) /* volt valamennyi gombnyomás */
{
gomb = 0;
gombNyomas++;
gombNyomas = gombNyomas%3 ;
Serial.println(gombNyomas); /* kiírjuk hány gombnyomásnál tartasz */
}
megnyomva();
}
}[ Szerkesztve ]
-
lanszelot
addikt
válasz bagarol #20070 üzenetére
Úgy néz ki így már működik
#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*/
volatile uint32_t debounce= 0;
byte gomb = 0;
byte a = 0; /*valtozo a gaz erzekelo negyzet villogashoz*/
const int ledPin = 6; /*LED pin*/
const byte interruptPin = 3;
volatile int gombNyomas = 0 ; /*valtozo a gomb nyomas szamlalasara*/
uint32_t lastms= 0;
void gombotnyom(){
gomb++; /* növeljük 1-el a gombnyomások számát */
if (millis() - debounce > 80){ /* eltelt 80 msec ? */
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
if (gombNyomas >3) gombNyomas = 1;
debounce = millis();
}
}
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*/
digitalWrite(ledPin, HIGH);} /*LED bekapcsol*/
else {display.drawRoundRect(80, 47, 40, 15, 2, BLACK); /*negyzet a gas felirat kore fekete*/
digitalWrite(ledPin, LOW);} /*LED kikapcsol*/
a^=1;
}
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}
void homeroVanRajta() {
digitalWrite(ledPin, LOW); /*LED kikapcsol*/
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*/
digitalWrite(ledPin, HIGH);} /*LED bekapcsol*/
else {display.drawRoundRect(30, 39, 60, 22, 2, BLACK); /*negyzet a gas felirat kore fekete*/
digitalWrite(ledPin, LOW);} /*LED kikapcsol*/
a^=1;
}
display.setTextSize(2);
display.setCursor(20,42);
display.print(gas);
display.display(); /*to shows or update your TEXT*/
}
void megnyomva() {
switch (gombNyomas) {
case 0:
mindenRajtaVan();
break;
case 1:
homeroVanRajta();
break;
case 2:
gazVanRajta();
break;
}
} /* megnyomva_end */
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(ledPin, OUTPUT); /*inicializálja a LED pin -jet outputnak*/
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 */
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() {
if (millis() - lastms > 500)
{
lastms = millis();
if (gomb) /* volt valamennyi gombnyomás */
{
gomb = 0;
gombNyomas = gombNyomas%3 ;
Serial.println(gombNyomas); /* kiírjuk hány gombnyomásnál tartasz */
}
megnyomva();
}
}- A loop -ból kivettem a gombNyomas++ , mert a gombotnyom functionban is hozzá van adva meg ott is, akkor 2-t ad mindig hozzá.
- Illetve, ha jól értettem nem kell a kondenzátor, ezért így kötöttem be a gombotNagyon szépen köszönöm a segítséget mindenkinek
Lesz mit még agyalnom rajta, hogy teljesen megértsem mi hogyan
kérdés:
gáz érzékelőnek miért kell hogy benne legyen a function-ba a 3 változója?
Ha kiteszem a többi változóhoz a gáz érzékelő nem működik. -
bagarol
junior tag
-
its_grandpa
tag
Örömmel látom az általam indított elmevihart, tényleg.
Pár apró megjegyzés.Azért írtam interruptban a gombotnyom() fv.-t, hogy akkor is számoljon ha a program éppen valamelyik ...VanRajta fv.-t hajtja végre.
Nem gondolom, hogy a számolásnak a loop-ban van a helye.
+ Nem szívesen írok interruptban fv.-ben if-et ami az én dilim, tudom :)És igen, túlcsordulhat, tudtam előre de ilyen időzítéssel nem fogja átlépni a 32.767-et (lehetne unsigned int is).
Miért kell szerintetek két változó a nyomások számolására ??? byte gomb = 0; és volatile int gombNyomas = 0 ;
A switch (gombNyomas)-t ki lehet/kell egészíteni, hogy nullázza a nyomások számát:default:
gombNyomas = 0 ;
break;
#20071
>>gáz érzékelőnek miért kell hogy benne legyen a function-ba a 3 változója?
Nem értem a kérdést, ha érteném talán tudnék válaszolni.A debounce-ingról. Tudom, nem olcsó de ahol fontos, hogy ne legyen prell érdemes beáldozni kis pénzt egy HTTM Capacitive Touch Switch-re, Alin 400 HUF, van jópár ilyenem, szép és jól működik.
-
nagyúr
válasz its_grandpa #20075 üzenetére
Nem szívesen írok interruptban fv.-ben if-et
Igazad van, lehetne anélkül is, gondoltam rá, így viszont hordozható lesz a kód, később más projektben fel tudja használni. Ha ketté lenne szedve (a debounce a loop-ban lenne) akkor később nehéz szétválogatni, na meg megérteni is.
Miért kell szerintetek két változó a nyomások számolására
Nem kell, illetve nem így, de már nem akartam bántani. Azon az állásponton vagyok, hogy ami működik, azt nem szabad megjavítani.
de ahol fontos, hogy ne legyen prell ...
Biztos van rá száz megoldás, de inkább tanulja meg egyszer és ne használja, mint később szüksége legyen rá és ne tudja mi a megoldás. Kellett már nekem pergésmentesíteni optikai encodert is, mert nagyon lassú fordulatszámon hülyeséget számolt a lassan változó jel miatt.
-
bagarol
junior tag
válasz its_grandpa #20075 üzenetére
Kellemes húsvéti ünnepeket!
Megszakításba a lehető legkevesebb utasítást kell írni, mivel megszakítja a
program futását, illetve másik megszakítás esetleg csak később tud érvényesülni.
Ok,prioritás.[ Szerkesztve ]
-
its_grandpa
tag
válasz bagarol #20077 üzenetére
Kellemest neked is.
>> Megszakításba a lehető legkevesebb utasítást kell írni..
Ez volt az én interrupt kódomban, ennél kevesebb utasítást nem igazán tudok elképzelni.void gombotnyom(){
gombNyomas ++; /* növeljük 1-el a gombnyomások számát */
}
Aryes
>>Nem kell, illetve nem így, de már nem akartam bántani.
Ebből lesz a spagetti kód ?FYI, ha valakinek nincs meg.
A millis() ~ 50 naponként túlcsordul, ezzel a feltétel vizsgálattal gond lehet:if (millis() - lastms > 500)
-
nagyúr
válasz its_grandpa #20078 üzenetére
Jó észrevétel. Megoldás?
-
bagarol
junior tag
válasz its_grandpa #20078 üzenetére
Erre írtam, ha prellezik a gomb, akár kettőt is ugorhat, nem a következő képernyőt adja.
millis() % 1000 >= 500
; -
ekkold
Topikgazda
Pergésmentesítésre sokféle megoldás van.
- Hardveres megoldás: külső felhúzó ellenállás a gombon, majd RC szűrő
- Megszakításból: állapotváltásra le kell tiltani a további megszakítást kb. 1...2msec-re, amíg a prellezés lezajlik.
- 0.1...1ms-os timer megszakításból: azt kell figyelni, hogy a gomb állapota néhány megszakításon át változatlan-e, ha igen akkor van vége a prellezésnek, és felhasználható az új állapot.
- loop()-ban: az állapotváltás időpontját menteni kell (millis() vagy micros() függvény), ha az utolsó változás óta eltelt több mint 1...2msec, akkor már nem prelleg, felhasználható az aktuális állapot.Én a legutóbbit haszánlom leggyakrabban, mert ehhez nem kell megszakítás, és ha a loop() nem katasztrofálisan lassú akkor stabil és jó megoldás. (még enkóder is kezelhető így, gyakorlatilag hibamentesen). Arra pedig mindíg érdemes törekedni, hogy a loop a lehető leggyorsabb legyen, (azaz pl. amennyire csak lehet kerüljük a delay()-t, és az egyéb lassú függvényeket).
Eladó: https://www.hobbielektronika.hu/apro/apro_159350.html
-
lanszelot
addikt
válasz its_grandpa #20075 üzenetére
#20071 ben ott van a teljes kód felette.
Minden változót 1 helyen hozok létre, kivéve 3-at.
Ebből:
sensorValue, isgas , ha ezeket kiteszem a function-ból a többi változóhoz, akkor a gáz érzékelő nem működik.
Scope miért nem éri el a function -on kívül?
Mert gondolom ezért nem működik. -
its_grandpa
tag
Több lehetőséget is látok.
Amikor hónap elsején felírjuk a villany,gáz és vízóra állást, megbootoljuk az eszköztVagy ....
A loop-ban ellenőrizzük, hogy az aktuális millis() kisebb-e a last-nál, mert akkor átfordult.
if ( millis() < lastms ) /* de lehet lastms+n ,ahol az n tapasztalati érték, a loop futásidejétől függ */
{
lastms = millis();
} -
its_grandpa
tag
válasz lanszelot #20084 üzenetére
OK, continuing education.
Első sorban tüntesd el a kódból azokat amiket én "magic number"-nek nevezek.
Nem írunk ilyeneket mert ha változik a környezet, nehéz a módosítás, nem fogod tudni szörcs end riplész-elni.
analogRead(A0) és digitalRead(2).Legyen két publikus változó:
int Gas_sensor = A0; /* analogRead(Gas_sensor); */
int Gas_pin = 2; /* digitalRead(Gas_pin) */A ..vanRajta fv.-kből a teljesen azonos display sorokat kirakod egy void disp_first() fv.-be. Jobban követhető lesz az eltérő adat(ok) kiírása.
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); /* Ebből miért kell 3,4 a kódba ???? */>>sensorValue, isgas , ha ezeket kiteszem a function-ból a többi változóhoz ....
Ezt nehezen tudom elképzelni, látnom kéne a "hibás" kódot. -
ekkold
Topikgazda
válasz its_grandpa #20089 üzenetére
Szerintem az elsőre jobb megoldás a #define használata, mert nem foglal plusz memóriát (a változóval ellentétben)
#define Gas_sensor A0
#define Gas_pin 2
....
....
analogRead(Gas_sensor);
....
....
digitalRead(Gas_pin);
....
....
Nekem sok programom eleve egy csomó #define-al kezdődik, ha pedig nagyon sok akkor kirakom mondjuk egy hwconfig.h fájlba.[ Szerkesztve ]
Eladó: https://www.hobbielektronika.hu/apro/apro_159350.html
-
lanszelot
addikt
válasz its_grandpa #20089 üzenetére
kiteszem functionból a 2 változót:
#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*/
volatile uint32_t debounce= 0;
byte gomb = 0;
byte a = 0; /*valtozo a gaz erzekelo negyzet villogashoz*/
const int ledPin = 6; /*LED pin*/
const byte interruptPin = 3;
volatile int gombNyomas = 0 ; /*valtozo a gomb nyomas szamlalasara*/
uint32_t lastms= 0;
int sensorValue = analogRead(A0);
int isgas = digitalRead(2);így nem működik a gáz érzékelő, csak ha a functionba van az a 2 változó
Már annyi minden lett írva, hogy teljesen be vagyok kavarodva.
Kezdő vagyok, és ennyire még nem tudom követni fejben a kód módosításokat.
"tüntesd el a kódból azokat amiket én "magic number"-nek nevezek"
-nem tudom itt mit kell tennem"azonos display sorokat kirakod egy void disp_first() fv.-be"
valójában csak ennyi az azonos: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");minden más változik
Gondoltam én is rá, de nem akartam már bele keveredni
így is nehéz megértenem mi mit csinálekkold: erről a *.h file-ról mesélhetnél, hogy hogy működik, mert próbálok rájönni, amikor be include -olok a library -ból valamit, hogy akkor mi is történik.
mert sosem tudom, hogy mik a lehetőségek, csak követem a sablont.[ Szerkesztve ]
-
bagarol
junior tag
válasz its_grandpa #20088 üzenetére
Én is gondolkodtam, de plusz vizsgálat nélkül nincs ötletem.
Végül arra jutottam, hogy delay() .
Az sem ördögtől való, és végül is mit csinál a program:
500 msecig pörög a loopban, majd mér,kiír, és újabb 500 msec helybenjárás.
Nem mindegy, hogy a loopban vagy a delay()-ben pörög?
Saját progiban delayt használnék. -
Ton-ton
tag
válasz lanszelot #20092 üzenetére
Szia
Bár nem tőlem kérdezted...Alapvetően tekintsd úgy az includ-ot, mintha ott lenne a programodban. Tehát mintha oda pötyögted volna be. Azonban fizikailag egy külön fájlban van.
Ez több előnnyel jár.
Egyrészt a már működő (tesztelt) kódod nem zavar, tudsz a lényegesebb (épp aktuális) feladatokkal foglalkozni.
Másrészt a már megírt kódod (függvényeid) könnyedén felhasználhatod másik programban is.Egyetlen javaslat van.
A #include<akarmi.h> a library könyvtárban keresi a fájlt, míg a
#include"akarmi.h" a program mellett. (Persze almappában is lehet...http://qtp.hu
-
nagyúr
válasz lanszelot #20092 üzenetére
Na ezért mondtam, hogy kíváncsi lennék, hogy hogy tetted ki a változó definíciót, mert a nyakamat tettem volna rá, hogy az egész sort értékadással együtt átraktad, de persze az ember látatlanban találja ki egy felületesen megfogalmazott félmondatból...
Ez a definíció, ezt ki tudod tenni a program elejére:
int sensorValue;
int isgas;Ez pedig az értékadás:
sensorValue = analogRead(A0);
isgas = digitalRead(2);ezt értelemszerűen nem tudod kívülre tenni, egyrészt mert ott le sem fut, másrészt meg mert nincs is értelme, mert a függvény szerves részét képezi.
[ Szerkesztve ]
-
lanszelot
addikt
Nem értem, azért kérdezem.
Mivel nem értem nem tudom mit kérdeztek ti.De ez is egy értékadás:
const int ledPin = 6;
Mi a kettő között a különbség?
Ton-ton:
tehát amit a modul mellé letöltök a Library -ból az csak egy program kód részlet
Ezek szerint én is meg tudok írni egy modulhoz egy ilyet a modulhoz?
Mert amiket néztem, azok pár soros program részek a *.h -ban.
Illetve van még ott más kiterjesztés is.Azért kérdem, mert van egy másik hőmérséglet érzékelőm, és ott a példában csak celziusz van, nincs farentheit. Tudom, írjak egy átváltást,és kész, de ha tudja akkor minek. Viszont hogy tudom meg miket tud. Mármint milyen alap parancsok, vagy mik vannak benne, aminek ne íjak extra sorokat.
Remélem érthető amit szerettem volna kérdezni.[ Szerkesztve ]
-
Tomika86
senior tag
válasz lanszelot #20097 üzenetére
Lehetséges, hogy jobb lenne egy kis elméletet is tanulni elöbb, mert itt annyi mindent mondanak, hogy elvesztetted a fonalat.
Vannak tök jó videók is mi miért van úgy, vannak jó könyvek pdf-ek.Tök jó hogy rakosgatod össze itt a programot, de valami alap kellene hozzá,hogy képben legyél.
-
vargalex
félisten
válasz its_grandpa #20088 üzenetére
Én ezt egy projektben így kezeltem:
unsigned long ElapsedTime = millis() - StartTime;
if (ElapsedTime > StartTime) {
ElapsedTime = ULONG_MAX - StartTime + millis();
...
}
Alex
-
nagyúr
válasz lanszelot #20097 üzenetére
Egyszerű. Ha egy kód nem működik és kérdezni szeretnél róla, ahhoz nem elég, ha csak te látod a kódot. Egyrészt mert nem biztos, hogy ott van a hiba, ahol keresed, másrészt az ember nehezebben találja meg a saját maga által elkövetett hibát.
A *.h fájl azért pár soros, mert csak a definíciókat tartalmazza. Az érdemi kód a *.c, *.cpp fájlokban van. Ha szeretnéd tudni, hogy mit tartalmaz egy library, ezeket nyisd meg, fogsz benne látni egy nagy csomó függvényt, aminek remélhetőleg beszédes neve van és elmondja, hogy mit csinál, illetve meg tudod nézni, hogy pontosan milyen paramétereket vár. Ezen túl minden library mellé szoktak tenni example fájlokat, amikből kiderül, hogy hogyan kell ezeket használni, ezekből komplett kódrészleteket lehet némi módosítással átemelni a saját kódodba, illetve én például sokszor eleve ezeket szoktam átírni.
A kollégának amúgy igaza van, ez az Arduino topik, nem a programozás alapjai, szóval érdemes lenne valamilyen tutoriallal folytatni az ismerkedést, illetve használd többet a Google keresőt, mert a legtöbb kérdésedre nagyon jó leírások vannak az interneten... Persze itt mindenki nagyon segítőkész, és sokszor van szó általános programozással kapcsolatos dolgokról is, de na...
[ Szerkesztve ]
Új hozzászólás Aktív témák
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Alpha Laptopszerviz Kft.
Város: Pécs