- gban: Ingyen kellene, de tegnapra
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Argos: Szeretem az ecetfát
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- Elektromos rásegítésű kerékpárok
- sziku69: Szólánc.
- Magga: PLEX: multimédia az egész lakásban
- Szevam: Mennyire tipik Z-gen viselkedés? Tipizálható-e egyáltalán?
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
-
LOGOUT
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
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... -
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. -
-
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();
}
} -
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
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.
-
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
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);
} -
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. -
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.
-
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. -
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?
-
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. -
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 -
válasz
lanszelot #19993 üzenetére
Egy változó állapota alapján döntsd el, hogy mi legyen a kiírás, a gombbal a változó értékét változtasd (a.k.a. "állapotgép"). Hogy aztán a loop-ban if-et, switch-et, vagy függvénypointer-tömböt használsz, az már teljesen egyéni preferencia kérdése. Általában attól függ mit használok, hogy később szeretném-e bővíteni a funkciókat, vagy elég egy quick&dirty megoldás.
-
lanszelot
addikt
válasz
lanszelot #19848 üzenetére
Hello,
Össze raktam a gáz érzékelőt és a hőmérőt.
Jelenleg mind a kettő a kis kijelzőn külön sorban mutatja az értéket.
Gondoltam ha tennék be egy gombot hogy vállthassak a
- ket értek együtt
- csak hőmérő értéke
- csak gáz érzékelő értéke
Között.
Function -ba kell raknom a kijelző megjelenítéseket és gomb nyomásra más más function -t futtassak?
Vagy hogy szokás megoldani? -
ViZion
félisten
válasz
lanszelot #19990 üzenetére
"Meg próbálom az asszonyt rávenni csináljunk új videót, hogy látsd
"
...
"Már nem úgy müködik....hmmm
Ez fura. Pihent kicsit és mindegy hogy dugom, ugyanúgy működik."Hááát, nekem nincs kérdésem.
Aryes miatt van, a hsz-e után már nem tudtam ugyan úgy olvasni, mint előtte...
-
válasz
lanszelot #19988 üzenetére
Meg próbálom az asszonyt rávenni csináljunk új videót
Csak azt a másik PH-ra töltsd fel!
A PB4 okát már írtam, a PB3-at nem tudom megfejteni.
Ha azt írod, hogy ezzel a progival, abból én honnan a fenéből tudjam, hogy ott találom a bekötési rajzot?? Legyél már egyértelműbb.
-
válasz
lanszelot #19986 üzenetére
File -> preferences -> URL -hez lehetséges vlahogy több linket becsatolni?
A pirossal bekarikázott gombra nyomva új sorként tudsz betenni új linket, vagy a szövegmezőbe ;-vel elválasztva, de előbbi átláthatóbb.A hozzászólás második részét próbálom értelmezni, de nem nagyon megy.
A gomb felső részére egy piros vezeték van kötve, aminek nem látom, hogy hová vezet a másik vége, vagyis nem tudom, hogy a gombbal mit kötsz mire.Írtam, hogy a PB3, PB4 lábak kettős funkciót töltenek be, egyrészt tudod őket vezérelni, másrészt az USB csatlakozó D+, D- lábaival vannak összekötve. Ezért gyárilag van egy 1k felhúzó (ha jól emlékszem?) ellenállás és egy Zener dióda a GND irányába, mindkét lábon. Ez azt jelenti, hogy 3,3V feszültség van rajtuk akkor is, ha amúgy nem kéne neki. Ez okozhat nem várt viselkedést, például ha LED-et kötsz rá, az mindkét irányban világítani fog. Szerintem ebben rejlik a válasz a kérdésedre. Hogy az onboard LED miért alszik ki? Szerintem rövidzárlatot csináltál a gombbal.
-
válasz
lanszelot #19981 üzenetére
A gond a pdf-el, hogy hülyeséget ír.
COM portot nem tudsz akkor sem beállítani, ha a fejed tetejére állsz, mert a Digispark nem tartalmaz USB-soros átalakítót, mint az UNO.
A leírás valószínűleg arra gondol, hogy telepítés után az UNO van default beállítva, vagy egy olyan pdf-et alakítottak át, amit eredetileg az UNO mellé küldtek, csak elfelejtették kivenni az ide vonatkozó részt, nem tudom. -
válasz
lanszelot #19972 üzenetére
1. Ahogy a kolléga írta, a bootloader nem feltétele a blink programnak. Bár ha demó program feltöltésére vették a fáradságot, talán az is rendben van.
2. Az is a gyártói leírásban volt, hogy az UNO-t kell kiválasztani a listából (szerinted).Ha a leírás jobban tudja, mint én, akkor ne itt kérdezd, hanem kövesd a leírást.
-
válasz
lanszelot #19962 üzenetére
Nem lesz com port!
Feltöltés előtt ki kell húzni a lapot, és amikor végzett a fordítással, írni fogja, hogy dugd be a cuccot a gépbe, na akkor dugd be újra. Lesz rá 60 másodperced.
Nincs itt semmi hiba.szerk.: csak most láttam, hogy az előzőt még kiegészítetted. A driver telepítés probléma amiatt lehet, amit írtam korábban, tudniillik vagy nincs rajta bootloader, vagy valamiért nem szereti azt az usb portot, amire dugod. Utóbbi esetben próbáld meg egy 2.0-s USB hub-ra dugni, de semmi más ne legyen bele dugva, csak ez. Nekem ez jött be, pár évvel ha visszaolvasol, láthatod mennyit qrvaanyáztam, mire rájöttem, mi a gond
-
válasz
lanszelot #19933 üzenetére
Van 6 darab GPIO, ebből alap esetben a 0-4-ig használhatod, az 5 a reset, amit egy flag segítségével átbillenthetsz normál módon használható GPIO pin-re viszont ezzel megszűnik a program feltöltés lehetősége (nem végleg, egy speciális programozó segítségével ilyenkor is lehet programozni, de 12V kell hozzá, szóval vedd úgy, hogy az 5-ös GPIO nincs
).
Mind az 5 pin alkalmas digitális ki és bemenetnek.
A 2,3,4 pin emellett analóg mérésekre alkalmas (ADC).
A 0,1 PWM jelet tud kiadni, vagyis például ledek analóg meghajtására alkalmasak (a belső timer-rel vannak összeköttetésben, ezen a két lábon van hardveres PWM, a többin csak szoftveres)
A 2 pin külső megszakításokat tud kezelni (INT0), ez például arra jó, hogy felébreszd deep sleep módból. Ezt szokták serial kommunikációra használni, RX lábnak.
PinChangeInt amúgy tudtommal van minden lábon, de az máshogy/kevésbé használható.
MOSI/MISO/SCLK ha jól tévedek az ISP programozáshoz kell, egyéb funkciója nincs.Jut eszembe: ha nem ISP-n keresztül, hanem az USB portba dugva, a rajta lévő bootloader segítségével cserélsz rajta programot, akkor a reset lábat tudod saját célra használni (azt hiszem csak bemenetként használható, kimenet nincs rajta), mert az USB feltöltéshez nincs szükség a reset lábra. Persze ha véletlenül törlődik a bootloader valami okból (ami nem is annyira ritka ennél a megoldásnál), akkor kuka
-
válasz
lanszelot #19927 üzenetére
Hogy jött meg neked az AliExpress-ről két nap alatt?
Digispark telepítése
De ma délután több órányi kínlódás után arra jutottam, hogy érdemesebb lehet az attinycore-t telepíteni: [link]Amennyiben van bootloader a Digispark-on, akkor sem biztos, hogy elsőre fogod tudni csatlakoztatni a gépre usb-n keresztül. Én úgy jártam vele, hogy a laptopra csak úgy tudtam rádugni, ha kihúztam az egeret.
Kellett egy usb hub, akkor működött rendesen. (Ez azért van, mert nincs rajta hardveres usb támogatás, szoftveresen emulálja az usb kommunikációt).
Amennyiben van rajta bootloader, ugyanis én úgy kaptam Kínából az enyémet, hogy nem volt rajta, ISP-n keresztül kellett rá tenni, csak utána lehetett usb-n keresztül programozni. -
válasz
lanszelot #19923 üzenetére
Na, az derék. Azon igazából csak 3 lábat fogsz tudni használni saját célra, ha az USB-t is használni szeretnéd, mert összesen 5 GPIO van, amiből 2-t az USB foglal. Ha nem, akkor tudj róla, hogy azon a két lábon (asszen 4+5) van 1-1 zener dióda, és 1-1 felhúzó ellenállás, ami nem minden esetben, de néha tud váratlan dolgokat művelni.
-
válasz
lanszelot #19918 üzenetére
Amennyiben próbálkozol vele, javaslom, hogy ha nem a Digispark USB-s kütyüt veszed, akkor is annak a library-jét töltsd le, mert tele van Attiny85 specifikus library-vel, amit pucér Attiny85-tel is tudsz majd használni (feltöltéskor figyelj majd, hogy többféle órajel is lesz a listában, és van olyan digi library, ami csak 16,5MHz órajel mellett működik, ami az USB kommunikáció miatt van megemelve, de alapból te majd nem ezt szeretnéd használni).
-
válasz
lanszelot #19916 üzenetére
Újra, persze. Rengeteg dologra használható (pl usb eszközt is lehet vele emulálni!), nekem a kedvencem.
Azért tudj róla, hogy sok mindent nem tud, amit a nagyobb testvérei, és ugyan integrálva van egy ideje az Arduino-ba, de csomó mindenhez vagy nincs library, vagy keresni kell hozzá külön erre megírt library-t.
-
válasz
lanszelot #19913 üzenetére
Jajjaj, itt valami nagy zavar van.
Vagy a szakkörön mondtak hülyeséget, vagy te értettél félre valamit.
IC: azintercityintegrated circuit-> integrált áramkör rövidítése. Minden szilíciumlapra integrált logikai vagy analóg áramkör IC, az 555-ös időzítőtől az Intel processzorig. Az is, ami a képen van, IC, de nem minden IC programozható, csak ami CPU-t valósít meg. Ebből aztán tényleg rengeteg fajta van, a processzor (asztali PC) ami önmagában nem tud működni, kell hozzá ram meg egyéb cuccok, a mikrokontroller, ami önmagában tartalmazza a működéséhez szükséges ramot és flash tárhelyet a program tárolására, egész a SoC-ig (System on Chip), ami már egy rakás perifériát is tartalmaz (wifi, LTE, GPS stb), ezekből építik a mobiltelefonokat.Aztán ugye a tokozás, ami esetleg megtévesztett téged, hogy lehet DIP, vagy QFP tokozás, de létezik TO-92 tokozású IC is, például hőmérő szenzor.
Amit te videón láthattál, az Attiny85, amit előszeretettel használnak kisebb projektekben, DIP-8 tokozású, klasszikus IC kinézetű, és semmi nem kell hozzá (pl külső órajel), csak táp kell neki és kész, igénytelen és robusztus, na meg olcsó és ahhoz képest sokat tud:
Ha megnézel egy eredeti Arduino UNO lapot, azon is DIP tokozású μC van (sokkal több lábbal):
Csak az újabb lapokra már inkább QFP chipet tesznek, mert olcsóbb és egyszerűbb a gyártása. -
dew28
aktív tag
válasz
lanszelot #19913 üzenetére
Mint írtam a szakkörön annyit mondtak: ic-t ugyanúgy kell programozni mint az arduinot, a képen lévő ic -hez hasonlót rajzolt fel a táblára.
Helyesen:
ic-t ugyanúgy programozni kell, mint az arduinothogy olyat is lássak, hogy ic.
no offense, de legkozelebb szerintem probalj meg eloszor egy google keresest, hogy legalabb legyen fogalmad rola, hogy mit szeretnel kerdezni.
hint: IC - Integrated Circuit - Integralt aramkor -
válasz
lanszelot #19910 üzenetére
Ez a képen fogalmam sincs, hogy micsoda, de talán sejtem, mire gondolsz. Az Arduino előtt pár évig foglalkoztam PIC mikrokontrollerrel (PicKit2, 16F877 μC), a hozzá való szoftvert és programozót mai napig használom attiny μC-k felprogramozására, illetve debugolásra. Na most, hasonlóan az Arduino-hoz, azt is C-ben kell programozni, igaz ahhoz saját fejlesztőkörnyezet volt, és közel sem ennyi library és példakód, de a logikája némileg hasonló (regiszterek használata, portok kezelése). De azt azért túlzás lenne állítani, hogy aki az egyiket tudja, az a másikat is, kb mintha azt mondanám, hogy aki tud biciklizni, az tud repülőt is vezetni.
Más kérdés, ha egy adott μC-t integrálnak az Arduino ökoszisztémába (STM32, ESP).
-
-
DigitXT
félisten
válasz
lanszelot #19855 üzenetére
A többszálúság az a kivétel.
Azt arra mondtam, hogy olyankor "kicsit"
bonyolultabb tervezni a programot. Amúgy, ha szigorúan nézzük, nem
soronként fut a program, hiszen a fordító előre lefordítja gépi kódba.
A leírt szöveg absztrakció...Szkipt nyelvek tudnak soronként futtatni
programokat. (Ott simán lehet, hogy teljesen szar sor marad a kódban,
mégis hibátlanul fut, amíg oda nem ugrik... És akkor elszáll hibával...)
Ilyen szempontból az Arduino által futtatott C sokkal jobb, mivel már a
fordítás közben kiderülnek a szintaktikai hibák + típusosak a változók...
(Mondjuk egy AWK ezzel szemben sokkal rugalmasabb, könnyebb vele
pl. szövegeket feldolgozni, ad hoc jelleggel, rövid programokat írni. Ám
ha elírsz valamit simán megeszi: csak futás közben jön ki, hogy bugos.)Az Arduino Uno/Mega mint egymagos architektúra, egyszerre egyetlen
dolgot csinál, de azt relatíve gyorsan, így tudod kihasználni, hogy kvázi
egyidejűleg látszólag több dolgot csináljon, hogy "pörgeted" a loop-ot.Na most a delay az ezt hazavágja! Szóval nagyobb projekteknél, amikor
több bemenetet kell figyelni, vagy pl. szoftveres soros portot használsz,
nem fér bele, hogy álldogáljunk másodperceket, mert elveszik az adat...
És ilyenkor jön az, hogy megszakítás: az észreveszi... Illetve a hardveres
UART (ami szintén megszakításokkal működik), nagy sebességnél jobb!
Viszont felesleges megszakításokra építeni a programot, ha bőven elég
az is, hogy pörög a loop... A millis() figyelése jobb. Lásd órádra pillantás.Szerk: oké, a SoftwareSerial is megkerüli a delayt megszakításokkal, de
vannak limitációi. Én most pl. Nextion kijelzővel kommunikálok 115200
baud sebességgel (RX1), anno ez mintha nem akart volna összejönni...
Szerk: emellett egy másik porton olvasom a kijelzendő adatokat, stb. -
válasz
lanszelot #19855 üzenetére
Na most gondolod rosszul, nem tud több szálon futni (kivétel mondjuk az esp32 ahol két mag van), ezt miből vontad le?
A program futása soronként történik, kivéve ha megszakítást használsz (de valójában ott is soronként fut a kód).
Ami téged félrevezetett, hogy a megoldás, amit adtam neked, egy modern oprendszer időosztásos módszeréhez hasonlóan látszólag egy időben, de valójában felváltva csinál több dolgot. -
válasz
lanszelot #19848 üzenetére
A kolléga már szépen elmagyarázta (
neki ), én csak a beszúrás részéhez szólnék hozzá:
A hozzászólás írásakor a szövegmező fölött van egy "Váltás a régi szerkesztőre" link. Ez azt csinálja, amit ígér.
Ezzel hibátlanul lehet kódot beszúrni:#include <Adafruit_SSD1306.h>
#include <splash.h>
uint32_t lastms = 0;
bool blink = true;
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3C for 128x32
display.display();
delay(2000);
}
void loop() {
int sensorValue = analogRead(A0);
int isgas = digitalRead(2);
String gas;
//delay(1000);
display.clearDisplay(); //this line to clear previous logo
display.setTextSize(2); /*text size 3*/
display.setCursor(3, 0); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("Gasmeter");
display.setTextSize(1); /*text size 2*/
display.setCursor(0, 50); // ez tartja egy helyben a szöveget
display.setTextColor(WHITE); //without this no display
display.print("CO2 = ");
display.print(sensorValue);
display.print(" PPM ");
if (sensorValue < 90) {
gas = "No Gas";
}else {
gas = " Gas";
if (millis() - lastms > 4000) {
lastms = millis();
blink = !blink;
}
if (blink)
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
}
display.print(gas);
display.display(); //to shows or update your TEXT
}Ez javított kód, minden loop ciklusban kirajzolja a keretet, csak a színét változtatja 4000ms-onként (ez szerintem sok, én 500-at állítanék be).
Ez a két sor a rendszeres törlés miatt valószínűleg nem is kell:
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK); -
DigitXT
félisten
válasz
lanszelot #19848 üzenetére
Most, hogy bemásoltad a kódot, lehet érdemben beszélgetni róla.
Szóval Arduinonál úgy működik, hogy először lefut a setup, aztán meg
átmegy a loop-ba, s az végtelenül ismétlődik. Esetedben ugye a setup
egyrészt inicializálja a kijelzőt, másrészt (meglepetés!) elindítja a soros
portot is, 9600 baud beállítással. Ez azért jó, mert a Serial Monitoron a
program futását tudod monitorozni és tudod debuggolni, ha vmi "gázos".A delay használata egyszerű programoknál rendben van, vagy ha vmire
kifejezetten várni kell, hogy megtörténjen. Ellenben, egy olyan program,
ami folyamatosan (kellene hogy!) nézzen egy bemenetet megakad tőle:
tehát az a delay(1000) az elején feleslegesen vár egy másodpercet. És
amit utána kiértékelsz, az NEM az aktuális mért érték! Hanem még az
egy másodperccel korábbi: nyilván "tanulós" programban ez is elmegy,
amennyiben az ember tisztában van vele. De ha nem, kigyomlálandó...
Erre jött a jótanács a millis() használatról, hiszen az egy mindenkoron
növekvő számláló, a bekapcsolástól kezdve, ezredmásodpercben.
(Tehát, anélkül tudsz mondjuk ~1 másodpercenként csinálni "akármit",
hogy az MCU kifejezetten addig az 1 másodpercig ne csinálna mást...)A koncepcionális különbség pedig annyi, hogy nem megállsz és vársz,
hogy elteljen egy adott időszak (közben nem csinálsz semmit), hanem
szépen csinálod a dolgod, csak időről időre az órádra pillantasz, és ha
azt látod, hogy eltelt már az adott (várakozási) idő, akkor csinálod meg
az időzített/ütemezett feladatot. (Így több dolgot is kényelmesen tudsz
más-más időközönként végrehajtani.) Első körben szerintem ennyi...pont ezért nem szúrtam be, mert lehetetlen ide berakni
Nekem nem úgy néz ki, mintha lehetetlen lenne, ha egyszer sikerült... -
DigitXT
félisten
válasz
lanszelot #19842 üzenetére
Az a program amit bemásoltam az annyi.
Nem, nem annyi, mert csak egy részét másoltad be, a többiről meg vagy írtál,
vagy nem. Így nem lehet érdemben segíteni, hogy félinformációkat közölsz.Nincs vizsgálat.
Mert a sensorValue < 90 az szerinted mi, ha nem egy feltétel vizsgálata?mit tanulnék, ha megírt programokat töltögetnék fel a leírás szerint?
Nagyon sokat: megnézed mit csinál, lépésről-lépésre megpróbálod megérteni.Nincs program. Csak kezdő vagyok. A legelején tartok.
Attól még amit megírtál, és feltöltöttél egy program. Arduino esetén van neki
egy setup része, meg egy loop. Te a loop-ot sem osztottad meg velünk...Mondok egy vicceset. Annak idején egy programozási versenyen sajnos már
nem maradt időm az egyik feladatra egyáltalán, de mivel volt példa, hogy mit
kérdezhetnek a programtól tesztként, annyit írtam, hogy azt választ írja ki.Még csak if sem volt benne, egyszerűen ilyen jellegű megoldás volt: print(42)
Ha és amennyiben a teszt kérdésre jó volt a válasz, érhetett egy pontocskát.Azt mindenkire rábízom, hogy mi volt a kérdés...
-
DigitXT
félisten
válasz
lanszelot #19836 üzenetére
Nagy vonalakban úgy, ahogy írod, egymagos processzoron: pont erre céloztam,
hogy azért a megszakítás ennek keresztbe tud verni rendesen, illetve többszálú
programnál egyéb problémák is felmerülnek a párhuzamosítással kapcsolatban.
(Márpedig egy ESP32 pl. kétmagos, szóval nem teljesen elrugaszkodott dolog.)Az a baj, hogy feltételezed, hogy adott programrészbe került és ott volt a baj a
delay funkcióval, pedig ez a legkevésbé valószínű.Sokkal valószínűbb, hogy
a kód nem is ott tartott. Ilyenkor hasznos beszúrni egy pár Serial.print(akármi)
hívást a kritikus részekre, és nézni a Serial Monitor-on, hogy mit írtál el...Nagyon könnyű elgépelni valamit, s ha megeszi a fordító, akkor sz.rul fog futni:
az egyik ilyen legtriviálisabb (kezdő*) hiba valami értékének a téves vizsgálata,
nevezetesen ha véletlenül nem az "==" operátort használod, hanem az "="-t...
Simán lefordul, simán fut, csak nem azt csinálja, amit gondoltál, hanem amivel
hasonlítanád, azt adja értéknek, majd értékeli, hogy 0 vagy 1* az eredmény.*: de nem csak kezdők követhetik el, hiszen lehet elgépelés is, emiatt néhány
fejlesztői környezet direkt nézi az ilyet, warningot dob rá, hogy ezt akartad-e...*: pontosabban "nem nulla", nehogy valaki belekössön... Egy gyors példa erre:
if (sensorValue = 90) { valami } else { egyéb } Ennél nem csak az a baj, hogy
az "egyéb" soha nem fog lefutni, hanem az is, hogy a sensorValue utána végig
90 lesz, egészen amíg újra be nem olvastad... (És ez egyetlen pici elgépelés.) -
DigitXT
félisten
válasz
lanszelot #19834 üzenetére
Nincs ezzel baj, senki nem úgy kezdte, hogy mindent tud, bár bizonyára
könnyebb úgy az élet, hogy az ember legalább nagy vonalakban ismeri a
koncepciót. Viszont úgy segíteni, hogy nem írod meg, pontosan miben...De örülünk, hogy megoldódott. Ha lenne bármi kérdés, biztos tudunk vmi
segítséggel szolgálni, csak ilyenkor látni kellene, miben kell segíteni...Ui: ha már mindent megértettél, akkor rátérhetünk a megszakításokra.
(Vagy nekem még nagy kedvenceim a mutatók, és a type casting, LOL.)Sőt, egy időben a bitshifting is valami fekete mágiának tűnt. Pont csak a
minap vetettem bele magam, és tök könnyű vele dolgozni... Ez van.
Ez a belevetés erős túlzás, de maga a koncepció ott is tök egyszerű, és
ha érted a szintaxist, akkor teljesen triviális a megfogalmazás...
De ha egyik sincs meg, akkor tényleg csak néz az ember, hogy EZ MI?! -
DigitXT
félisten
válasz
lanszelot #19829 üzenetére
A 200 ms delay nagyon rövid, ha normálisan működne, akkor se villogás, inkább vibrálás lenne az, amit látsz. Amúgy azért nem szerencsés a delay, mert addig nem csinál semmi az MCU, tehát pl. nem mintavételezi az analóg bemeneteket, így ugyanennyivel később fogod észrevenni, ha változott. (Nyilván 0.2 mp nem a világ, de ha felrakod mondjuk 0.5-re, akkor már látható, és felesleges késleltetés a program érdemi működésében, egy minimalista animáció/keret villogtatás miatt.
)
Valami alap dologban szerintem el vagyok tájolódva.
Másold be a teljes kódot, kérlek! -
válasz
lanszelot #19823 üzenetére
Ha törölné a fekete tovább lenne.
v.s.
Kijelzőt a loop elején törli.Ha a loop végén rajzolsz valamit a kijelzőre, amit a loop elején azonnal törölsz, akkor miért csodálkozol, hogy csak egy pillanatig látszik?
Továbbra sem értem ezt a "fekete keret látszik, a fehér nem" helyzetet, mikor monochrome a kijelző, fekete alapon te hogy látod a fekete keretet?
A megosztott oled linkemben is ott van.
Én nem láttam, hogy bármikor linkelted volna a teljes programot.
Szóval ha minden loop ciklus elején törlöd a kijelzőt, akkor mindent újra kell rajzolni, a keretet is, sőt, ez esetben nem is kell fekete keret, hiszen a ciklus elején a fehér keret törlésre kerül... Jó, hogy úgy kell kibarkóbázni belőled a részleteket.
-
válasz
lanszelot #19819 üzenetére
Miután nem láttuk az egész programot, nem is lehet így megmondani, hogy okozza a "bugot". Amit írtam, logikailag nem hibás, valószínűleg a te programod törli a kijelzőt ezért a fehér keret eltűnik kirajzolás után. A másik megoldás azért "nem bugos", mert az minden ciklusban rajzol.
-
DigitXT
félisten
válasz
lanszelot #19815 üzenetére
Nem lehet, hogy valami LCD frissítési turpisság van mögötte? Vmi felülír valamit? Milyen kijelző? Szerintem a display.print(gas)-t sem kellene állandóan kitolni neki, csak ha változott az érték. Meglehet, hogy maga a felirat tünteti el a fehér keretet: ha így van, megpróbálkoznék kicsit nagyobbra venni, hogy kilátsszon mögüle.
-
válasz
lanszelot #19811 üzenetére
uint32_t lastms= 0;
bool blink = true;
void loop() {
if (sensorValue < 90) {
gas = "No Gas";
}else{
gas = " Gas";
if (millis() - lastms > 200) {
lastms = millis();
if (blink)
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
else
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
blink = !blink;
}
}
} -
lanszelot
addikt
válasz
lanszelot #19750 üzenetére
Hello,
Akkor ebben senki sem tud segíteni?
Nem lehet megoldani?Ez nem működik /loop ban van/:
if (sensorValue < 90) {gas = "No Gas";}
else {gas = " Gas";
display.drawRoundRect(80, 47, 40, 15, 2, WHITE);
delay(200);
display.drawRoundRect(80, 47, 40, 15, 2, BLACK);
delay(200);}
Új hozzászólás Aktív témák
Hirdetés
- ThinkPad P16 Gen1 16" FHD+ IPS i9-12950HX RTX A3000 32GB 1TB NVMe ujjlolv gar
- TUF F15 FX506HC 15.6" FHD IPS i5-11400H RTX 3050 16GB 512GB NVMe magyar vbill gar
- Precision 7670 27% 16" FHD+ IPS i7-12850HX RTX A1000 32GB 1TB NVMe IR kam gar
- AKCIÓ! GAMER PC: Új RYZEN 5 4500-5600X +RTX 3060/3070/3080 +Új 16-64GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ
- UHH! HP EliteBook 840 G8 Fémházas Laptop 14" -45% i5-1145G7 4Mag 32/512 FHD IPS Intel Iris Xe Magyar
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest