Arduino och rotary encoder [löst]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
slft
Inlägg: 487
Blev medlem: 9 oktober 2009, 10:45:21
Skype: sm6xwe
Ort: Tibro

Arduino och rotary encoder [löst]

Inlägg av slft »

försöker och få till en bevattningsstyrning med 3 zoner och vill med en rotary encoder och en knapp
kunna ändra öppningstiden på magnetventiler och även intervallen mellan öppningstiderna

tiderna ligger i variabeln ValveTime[]

har en rutin som skriver ut tiderna på en display och man kan med tryckknappen flytta cursorn mellan de olika positionerna

behöver hjälp med att förändra värdet i positionen med encodern hittar ingen tutorial för detta

någon som kan knuffa mig i rätt riktning?

//Ola

Kod: Markera allt

/*
DNU= Display Needs Update

*/

// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Encoder.h>
Encoder myEnc(2, 3);


//ValveTime[0-2] = opentime  
//ValveTime[3-5] = delaytime

int ValveTime[] = {00, 01, 02, 03, 04, 05}; //read from eeprom later
int count = 0; 

 /* 
  for (count=0;count<6;count++) {
   int ValveTime[count] =EEPROM.read(count)
  }
*/

int DNU=1;
const int buttonPin = 4;
int CursorPos = 0;
int buttonState = 0;//state of button pressed
int oldencpos = 0;
int lastButtonState = 0;

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to

const int rs = A0, en = A1, d4 = A2, d5 = A3, d6 = A4, d7 = A5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//***************************************************************************

void setup() {
pinMode(LED_BUILTIN, OUTPUT);

pinMode(buttonPin, INPUT_PULLUP);
 Serial.begin(115200);//for debug 
  // set up the LCD's number of columns and rows:
  lcd.begin(20,4); //setup display
 
  digitalWrite(LED_BUILTIN, LOW);

 }


//*********************************************************

void loop() {
if (DNU == 1){
    PrintDisplay();
    DNU=0;
}

buttonread();


int neWpos =myEnc.read();

Serial.print(neWpos);
Serial.print("\t");
Serial.print(CursorPos);
Serial.print("\t");
Serial.println(ValveTime[CursorPos]);

if (neWpos != ValveTime[CursorPos]) {
  ValveTime[CursorPos]=neWpos;
 /* if (ValveTime[CursorPos] < 0){
    ValveTime[CursorPos] = 0;
   
}*/
 DNU = 1;
}
}

//**********************************************************



void SetCursor(void){
   
   CursorPos ++;
  lcd.cursor();
  lcd.blink();
  
//  Serial.println("setcursor");
  Serial.println(CursorPos);
 
  switch (CursorPos) {
  
   case 0:
   lcd.noBlink();
   break;
   
    case 1:
   lcd.setCursor(1, 1);
    break;
      
    case 2:
   lcd.setCursor(9, 1);
    break;
    
     case 3:
   lcd.setCursor(17, 1);
    break;
     
     case 4:
   lcd.setCursor(1, 3);
    break;
     
     case 5:
   lcd.setCursor(9, 3);
    break;
     
     case 6:
   lcd.setCursor(17, 3);
    break;
     
     case 7:
   lcd.noCursor();
    lcd.noBlink();
    CursorPos=0;
    break;
    }
    
  
  }

//******************************************************************
  
void PrintDisplay(void) {



  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("opentime");
  lcd.setCursor(1, 1);
   lcd.print(ValveTime[0]);
    lcd.setCursor(9, 1);
   lcd.print(ValveTime[1]);
  lcd.setCursor(17, 1);
 lcd.print(ValveTime[2]);
  lcd.setCursor(1, 2);
  lcd.print("delaytime");
  lcd.setCursor(1, 3);
  lcd.print(ValveTime[3]);
  lcd.setCursor(9, 3);
  lcd.print(ValveTime[4]);
  lcd.setCursor(17, 3);
lcd.print(ValveTime[5]);
}

//****************************************************************

void buttonread (void)
{
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter

    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:

    SetCursor();
    // valvepos
    }
  

    // save the current state as the last state,
    //for next time through the loop
    lastButtonState = buttonState;
  }
}
Senast redigerad av slft 6 maj 2020, 21:11:22, redigerad totalt 1 gång.
Användarvisningsbild
Bosen
Inlägg: 1753
Blev medlem: 18 juli 2005, 10:56:31
Ort: Karl Gustav, Varberg
Kontakt:

Re: Arduino och rotary encoder

Inlägg av Bosen »

Det var ett tag sedan jag lekte med rotary encoders. men jag tror att denna länken kan vara ganska användbar:
https://dronebotworkshop.com/rotary-encoders-arduino/
Skogen
Inlägg: 904
Blev medlem: 5 januari 2013, 22:50:34
Ort: Alingsås

