ylös/alas ledi+2 nappia?

kaavaillut laitteeseen nappi s1 ylös, nappi s2 alas. kun start niin led 0
jos s1 niin ei mitään ==led0 //ei voi mennä alemmas Minimi.
jos s2 niin led1
lue positio ylös muistiin.=1
jos s1 niin led0 //alas
joss2 niin led2 //ylös
pos=2 //muistiin
Jos s1 -led1 //alas
jos s2 led3 //ylös
pos=3 //muistiin
jos s1 niin led2 //alas
jos s2 niin led4 //ylöspäin
pos=4 // muistiin
jos s1 niin led 3 //alaspäin
jos s2 ei mitään ==4 // maximi led. ei voi mennä ylemmäs.

Miten tämän saisi kirjoitettua nätisti arduino unolle ?
ei vaan taas järki juokse pätkääkään :frowning: ==ei vaan vielä osaa mitään kunnolla.
eli eräänlainen rajoitettu ylös/alas laskuri jossa ledit näyttää missä mennään. mikä on oikea positio napin painalluksen jälkeen, Mutta epäilyttää sekoaako ja miten saan position muistiin ? 0 startissa tai kai pakko jokin reset indikointi ylimääräisenä lisätä ???
entä jos painaa s1 enemmän kuin 1x niin sekoaako ?
sama s2 ??
eli huomioi vain yhden kerran napin painalluksen kerrallaan ettei vahinkossa sekoa.
tosi hankalaa kun ei tiedä miten tuo kirjoitetaan,ajatus kyllä selkeä miten pitää toimia mutta koodi ei niinkään :slight_smile:
5 lediä+ (on)-off-(on) kytkin.(palautuva)
Olisiko jollain hajua miten tuon tekisi ja opettaisi ?
kiitollinen avusta.
kun en osannut tehdä usb HID interfacea pc:lle , Vaatii kai toisenlaisen arduinon kuin uno ja bootloaderikin pitää kai kokonaan muuttaa usb toimivaksi eikä ole muita ohjelmointilaitteita. niin pä'dyin 2 puoliseen kytkimeen liitettynä joystikin painonappien tilalle toinen puoli toimii jo eli ohjelma pc:ssä ymmärtää muutoksen ja vastaa,toisen puolin kytkimestä kytkisin arduinoon ja lukee mitä tehtiin ja näyttää ledillä missä ollaan.

Siis mitä?

Siis 5 lediä, joista yksi kerrallaan palaa ja napit ylös/alas jotka säätelee mikä ledeistä palaa?

Jotain tällaista?

// index of lit led
byte state = 0;

void setup() {
	// leds connected to pins 2-6
	pinMode(2, OUTPUT);
	pinMode(3, OUTPUT);
	pinMode(4, OUTPUT);
	pinMode(5, OUTPUT);
	pinMode(6, OUTPUT);
}

void loop() {
	// read buttons and update state
	if(<up button pressed> && state < 4)
		state++;
	if(<down button pressed> && state > 0)
		state--;
	if(<reset button pressed>)
		state = 0;

	// update leds
	for(byte i = 0; i < 5; i++)
		digitalWrite(i + 2, state == i);
}

joo,pitää kokeilla,nyt sain toimimaan eräällä encoder esimerkillä , Mutta väärinpäin.
kokeilen lisätä koodin tähän.------

// usually the rotary encoders three pins have the ground pin in the middle
enum PinAssignments {
encoderPinA = 2, // right (labeled DT on our decoder, yellow wire)
encoderPinB = 3, // left (labeled CLK on our decoder, green wire)
clearButton = 8 // switch (labeled SW on our decoder, orange wire)
// connect the +5v and gnd appropriately
};

volatile unsigned int encoderPos = 0; // a counter for the dial
unsigned int lastReportedPos = 1; // change management
static boolean rotating=false; // debounce management

// interrupt service routine vars
boolean A_set = true;
boolean B_set = true;

void setup() {

pinMode(encoderPinA, INPUT_PULLUP); // new method of enabling pullups
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(clearButton, INPUT_PULLUP);
// turn on pullup resistors (old method)
//digitalWrite(encoderPinA, HIGH);
// digitalWrite(encoderPinB, HIGH);
// digitalWrite(clearButton, HIGH);

// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);

Serial.begin(9600); // output
}

// main loop, work is done by interrupt service routines, this one only prints stuff
void loop() {
rotating = true; // reset the debouncer

if (lastReportedPos != encoderPos) {
Serial.print("Index:");
Serial.println(encoderPos, DEC);
lastReportedPos = encoderPos;
}
if (digitalRead(clearButton) == LOW ) {
encoderPos = 0;
}
}

// Interrupt on A changing state
void doEncoderA(){
// debounce
if ( rotating ) delay (1); // wait a little until the bouncing is done

// Test transition, did things really change?
if( digitalRead(encoderPinA) != A_set ) { // debounce once more
A_set = !A_set;

// adjust counter + if A leads B
if ( A_set && !B_set )
encoderPos += 1;

rotating = false; // no more debouncing until loop() hits again
}
}

// Interrupt on B changing state, same as A above
void doEncoderB(){
if ( rotating ) delay (1);
if( digitalRead(encoderPinB) != B_set ) {
B_set = !B_set;
// adjust counter - 1 if B leads A
if( B_set && !A_set )
encoderPos -= 1;

rotating = false;
}
}
Tuossa vain se ongelma , Mitä pitää mututaa että napit 2 ja 3 olisi toisinpäin, nyt molemmat pitää olla pohjassa että päästämällä nappi ylös vaihtuu ylös/alas. menee vaikeaksi mulle tämä jo :slight_smile:

ja miten ulos tieto ? esim juuri ledeille,nyt näyttää joka napin päästön hyvin(serial monitorissa) muuttuu arvo yhden ylös/alas.

Ajatuksena tehdä tuohon void loopiin joku if else juttu jos index=1 niin led out high 1,if index=2 led out 2 tai jokin case 1,2,3,4
if index 1 niin case 1 ja if index 2 niin case 2. hmm voiskohan toimia noin ?
napeiksi tulee (on)-of-(on) kytkin ylös/alas ja ledit näyttää mikä tila kyseessä.
Mutta kokeilen tuota ehdotustasi nyt ensin jos vaikka se toimisi. kiitos, ei ole helppoa näin alkuun tämä, hajua on mutta ihan pihalla jos jotain pitää muuttaa :smiley: