encoder met menu

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

encoder met menu

Berichtdoor shooter » 22 Jan 2014, 15:46

/*PB ontvangen, maar beter hier antwoorden
ja hoor ik wil je best helpen.

allereerst zie ik gebruik van digital pin 2 die hangt ook aan de communicatie dus gebruik andere poorten zoals 11 en 12 bijv.
int pin1 = 2;
int pin2 = 3;
verder geef ze een betere naam zoals encoderA en encoderB, nu is pin1 is pin2 en dat wordt erg lastig kijken.
zet de cases in een aparte sub dan kijkt dat beter.
ik zie nergens de knop van de pushbutton bijv encoderknop
jouw manier van interupts betekent dat niet alle standen maar telkens elke vierde wordt gebruikt.

Zou u mij alstublieft kunnen helpen?

Verzonden: 22 Jan 2014, 09:34
door gbo430
Hallo Shooter zou u mij kunnen helpen om een menu te programmeren die ik bedien met een rotary encoder?
Ik heb een deadline voor het inleveren op 6 februari.
Dit haal ik niet omdat ik nooit les heb gehad in programmeren.
nu heb ik al een begin gemaakt, maar het lukt niet verder. het menu gaat wel van 1 naar 8 maar niet andersom. ook de push button voor het bevestigen van de keuze werkt nog niet. als ik bij bijv. menu 3 de pushbutton inschakel moeten de relais 3 en 8 schakelen via een andere I/O expander.
*/
/* Digital Pin 2 accepts external interrupts. Pin1 of a rotary encoder
is attached to DigitalPin2. An interrupt routine will be called
when pin1 changes state, including noise.
This will be made more efficient with hardware debouncing.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);

#define ADDRESS 0x26
#define CMDREG (byte)0x00


int encodera = 2;//paul
int encoderb = 3;//paul
int counter;
int oldcounter;
boolean goingUp = false;
boolean goingDown = false;
int pos;
void setup()
{
Wire.begin();
Serial.begin(9600);

Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command register to get software version
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 1); // Requests one byte form RLY08
while(Wire.available() < 1); // Wait for it to arrive
byte soft = Wire.read(); // Gets the byte
Serial.println(soft, DEC); // Prints it to the arduino serial monitor
counter = 0;

//Serial prints for debugging and testing
lcd.init();
lcd.backlight();
Serial.begin(9600);

/* Setup encoder pins as inputs */
pinMode(encodera, INPUT); // Pin 2
pinMode(encoderb, INPUT); // Pin 3

// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, decoder,CHANGE); //paul now every change is detected
attachInterrupt(1, decoder,CHANGE); //paul same for pin 3

}

void loop()
{



//paul verander de loop hier
if (counter != oldcounter)
{
verander();
oldcounter=counter;
}

}


//paul subroutines

void verander()
{
Serial.println(counter);
switch(counter)
{
case 1:
lcd.setCursor(0,0);
lcd.print("MENU1");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFE); // Turns on relay 1
Wire.endTransmission();
break;

case 2:
lcd.setCursor(0,0);
lcd.print("MENU2");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFD); // Turns on relay 2 //paul changed comment
Wire.endTransmission();
break;

case 3:
lcd.setCursor(0,0);
lcd.print("MENU3");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFB); // Turns on relay 3 //paul changed comment
Wire.endTransmission();
break;

case 4:
lcd.setCursor(0,0);
lcd.print("MENU4");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF7); // Turns on relay 4 //paul changed comment
Wire.endTransmission();
break;

case 5:
lcd.setCursor(0,0);
lcd.print("MENU5");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0x1F); // Turns on relay 5 //paul changed comment
Wire.endTransmission();
break;

case 6:
lcd.setCursor(0,0);
lcd.print("MENU6");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFC); // Turns on relay 6 //paul changed comment
Wire.endTransmission();
break;

case 7:
lcd.setCursor(0,0);
lcd.print("MENU7");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF9); // Turns on relay 7 //paul changed comment
Wire.endTransmission();
break;

