Hirdetés
-
LOGOUT.hu
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Új hozzászólás Aktív témák
-
hukhl
csendes tag
Sziasztok!
Lenne egy kezdő kérdésem. Nyomógomb lenyomásainak számát számolom és erre léptetek állapotokat, mint egy állapotgép szerűen. Az egyes állapotokban 4 db LED-et villogtatok. (minden állapotban más-más sorrendben) Először delay-t használtam. Ezzel az volt a gond, hogy, amíg az egyik állapotom nem járt le addig nem tudtam tovább léptetni.
Aztán rátaláltam a millis()-re amivel szépen meglehetne ezt oldani. Mivel sok LED-em van és sok állapotom, így arra gondoltam, hogy ezt behívható funkcióként kellene megcsinálni. És amikor az egyik állapotban meghívom, akkor megadom a funkció bemeneti értékként a kívánt LED számát és a késleltetés idejét. Ezt a funkciót egy állapotban többször meghívva különböző LED-eket különböző ideig lehetne villogtatni. És közben elvileg a nyomógombom állapotát is tudom figyelni.
Idáig jutottam:
//---------------
//Function
//--------------bool LedMillis(long interval, int LEDPin, unsigned long currentMillis, bool ledState){
bool LEDStateResultInternal;
unsigned long previousMillis = 0;if (currentMillis - previousMillis >= interval)
{if(ledState == LOW)
{
ledState = HIGH;ledState = LEDStateResultInternal;
}
else{
ledState = LOW;
ledState = LEDStateResultInternal;
}
previousMillis = currentMillis;
digitalWrite(LEDPin, ledState);
}
return LEDStateResultInternal;
}Az adott kimenet számát, amelyhez a LED tartozik - LEDPin értéken adom be
CurrentMillis-nél az aktuális Millis értéket adom be
ledState-értéknél pedig a returnként visszaadott led állapot csatolom vissza.A previousMillis értékem sajnos mindig 0 marad mivel újra meghívódik a funkció és kinullázódik.
A previousMillis érétket valahogy funkció meghívásonként el lehet tárolni valahogy külön-külön?
Visszatérési értékként lehet több különböző adatot visszaadni?
Bocsánat, ha kicsit katyvasznak tűnik így elsőre.
Még szoknom kell ezt a környezetet.Köszönöm a segítséget!
[ Szerkesztve ]
-
hukhl
csendes tag
Köszönöm aryes és neked is Janos250!
Ez a globális változó ez bejött.Viszont a funkcióból sajnos nem sikerült kinyernem a return értéket. Biztos valami alap nyelvtani hibát vétek ami miatt nem sikerül. Monitorozva a programot, sajnos nem kapom meg kívülre az értéket...
Lent látató az eddigi kód bejelölve ahova át akarnám másolni a visszatérési értéket majd újra betenni a funkcióba. Így megoldani a LED ki és bekapcsolását...Végig gondolva az eddig megírt funkciót, ha többször fogom behívni akkor a "previousMillis" értékeket külön-külön kell nyilvántartani, mivel más időintervallumot fogok megadni az egyes ledekhez és így máskor kapja meg majd az aktális Millis értéket.
//---------
//Constans
//---------
const int LED1 = 12;
const int LED2 = 10;
const int LED3 = 8;
const int LED4 = 6;
const int BUTTON1 = 4;
const int BUTTON2 = 2;
//---------
//Variables
//---------
unsigned long previousMillis = 0;
int Button1State = 0;
int Button2State = 0;
int Button1LastState = 0;
int Button2LastState = 0;
int Button1CountState = 0;
int Button2CountState = 0;
bool LedStateResult = LOW;
//-------------------
// Start Initializing
//-------------------
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(BUTTON1, INPUT);
pinMode(BUTTON2, INPUT);
Serial.begin(9600);
}
//--------------------
//Main CODE start here
//--------------------
void loop() {
Button1State = digitalRead(BUTTON1);
unsigned long currentMillis = millis();
//---------------------------------
//Button State Reading and Counting
//---------------------------------
if (Button1State != Button1LastState) {
if(Button1State == HIGH){
Button1CountState = Button1CountState+1;
Serial.println("BUTTON STATE CHANGED");
}
}
Button1LastState = Button1State;
Serial.print("LED Result Main Loop : ");
Serial.println(LedStateResult);
//-----------------------------------------
//State machine according to Button 1 State
//-----------------------------------------
switch (Button1CountState)
{
case 0:
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
Serial.println("CASE0");
break;
case 1:
LedMillis(2000, LED1, currentMillis, LedStateResult);
LedStateResult = LedMillis;
// Serial.print("Millis Function Reuslt: ");
// Serial.println(LedMillis);
Serial.print("LED Result CASE1 : ");
Serial.println(LedStateResult);
//LedMillis(500, LED2, currentMillis, LedStateResult);
// LedMillis(500, LED3, currentMillis, LedStateResult);
Serial.println("CASE1");
break;
case 2:
Serial.println("CASE2");
break;
case 3:
Serial.println("CASE3");
break;
case 4:
Serial.println("CASE4");
break;
case 5:
Serial.println("CASE5");
break;
case 6:
Serial.println("CASE6");
Button1CountState = 0;
break;
}
}//----------
//Function
//-----------
bool LedMillis(long interval, int LEDPin, unsigned long currentMillis, bool ledState){
bool LEDStateResultInternal;
Serial.print("Previous Millis :");
Serial.println(previousMillis);
Serial.print("Current Millis :");
Serial.println(currentMillis);
if (currentMillis - previousMillis >= interval)
{
if(ledState == LOW)
{
ledState = HIGH;
LEDStateResultInternal = ledState;
Serial.print("LED Result LedState High :");
Serial.println(LEDStateResultInternal);
}
else{
ledState = LOW;
LEDStateResultInternal = ledState;
Serial.print("LED Result LedState Low :");
Serial.println(LEDStateResultInternal);
}
previousMillis = currentMillis;
digitalWrite(LEDPin, ledState);
Serial.print("LED Result Final LedState :");
Serial.println(ledState);
}
return LEDStateResultInternal;
} -
hukhl
csendes tag
Szia!
Igen ennél a sornál akarnám beírni a "LedMillis" funkció visszatérési értékét a "LedStateResult "-ba, hogy a következő funkció lefuttásnál már ezzel a beolvasott értékkel dolgozzon a funkció. Ekkor elvileg 2000 msec-onként a visszatérési érték negálódik és ezzel a LED kivezérlési értéke is. -
hukhl
csendes tag
Bocsánat a szerkesztésért.
Ahogy fentebb írtam. Egy olyan funkciót szeretnék megírni. Ahol paraméterként egy idő intervallumot és egy pin számot kellene megadni. Amivel a pin-hez tartozó LED-et megadot ideig villogtatom. És van egy állapotgép, amit nyomógombbal léptetek. Az egyes állapotokhoz ezt a funkciót hívnám be. Ahol mindig más és más idő intervallmot adnék majd meg. Tudom elég nyakatekert. -
hukhl
csendes tag
válasz Janos250 #14089 üzenetére
Szia!
Igen előrébb jutottam a témával kapcsolatban
#1404 - aryes - válaszában ahogy írta. Elkezdtem utána nézni hogy lehetne egy ilyen LED classot csinálni. És belefutottam egy leírásba ahol a szerző az OOP előnyeit pont egy ilyen LED-es class készítése közben magyarázta el.
A LED számát, a bekapcsolás és kikapcsolás idejét is meg lehet adni benne.
Magamtól sajnos még nem tudok ilyet írni, de ezt jól be tudtam illeszteni az eddigi programomba.
Tegnapi nap nagy része pedig egy 2004A típusú kijelző élesztésével ment el. A nap végére azt is sikerült összehoznom. Ma, ha lesz időm akkor akarok írni rá fancy szövegeket. Illetve van néhány szenzorom amit fel akarok még éleszteni és beintegrálni az eddigi projektbe.
Szóval köszönöm az eddigi segítséget!
Új hozzászólás Aktív témák
Hirdetés
- Nők, nőügyek (18+)
- 3D nyomtatás
- Kerékpársportok
- Milyen cserélhető objektíves gépet?
- A fociról könnyedén, egy baráti társaságban
- Android alkalmazások - szoftver kibeszélő topik
- Black Friday november 29. / Cyber Monday december 2.
- Kerékpárosok, bringások ide!
- Milyen autót vegyek?
- Ez a mondat angolul?
- További aktív témák...
- MSI GTX 1660 GAMING X 6gb újszerű
- Panasonic CF-20 ütésálló, ipari notebook & tablet számlával, garanciával
- Arctic P12, P14, Slim, Max, PWM, PST
- Lenovo ThinkPad E495 Ryzen 5 pro 3500U, 8GB RAM, 256GB SSD, jó akku, szép állapot, számla, garancia
- Lenovo ThinkPad X395 Ryzen 5 pro 3500U, 16GB RAM, 256GB SSD, jó akku, szép állapot, számla, garancia
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: HC Pointer Kft.
Város: Pécs