Quantcast
Channel: Arduino Forum - Latest topics
Viewing all articles
Browse latest Browse all 15287

Rotation encoder: interrupts are neglected when in While Loop

$
0
0

Hi all,
I am not a very experienced Arduino programmer and I could use help on the following issue:
I want to make a windingmachine with a 12 volt motor. On this machine I want to use a rotary-encoder (KY-040) to step through some menu options to set number of turns, motorspeed, pauze and restart the winding etc. I use the KY040rotary library and I (try to) use interrupts to trigger the rotary actions.
However when I have started the windup() function, where a While loop runs until the number of turns is reached, the interrupts of the rotary-encoder are not triggered.
Please, can anyone help me on my way?
Here is my code:

#include "KY040rotary.h"
#include <Wire.h> 
#include <LiquidCrystal_PCF8574.h>
#include <L298N.h>

// Rotary Encoder Module connections
const int pinCLK=2;    // CLOCK signal
const int pinSW=3;   // Rotary Encoder Switch
const int pinDT=4;    // DATA signal

// init the button
KY040 Rotary(pinCLK, pinDT, pinSW);

// Motor Pin definition
const unsigned int IN1 = 7;
const unsigned int IN2 = 8;
const unsigned int EN = 9;

const int IN_D6 = 6; // digital input

// Create one motor instance
L298N motor(EN, IN1, IN2);

int turns = 0;
int speed = 50;
boolean direction = true;
boolean state = true;
int pauzeMenuItem = 0;

//init LiquidCrystalDisplay
LiquidCrystal_PCF8574 lcd(0x27);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void OnButtonClicked(void) {
  Serial.println("Button 1: clicked");
  pushButton();
}
void OnButtonLeft(void) {
  Serial.println("Button Left");
  rotateMenu(2);
}
void OnButtonRight(void) {
  Serial.println("Button right");
  rotateMenu(1);
}

/* Handlers for interrupts mode*/
  void RSW1_SwitchInterruptHandler(void) {
    Rotary.HandleSwitchInterrupt();
  }
  void RSW1_RotateInterruptHandler(void) {
    Rotary.HandleRotateInterrupt();
 }

int sequenceStep = 0;
char *sequenceStepText[] = {"Start",
                            "Windings (1000)",
                            "Windings (100)",
                            "Start winding",
                            "Winding",
                            "Pauze",
                            "Continue",
                            "Rewind",
                            "Cancel",
                            "Finished"};

void setup() {
  pinMode (IN_D6, INPUT);   //Counter pulse
  int error;

  // Used to display information
  Serial.begin(115200);
  // Wait for Serial Monitor to be opened
  while (!Serial)
  {
    //do nothing
  }

  //Set up lcd
  Wire.begin();
  Wire.beginTransmission(0x27);
  error = Wire.endTransmission();
  if (error == 0) {
    Serial.println(": LCD found.");
    lcd.begin(16, 2);  // initialize the lcd
  } else {
    Serial.println(": LCD not found.");
  }  // if

  lcd.setBacklight(255);
  lcd.home();
  lcd.clear();
  lcd.setCursor(0,0); //Defining positon to write from first row, first column .
  lcd.print("Winder");
  lcd.setCursor(0,1); //Second row, first column
  lcd.print("Preparation"); 

  /* Init in interrupts mode*/
    if ( !Rotary.Begin(RSW1_SwitchInterruptHandler, RSW1_RotateInterruptHandler) ) {
    Serial.println("unable to init rotate button");
    while (1);
  }

  // init callbacks
  Rotary.OnButtonClicked(OnButtonClicked);
  Rotary.OnButtonLeft(OnButtonLeft);
  Rotary.OnButtonRight(OnButtonRight);

  Serial.println("KY-040 rotary encoder OK");
  lcd.clear(); //clear the whole LCD
  lcd.setCursor(0,0); 
  lcd.print(sequenceStepText[sequenceStep]);
}


void loop() {
  Rotary.Process( millis() );
}

void pushButton() {
  Serial.println("pushButton pressed");
  Serial.println(sequenceStep);
  delay(10); 
  switch(sequenceStep) {
    case 0:             // Start --> Windings (1000)
      sequenceStep++;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      lcd.setCursor(0,1); 
      lcd.print(turns);
      break;
    case 1:             // Windings (1000) --> Windings (100)
      sequenceStep++;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      lcd.setCursor(0,1); 
      lcd.print(turns);
      break;
    case 2:             // Windings (100) --> Start Winding
      sequenceStep++;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      lcd.setCursor(0,1); 
      lcd.print(turns);
      break;
    case 3:             // Start Winding --> Winding
      sequenceStep++;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      lcd.setCursor(0,1); 
      lcd.print(turns);
      lcd.setCursor(6, 1);
      lcd.print("Speed ");
      lcd.print(speed);
      windup();
      sequenceStep = 9;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      break;
    case 4:             //Winding --> Pauze
      motor.stop();
      sequenceStep++;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      break;
    case 8:             //Cancel --> Start
      sequenceStep = 0;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      break;
    case 9:             //Finished --> Start
      sequenceStep = 0;
      lcd.clear();
      lcd.setCursor(0,0); 
      lcd.print(sequenceStepText[sequenceStep]);
      break;
  } 
  
}

