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