- iPhone topik
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Google Pixel topik
- Profi EKG-s óra lett a Watch Fitből
- Magyarított Android alkalmazások
- Mobil flották
- One mobilszolgáltatások
- Magisk
- Samsung Galaxy Watch5 Pro - kerek, de nem tekerek
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
-
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
-
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...
-
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();
...
}
-
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.
-
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. -
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.
-
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... -
bagarol
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. -
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. -
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. -
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. -
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();
} -
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. -
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).
-
bagarol
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
; -
válasz
its_grandpa #20078 üzenetére
Jó észrevétel. Megoldás?
-
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)
-
bagarol
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. -
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.
-
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.
-
-
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
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();
}
} -
bagarol
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.
-
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();
}
} -
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. -
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;
}
} -
lanszelot
addikt
-
-
lanszelot
addikt
-
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 -
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.
-
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 -
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
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/
-
lanszelot
addikt
válasz
lanszelot #20043 üzenetére
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#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);
} -
válasz
its_grandpa #20048 üzenetére
🫡
-
válasz
its_grandpa #20046 üzenetére
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!
-
its_grandpa
tag
válasz
lanszelot #20000 üzenetére
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. -
lanszelot
addikt
válasz
Tomika86 #20042 üzenetére
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
-
Tomika86
senior tag
válasz
lanszelot #20040 üzenetére
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.
-
lanszelot
addikt
válasz
Tomika86 #20039 üzenetére
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. -
lanszelot
addikt
válasz
bagarol #20036 üzenetére
oh, azt nem vettem észre
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ékeJanos250
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 -
Janos250
őstag
válasz
lanszelot #20035 üzenetére
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. -
lanszelot
addikt
válasz
bagarol #20034 üzenetére
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 -
bagarol
tag
válasz
lanszelot #20029 üzenetére
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 legyenmindenRajtaVan()
; így nem üres képernyő fogad. -
ReFleXx
addikt
válasz
lanszelot #20029 üzenetére
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.
-
válasz
lanszelot #20029 üzenetére
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?
-
lanszelot
addikt
válasz
ReFleXx #20028 üzenetére
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 1szerez 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
-
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
-
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. -
ReFleXx
addikt
válasz
Tankblock #20015 üzenetére
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. -
válasz
lanszelot #20016 üzenetére
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) -
lanszelot
addikt
válasz
lanszelot #20003 üzenetére
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.
-
Tankblock
aktív tag
válasz
lanszelot #20013 üzenetére
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....
-
ReFleXx
addikt
válasz
lanszelot #20009 üzenetére
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. -
Tankblock
aktív tag
-
lanszelot
addikt
válasz
bagarol #20007 üzenetére
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ékkelNem így kell?
ReFleXx - sajnos ezt nem értem, kezdő vagyok nagyon
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 10kvalami 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 -
ReFleXx
addikt
válasz
lanszelot #20005 üzenetére
normalis , mert akkor lebeg a pin5, ha bekotod akkor az ellenallassal lehuzod GNDre.
igy a kep alapjan jonak tunik a bekotes, eloszor elforgatva neztem
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 -
lanszelot
addikt
válasz
ReFleXx #20004 üzenetére
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=0xeehibá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?
-
Új hozzászólás Aktív témák
Hirdetés
- GOPRO Hero 11 BLACK - 5.3k akciókamera - 2 akku, tartozékok (5.)
- DJI AVATA 2 Fly More Combo 1 akku - drón szett DJI Goggles N3 FPV szemüveggel
- Sony PlayStation 5 ( PS5 ) Sony PlayStation VR2 Csomag
- Dell Precision 7680 Eco FHD+ 13600HX 14C / 16G D5 / 1T G4 workstation
- Gigabyte GA-Z68A-D3-B3 LGA 1155 alaplap
- BESZÁMÍTÁS! MSI B550M R7 3700X 16GB DDR4 512GB SSD RTX 3060Ti 8GB NZXT H5 Flow RGB 650W
- Napi 1000 -ft tól elvihető RÉSZLETFIZETÉS BANKMENTES MSI Cyborg 15 A13VE
- Csere-Beszámítás! MSI Gaming X RTX 4060Ti 16GB GDRR6 Videokártya!
- Frederick Forsythe: Isten ökle (nem olvasott)
- Kingmax 1x2GB DDR3-1333 RAM
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged