Buongiorno a tutti,
Ho un problema con i micro switch.. Ho creato uno sketch che muove uno stepper via bluetooth. Quando invio "H" lo stepper fa un piccolo giro in senso orario, se invio "L" invece si muove in senso antiorario.
Vorrei che lo stepper si fermasse quando il microswitch viene premuto, ma il problema è che sembra non lo riconosca.
Ho creato una variabile "buttonState" che quando è high dovrebbe accendere un led e impedire allo stepper di leggere il messaggio bluetooth e quindi di muoversi.
Il problema è che lo stepper si muove lo stesso anche se il pulsante è premuto.. mentre il led si accende invece regolarmente.
Lo stepper rare volte si ferma ma il 95% delle volte se invio i messaggi si muove comunque.
Come dovrei fare per fermarlo quando il micro switch è premuto? STo sbagliando o non ho considerato qualcosa?
Questo è il codice che sto utilizzando:
#include <SoftwareSerial.h>
#define IN1 8
#define IN2 9
#define IN3 10
#define IN4 11
#define trigPin 7
#define echoPin 8
int rxPin = 3;
int txPin = 2;
SoftwareSerial bluetooth(rxPin, txPin);
String message;
int Steps = 0;
boolean Direction = true;// gre
unsigned long last_time;
unsigned long currentMillis ;
int steps_left=4095;
long timee;
const int buttonPin = 7;
int buttonState = 0;
void setup()
{
Serial.begin(9600);
bluetooth.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(13, OUTPUT);
// delay(1000);
}
void loop()
{
buttonState = digitalRead(buttonPin);
// accende il led se lo switch è premuto
if(buttonState == 1) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
while (bluetooth.available()){
// acquisisce il dato bluetooth
message += char(bluetooth.read());
}
if(message!="") {
// se il dato è "H" e lo switch non è premuto fa un piccolo giro
if(message == "H" && buttonState != 1){
steps_left=500;
Steps = 1;
while (steps_left>0 && Steps != 9 && buttonState != 1){
Direction = 1;
currentMillis = micros();
if(currentMillis-last_time>=1000){
stepper(1);
timee=timee+micros()-last_time;
last_time=micros();
steps_left--;
}
}
Steps = 9;
}
// se il dato è "L" e lo switch non è premuto fa un piccolo giro
if(message == "L" && buttonState != 1){
steps_left=500;
Steps = 1;
while (steps_left>0 && Steps != 9){
Direction = 0;
currentMillis = micros();
if(currentMillis-last_time>=1000){
stepper(1);
timee=timee+micros()-last_time;
last_time=micros();
steps_left--;
}
}
Steps = 9;
}
}
message = "";
//Serial.println(buttonState);
}
void stepper(int xw){
if(buttonState != 1) {
for (int x=0;x<xw;x++){
switch(Steps){
case 0:
if(buttonState != 1) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
break;
case 1:
if(buttonState != 1) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
break;
case 2:
if(buttonState != 1) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
break;
case 3:
if(buttonState != 1) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
break;
case 4:
if(buttonState != 1) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
break;
case 5:
if(buttonState != 1) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
break;
case 6:
if(buttonState != 1) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
}
break;
case 7:
if(buttonState != 1) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
break;
case 9:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
default:
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
}
}
SetDirection();
}
}
void SetDirection(){
if(Direction==1){ Steps++;}
if(Direction==0){ Steps--; }
if(Steps>7){
Steps=0;
}
if(Steps<0){
Steps=7;
}
}