Olá Srs!
Tinha alguns projetos passados que fizemos no nosso curso e alguns não tinham funcionado como esperado e estou retomando alguns para praticar, entender melhor a implementação de códigos e melhorar cada vez mais refazendo o que ja tentei. Este era um projeto de um tacogerador, dois motores interligados pelo eixo com um controle PID mostrando as leituras via Serial da tensão gerada com um botões para ligar e desligar. Para os experientes deve ser uma coisa extremamente simples mas para mim que está aprendendo é ainda um pouco dificil. Consegui fazer gerar as leituras de tensão mas não estou conseguindo implementar um botão liga desliga, neste ultimo codigo tentei colocar um liga e outro desliga para ver se conseguia, mas sem sucesso, alguem pode me dizer onde estou errando?
#include <PID_v1.h>
double Setpoint ; // valor de setpoint desejado
double Input; // entrada motor tacogerador
double Output ; // motor
double Kp = 0, Ki = 10, Kd = 0; //PID parametros
int BOTAO1 = 7; //Botão liga tacogerador
int BOTAO2 = 6;
int LedVerde = 8; //Led verde tacogerador on
int LedVermelho = 12; //Led vermelho tacogerador off
int IN1 = 2 ;
int estado_botao1 = 0; // Declara e inicializa variável para guardar o estado do botao1
int estado_botao2 = 0; // Declara e inicializa variável para guardar o estado do botao2
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); //cria instância PID
void setup()
{
Serial.begin(9600);
Setpoint = 150; //valor para o setpoint
myPID.SetMode(AUTOMATIC); //Liga o PID
myPID.SetTunings(Kp, Ki, Kd); //Ajusta os valores no PID
pinMode(BOTAO1, INPUT_PULLUP); //define o pino do botao como entrada "INPUT"
pinMode(BOTAO2, INPUT_PULLUP); //define o pino do botao como entrada "INPUT"
pinMode(LedVerde, OUTPUT);
pinMode(LedVermelho, OUTPUT);
pinMode(IN1,OUTPUT); //pinos motores
estado_botao1 = 0; // Atribui ao estado do botao o valor zero (botao nao premido).
estado_botao2 = 1; // Atribui ao estado do botao o valor zero (botao nao premido).
}
void loop()
{
estado_botao1 = digitalRead(BOTAO1); // Le o botao e guarda o respectivo estado numa variavel.
if (estado_botao1 == LOW) { // Verifica a variavel que tem o estado do botao.
estado_botao2 = 1;
digitalWrite(LedVerde, HIGH); // Liga LED verde se o botao estava premido.
digitalWrite(LedVermelho, LOW); // Desliga LED vermelho se o botao estava premido.
digitalWrite(3, LOW);
digitalWrite(IN1,LOW);
delay(500);
}
estado_botao2 = digitalRead(BOTAO2); // Le o botao e guarda o respectivo estado numa variavel.
if (estado_botao2 == LOW) { // Verifica a variavel que tem o estado do botao.
estado_botao1 = 1;
digitalWrite(LedVerde, LOW); // Liga LED verde se o botao estava premido.
digitalWrite(LedVermelho, HIGH); // Desliga LED vermelho se o botao estava premido.
digitalWrite(3, HIGH);
digitalWrite(IN1,HIGH);
delay(500);
}
while(estado_botao1 == 0 && estado_botao2 == 1)
{
//Lê o valor de entrada. Entrada analógica: 0 a 1024. Mapeia-se para um valor de 0 a 255 conforme é usado para função PWM.
Input = map(analogRead(0), 0, 1024, 0, 255); //definido no pino 5 analógico
//PID calculo
myPID.Compute();
//Escreve na saída calculada pela função PID
analogWrite(3, Output); //motor está definido no pino 3 pwm
digitalWrite(IN1,HIGH);
//Envie dados para plotagem
Serial.print(Input);
Serial.print(" ");
Serial.println( Output);
Serial.print(" ");
Serial.println( Setpoint);
delay(100);
}
}