case 8:
lcd.setCursor(0,0);
lcd.print("MENU8");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF3); // Turns on relay 1
Wire.endTransmission();
break;

default:
counter = 0;
}
}
// }



void decoder()
//very short interrupt routine
//Remember that the routine is only called when pin1
//changes state, so it's the value of pin2 that we're
//interrested in here
// only the falling state and that is not enough
//paul this subroutine is called whenever the encoder is moved

{
if (digitalRead(encodera) == digitalRead(encoderb))
{
counter ++;
if (counter > 8)
{
counter=0;
} //if encoder channels are the same, direction is CW
//paul removed delay(3000);
}
else
{
counter --; //if they are not the same, direction is CCW
if (counter<1)
{
counter=1;
}// paul removed delay(3000);
}
}
paul deelen
shooter@home.nl

Advertisement

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 22 Jan 2014, 16:42

Hallo Paul,

Ja is beter zo, sorry ben nog niet zo ervaren hiermee.
Ik heb nu een schema gemaakt. waarin 2x een pcf8574 gekoppeld is met een paar kleine relais.
Ik heb er in totaal 9. deze relais moeten schakelen wanneer we de push button ingedrukt hebben. daarvoor moet alleen het menu scrollen.
Zoals ik hem nu heb overgenomen heb ik de encoder gekoppeld aan pin 11 en 12. en veranderd;
int encodera = 11;//paul
int encoderb = 12;//paul
alleen nu is de draaiknop van de encoder zeer gevoelig, en (ik heb de relais tijdelijk vervangen door ledjes zodat ik zie wat er gebeurt) knipperen de relais zeer snel door elkaar heen.
en aan welke aansluitingen moet de pushbutton gekoppeld worden?

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 22 Jan 2014, 16:50

er zit een pull up aan de rotary encoder van 12K
op de foto ziet u het proef bordje waarop ik het simuleer met ledjes
Bijlagen
foto (2).jpg
foto (2).jpg (62.6 KiB) 10321 keer bekeken

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: encoder met menu

Berichtdoor shooter » 22 Jan 2014, 20:58

/*zo even veranderd er zitten nu twee loops in de interupt routine, de gevoeligheid staat nu op 100. dat is denk ik wat veel .
? waar zit de pushbutton, en jouw idee met de ledjes is prima, gewoon laten zitten en de relais parallel eraan zetten, wel een diode bij de leds zetten want anders gaat er stroom van de relaisvoeding naar de ledvoeding lopen.
en laat je schema zien. (ken je fritzing, schematekenprogramma)

(ook prive verstuurt trouwens
sorry ik heb de pinnen terug gezet omdat je een mooie interupt gebruikt. (kan bij UNO alleen op 2 en 3) Ja dat is wel een goed leermoment trouwens.
ander leermoment is trouwens dat als je de knop inhoud en dan aan de encoder draait je een looplicht hebt. wel leuk natuurlijk.

en probeer de zaak opnieuw te bedraden waarbij de arduino achter de breadboard ligt, dan kun je makkelijker bij je encoder. dan ligt de usb stekker dus helemaal naar achter en lopen er geen draden over de arduino maar netjes naar voren op het breadbordje.



*/

