Már rájöttem a megoldásra, a void loop után az if elágazások előtt ki kellett íratnom a modeval értékét. Ezután a következő probléma az volt, hogy bár tudtam modot váltani, de nem sorrendbe, össze-vissza vissza ugrált a program. A gomb pergése volt a gond, utánanéztem, hogyan lehetne ezt kiküszöbölni. Találtam hardveres és szoftveres megoldásokat is. A hardveres megoldást választottam és abból is a legegyszerűbbet. A nyomógombbal párhuzamosan kötöttem egy kondenzátort, amivel a gomb pergése közben keletkezett rezgéseket elnyeltem. Így most működik, már csak szépíteni kell, meg persze ez csak egy alap majd szeretném bővíteni is (dimmelés, több kimenet és mod) persze dimmelésnél el kell felejteni a reléket és gondolkoztam azon is, hogy rendelek címezhető Led szalagot, de akkor az egész programot át kéne alakítani… Sok lehetőség van, amivel lehetne cifrázni ezt (pl.: lehetne egy olyan mod is, amikor zenére villog). Az egyetlen, ami jelenleg lehetetlené teszi a megvalósítását számomra az a megfelelő képzettség „tudás” hiánya. Na de ahogy írtam a jelenlegi „kész” programot kellene szépíteni, mert szerintem sok felesleges dolog van bent és gondolom, vannak egyszerűbb megoldások, is, mint amit én használtam, ebben kérnék kis segítséget, ha valaki tud egyszerűbb megoldás egy-egy részre, egy rövid magyarázattal egybekötve, ha ráér, leírhatná nekem.
Egy online szimulátort használok, a weboldal (főleg 3D tervezéshez van, de van egy rész az arduinohoz is):
https://www.tinkercad.com/
A kapcsolási rajz:
https://kephost.com/images/2017/11/12/kapcsolas.png
A program:
Kód: Egész kijelölése
int pirosLED = 8;
int zoldLED = 4;
int kekLED = 7;
int potPIN = A0;
int modeval;
int PotVal = 1023;
const int GombPIN = 2;
enum estate {mode, mode1, mode2};
estate state = mode;
void setup() {
Serial.begin(19200);
pinMode(pirosLED, OUTPUT);
pinMode(zoldLED, OUTPUT);
pinMode(kekLED, OUTPUT);
pinMode(GombPIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(GombPIN), blink5, FALLING);
}
void loop() {
switch (state) {
case mode:
c:
Serial.println(modeval);
delay(50);
if (modeval == 1) {
state = mode1;
}
if (modeval == 2) {
state = mode2;
}
if (modeval == 3) {
modeval = 0;
state = mode;
}
if (modeval == 0) {
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
break;
case mode1:
if (modeval != 1) {
goto c;
}
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, HIGH);
digitalWrite(kekLED, HIGH);
PotVal = analogRead(potPIN);
if (PotVal < 100) {
while(PotVal < 100) {
PotVal = analogRead(potPIN);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
}
Serial.println(PotVal);
delay(PotVal);
digitalWrite(pirosLED, HIGH);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, HIGH);
PotVal = analogRead(potPIN);
if (PotVal < 100) {
while(PotVal < 100) {
PotVal = analogRead(potPIN);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
}
Serial.println(PotVal);
delay(PotVal);
digitalWrite(pirosLED, HIGH);
digitalWrite(zoldLED, HIGH);
digitalWrite(kekLED, LOW);
PotVal = analogRead(potPIN);
if (PotVal < 100) {
while(PotVal < 100) {
PotVal = analogRead(potPIN);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
}
Serial.println(PotVal);
delay(PotVal);
case mode2:
if (modeval != 2) {
goto c;
}
digitalWrite(pirosLED, HIGH);
digitalWrite(zoldLED, HIGH);
digitalWrite(kekLED, HIGH);
PotVal = analogRead(potPIN);
if (PotVal < 100) {
while(PotVal < 100) {
PotVal = analogRead(potPIN);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
}
Serial.println(PotVal);
delay(PotVal);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
PotVal = analogRead(potPIN);
if (PotVal < 100) {
while(PotVal < 100) {
PotVal = analogRead(potPIN);
digitalWrite(pirosLED, LOW);
digitalWrite(zoldLED, LOW);
digitalWrite(kekLED, LOW);
}
}
delay(PotVal);
}
}
void blink5() {
digitalWrite(pirosLED, HIGH);
digitalWrite(zoldLED, HIGH);
digitalWrite(kekLED, HIGH);
modeval++;
if (modeval > 2) {
modeval = 0;
}
}