Re: Arduino och rotary encoder

Inlägg av Skogen »

Använd interrupt istället för att hela tiden läsa av encoder och knapp.
Här är en enkel video som kan få dig i rätt riktning.
SeniorLemuren
Inlägg: 7810
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Arduino och rotary encoder

Inlägg av SeniorLemuren »

Ladda ner och installera library Encoder-1.4.1.zip och använd de färdiga rutiner som finns där.
slft
Inlägg: 487
Blev medlem: 9 oktober 2009, 10:45:21
Skype: sm6xwe
Ort: Tibro

Re: Arduino och rotary encoder

Inlägg av slft »

encoder lib och dess exempel löste problemet

tack för hjälpen (kommer nog mer frågor framöver då projektet nu kan fortskrida)

Kod: Markera allt

/*
DNU= Display Needs Update

*/

// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Encoder.h>
Encoder knobLeft(2, 3);


//ValveTime[0-2] = opentime  
//ValveTime[3-5] = delaytime
int ValveTime[] = {00, 01, 02, 03, 04, 05}; //read from eeprom later
int count = 0; 
 /* 
  for (count=0;count<6;count++) {
   int ValveTime[count] =EEPROM.read(count)
  }
*/

int DNU=1;
const int buttonPin = 4;
int CursorPos = 0;
int buttonState = 0;//state of button pressed

int lastButtonState = 0;
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = A0, en = A1, d4 = A2, d5 = A3, d6 = A4, d7 = A5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//***************************************************************************

void setup() {
pinMode(LED_BUILTIN, OUTPUT);

pinMode(buttonPin, INPUT_PULLUP);
 Serial.begin(9600);//for debug 
  // set up the LCD's number of columns and rows:
  lcd.begin(20,4); //setup display
 
  digitalWrite(LED_BUILTIN, LOW);

 }

long positionLeft  = -999;
//*********************************************************

void loop() {
if (DNU == 1){
    PrintDisplay();
    DNU=0;
}

buttonread();
EncoderRead();



}

//**********************************************************



void SetCursor(void){
   
   CursorPos ++;
  lcd.cursor();
  lcd.blink();
  
//  Serial.println("setcursor");
  Serial.println(CursorPos);
 
  switch (CursorPos) {
  
   case 0:
   lcd.noBlink();
   break;
   
    case 1:
   lcd.setCursor(1, 1);
    break;
      
    case 2:
   lcd.setCursor(9, 1);
    break;
    
     case 3:
   lcd.setCursor(17, 1);
    break;
     
     case 4:
   lcd.setCursor(1, 3);
    break;
     
     case 5:
   lcd.setCursor(9, 3);
    break;
     
     case 6:
   lcd.setCursor(17, 3);
    break;
     
     case 7:
   lcd.noCursor();
    lcd.noBlink();
    CursorPos=0;
    break;
    }
    
  
  }

//******************************************************************
  
void PrintDisplay(void) {



  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("opentime");
  lcd.setCursor(1, 1);
   lcd.print(ValveTime[0]);
    lcd.setCursor(9, 1);
   lcd.print(ValveTime[1]);
  lcd.setCursor(17, 1);
 lcd.print(ValveTime[2]);
  lcd.setCursor(1, 2);
  lcd.print("delaytime");
  lcd.setCursor(1, 3);
  lcd.print(ValveTime[3]);
  lcd.setCursor(9, 3);
  lcd.print(ValveTime[4]);
  lcd.setCursor(17, 3);
lcd.print(ValveTime[5]);
}

//****************************************************************

void buttonread (void)
{
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter

    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:

    SetCursor();
    // valvepos
    }
  

    // save the current state as the last state,
    //for next time through the loop
    lastButtonState = buttonState;
  }
}

void EncoderRead (void)
{ 
  long newLeft;
  newLeft = knobLeft.read();
  //newRight = knobRight.read();
  if (newLeft != positionLeft) {//|| newRight != positionRight) {
    if(newLeft > positionLeft){
      ValveTime[CursorPos-1]--;
      DNU=1;
  if (ValveTime[CursorPos-1]<0){
    ValveTime[CursorPos-1] = 0;
  }
  }
  
    else {
      ValveTime[CursorPos-1]++;
      DNU=1;
   if (ValveTime[CursorPos-1] > 60){
    ValveTime[CursorPos-1] = 60;
    }
    }
  
    Serial.print(ValveTime[CursorPos]);
   // Serial.print("Left = ");
   // Serial.print(newLeft);
    //Serial.print(", Right = ");
    //Serial.print(newRight);
    Serial.println();
    positionLeft = newLeft;
   // positionRight = newRight;
  }
  }
Skriv svar