/*PB ontvangen, maar beter hier antwoorden
ja hoor ik wil je best helpen.

allereerst zie ik gebruik van digital pin 2 die hangt ook aan de communicatie dus gebruik andere poorten zoals 11 en 12 bijv.
int pin1 = 2;
int pin2 = 3;
verder geef ze een betere naam zoals encoderA en encoderB, nu is pin1 is pin2 en dat wordt erg lastig kijken.
zet de cases in een aparte sub dan kijkt dat beter.
ik zie nergens de knop van de pushbutton bijv encoderknop
jouw manier van interupts betekent dat niet alle standen maar telkens elke vierde wordt gebruikt.

Zou u mij alstublieft kunnen helpen?

Verzonden: 22 Jan 2014, 09:34
door gbo430
Hallo Shooter zou u mij kunnen helpen om een menu te programmeren die ik bedien met een rotary encoder?
Ik heb een deadline voor het inleveren op 6 februari.
Dit haal ik niet omdat ik nooit les heb gehad in programmeren.
nu heb ik al een begin gemaakt, maar het lukt niet verder. het menu gaat wel van 1 naar 8 maar niet andersom. ook de push button voor het bevestigen van de keuze werkt nog niet. als ik bij bijv. menu 3 de pushbutton inschakel moeten de relais 3 en 8 schakelen via een andere I/O expander.
*/
/* Digital Pin 2 accepts external interrupts. Pin1 of a rotary encoder
is attached to DigitalPin2. An interrupt routine will be called
when pin1 changes state, including noise.
This will be made more efficient with hardware debouncing.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2);

#define ADDRESS 0x26
#define CMDREG (byte)0x00


int encodera = 2;//paul
int encoderb = 3;//paul
int counter;
int oldcounter;
int coderpos = 0;
int gevoeligheid = 100; //paul aantal stappen voordat menu verspringt
int pos;
int maxmenu=8;
void setup()
{
Wire.begin();
Serial.begin(9600);

Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command register to get software version
Wire.endTransmission();
Wire.requestFrom(ADDRESS, 1); // Requests one byte form RLY08
while(Wire.available() < 1); // Wait for it to arrive
byte soft = Wire.read(); // Gets the byte
Serial.println(soft, DEC); // Prints it to the arduino serial monitor
counter = 0;

//Serial prints for debugging and testing
lcd.init();
lcd.backlight();
Serial.begin(9600);

/* Setup encoder pins as inputs */
pinMode(encodera, INPUT); // Pin 2
pinMode(encoderb, INPUT); // Pin 3

// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, decoder,CHANGE); //paul now every change is detected
attachInterrupt(1, decoder,CHANGE); //paul same for pin 3

}

void loop()
{



//paul verander de loop hier
if (counter != oldcounter)
{
verander();
oldcounter=counter;
}

}


//paul subroutines

void verander()
{
Serial.println(counter);
switch(counter)
{
case 1:
lcd.setCursor(0,0);
lcd.print("MENU1");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFE); // Turns on relay 1
Wire.endTransmission();
break;

case 2:
lcd.setCursor(0,0);
lcd.print("MENU2");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFD); // Turns on relay 2 //paul changed comment
Wire.endTransmission();
break;

case 3:
lcd.setCursor(0,0);
lcd.print("MENU3");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFB); // Turns on relay 3 //paul changed comment
Wire.endTransmission();
break;

case 4:
lcd.setCursor(0,0);
lcd.print("MENU4");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF7); // Turns on relay 4 //paul changed comment
Wire.endTransmission();
break;

case 5:
lcd.setCursor(0,0);
lcd.print("MENU5");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0x1F); // Turns on relay 5 //paul changed comment
Wire.endTransmission();
break;

case 6:
lcd.setCursor(0,0);
lcd.print("MENU6");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xFC); // Turns on relay 6 //paul changed comment
Wire.endTransmission();
break;

case 7:
lcd.setCursor(0,0);
lcd.print("MENU7");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF9); // Turns on relay 7 //paul changed comment
Wire.endTransmission();
break;

case 8:
lcd.setCursor(0,0);
lcd.print("MENU8");
Wire.beginTransmission(ADDRESS);
Wire.write(CMDREG); // Sends command byte to RLY08
Wire.write(0xF3); // Turns on relay 1
Wire.endTransmission();
break;

default:
counter = 0;
}
}
// }



void decoder()
//very short interrupt routine
//Remember that the routine is only called when pin1
//changes state, so it's the value of pin2 that we're
//interrested in here
// only the falling state and that is not enough
//paul this subroutine is called whenever the encoder is moved