void rotateMenu(int rotationDir) { 
  boolean rotationDirection;
  switch(rotationDir) {
    case 0:
      Serial.println("rotary bounced!");
      exit;
    case 1:
      rotationDirection = true;
      break;
    case 2:
      rotationDirection = false;
      break;
  }
  switch(sequenceStep) {
    case 1:             // Windings (1000)
      Serial.print("sequenceStep = ");
      Serial.println(sequenceStep);
      if (rotationDirection) {
        turns = turns + 1000;
      } else {
        turns = turns - 1000;
        if (turns < 0) {turns = 0;}
      }
      lcd.setCursor(0,1); 
      lcd.print("     ");
      lcd.setCursor(0,1); 
      lcd.print(turns);
      break;
    case 2:             // Windings (100)
      Serial.print("sequenceStep = ");
      Serial.println(sequenceStep);
      if (rotationDirection) {
        turns = turns + 100;
      } else {
        turns = turns - 100;
        if (turns < 0) {turns = 0;}
      }
      lcd.setCursor(0,1); 
      lcd.print("     ");
      lcd.setCursor(0,1); 
      lcd.print(turns);
      break;
    case 3:             // Start Winding
      Serial.print("sequenceStep = ");
      Serial.println(sequenceStep);
      if (rotationDirection) {
        speed = speed + 10;
        if (speed > 250) {speed = 250;}
      } else {
        speed = speed - 10;
        if (speed < 10) {speed = 10;}
      }
      lcd.setCursor(6, 1);
      lcd.print("         ");
      lcd.setCursor(6, 1);
      lcd.print("Speed ");
      lcd.print(speed);
      break;
    case 4:             // Winding
      Serial.print("sequenceStep = ");
      Serial.println(sequenceStep);
      if (rotationDirection) {
        speed = speed + 10;
        if (speed > 250) {speed = 250;}
      } else {
        speed = speed - 10;
        if (speed < 10) {speed = 10;}
      }
      lcd.setCursor(12, 1);
      lcd.print("    ");
      lcd.setCursor(12, 1);
      lcd.print(speed);
      break;
    case 5:             // Pauze
      if (rotationDirection) {
        if (pauzeMenuItem < 1) { 
          pauzeMenuItem++;
        }
        sequenceStep = 3;
        lcd.setCursor(0, 1);
        lcd.print("                ");
        lcd.setCursor(0, 1);
        lcd.print(sequenceStepText[6]);
      } else {
        if (pauzeMenuItem > -1) { 
          pauzeMenuItem--;
        }
      }
      switch (pauzeMenuItem) { 
        case 1:
          direction = true;
          sequenceStep = 3;
          lcd.setCursor(0, 1);
          lcd.print("                ");
          lcd.setCursor(0, 1);
          lcd.print(sequenceStepText[6]);
          break;
        case 0:
          direction = false;
          sequenceStep = 3;
          lcd.setCursor(0, 1);
          lcd.print("                ");
          lcd.setCursor(0, 1);
          lcd.print(sequenceStepText[7]);
          break;
        case -1:
          sequenceStep = 8;
          lcd.setCursor(0, 1);
          lcd.print("                ");
          lcd.setCursor(0, 1);
          lcd.print(sequenceStepText[8]);
          break;
      }
  }
}

void windup(){
  while(turns > 0){
    countTurns();
  }
  motor.stop();
  sequenceStep = 9;
  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print(sequenceStepText[sequenceStep]);
}

void countTurns() {
	motor.setSpeed(speed);
	if (direction) {
		motor.forward();
	} else {
		motor.backward();
	}
	boolean readVal;
	while(true) {
    readVal = digitalRead(IN_D6);
    if (!readVal && state){
      if (direction) {
        turns--;
      } else {
        turns++;
      }
      state = false;
      lcd.setCursor(0,1); 
      lcd.print("      ");
      lcd.setCursor(0,1); 
      lcd.print(turns);
    }
    if (readVal != 0) {
      state = true;
      break;
      
    }
  }
}

6 posts - 5 participants

Read full topic


Viewing all articles
Browse latest Browse all 15287

Trending Articles