{
if (digitalRead(encodera) == digitalRead(encoderb))
{ //paul CW
coderpos++ ;
if (coderpos > (gevoeligheid+gevoeligheid) ) // als er meer pulsen dan de gevoeligheid zijn geweest in CW dan counter+1
{
counter++;
coderpos=gevoeligheid; // positie terugzetten naar midden (dit is om met int te blijven werken
}
if (counter > maxmenu) // counter mag natuurlijk niet meer hebben dan menuregels.
{
counter=maxmenu; // blijft op menuregel staan
} //if encoder channels are the same, direction is CW
//paul removed delay(3000);
}
else //paul CCW
{
coderpos--; //paul als teller kleiner is
if (coderpos < 1)
{
counter --; //if they are not the same, direction is CCW
coderpos=gevoeligheid;
}
if (counter<1)
{
counter=1;
}// paul removed delay(3000);
}
}
paul deelen
shooter@home.nl

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 23 Jan 2014, 09:27

Ik heb de gevoeligheid naar 10 terug gezet. maar hij telt niet netjes van menu 1 naar 8. hij gooit alles door elkaar.
en de relais zouden gelijk gaan schakelen als ik aan de rotary draai. terwijl die pas mogen schakelen als ik hem indruk?
Wat is de reden dat het niet meer in de juiste volgorde gaat?
en hoe kan ik de pushbutton activeren?

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 23 Jan 2014, 09:51

de push button zit in de rotary encoder.
ik heb een mooi schema getekend maar die kan ik niet hierin zetten omdat het dan niet meer leesbaar wordt.
Bijlagen
20140123_083117.2.jpg
20140123_083117.2.jpg (143.75 KiB) 10272 keer bekeken

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 23 Jan 2014, 11:06

Ik wil u het grote schema wel mailen, maar ik weet niet of u daar op zit te wachten.
Ik zag uw e-mail adres staan bij een ander onderwerp.
dus ik wacht het even af

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: encoder met menu

Berichtdoor shooter » 23 Jan 2014, 11:35

ja hoor geef maar, waar heb je het schema in gemaakt? wellicht heb ik dat programma?
het forum is juist bedoeld voor dit soort vragen.
ach ik maak ook fouten en heb hier geen encoder liggen, dan had ik het even uitgeprobeerd.
er gaat wat mis bij de encodersoftware
diagram:
CW
1rise 2 low
1fall 2high
1high 2rise
1low 2fall
CCW
1rise 2high
1fall 2low
1high 2fall
1low 2rise
maar inderdaad niemand houd je tegen om niet alle pulsen te gebruiken dus terug naar jouw idee was eigenlijk best wel slim bedacht.
zet de interupts maar weer op rising
dan moet de gevoeligheid naar 3 bijv.

de knop van de encoder moet ook gewoon op een ingang gezet worden.
en afhankelijk of je de relais alleen aan wilt hebben als er op de knop gedrukt wordt of altijd aan.
dan moet je dus een IF maken in loop (als er op de knop gedrukt word dan doe zet relais aan.) dus nu moet je dat hele verhaal van die wire in een aparte routine zetten en alleen de menuregels laten staan.
krijg je dus nog een routine relaisverander.
even zelf doen want is hoop werk.
heb je gelijk geleerd om functies te groeperen (is een eerste stap naar OOP).
dus gewoon het stuk kopieren en dan hele delen eruit deleten.
ik hoor je nog.
paul deelen
shooter@home.nl

Berichten: 7
Geregistreerd: 19 Dec 2013, 16:07

Re: encoder met menu

Berichtdoor gbo430 » 23 Jan 2014, 12:32

het lastige nu is dat ik uit moet vinden wanneer het menu van 1 naar 8 gaat en wanneer andersom

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: encoder met menu

Berichtdoor shooter » 23 Jan 2014, 16:15

bij 1 gewoon stoppen dus niet naar 8 gaan. als menu 1 aan is en encoder gaat toch lager dan blijft deze 1.
en andere kant ook daarvoor is maxmenu gemaakt.
paul deelen
shooter@home.nl

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 38 gasten