Ajuda no codigo arduino

Olá Pessoal,
Estou aqui de volta da programação do arduino e não estou a conseguir programar isto correcto.
Tenho aqui um Arduino Uno + sensor de corrente ACS712 + modulo 2 reles e um motor 12V DC + fonte 12V para alimentação do motor.

E o objectivo deste projecto é ao pressionar o botão continuamente este liga um modulo rele e o motor rodar num sentido até chegar ao batente e trava o motor DC. O motor para de rodar e por sua vez a corrente do motor vai subir e quando for maior que 0.5A desliga o motor. Depois assim que tiro o dedo do botão ele arranca e faz a mesma coisa mas no sentido oposto.
Esta parte já funciona bem.
Agora tenho uma nova condição, queria acrescentar no código e não consigo.
É o seguinte:
O motor arranca e se a corrente não chegar aos 0.5A o motor para passados 3 segundos.
Já tentei imensas vezes e não consigo meter isto a funcionar tudo em conjunto.
Vou deixar aqui o código que tenho até ao momento (este condigo funciona, apenas falta o tempo dos 3s até o motor para para cada sentido de rotação).
Podem me dar uma ajuda?

int pinoReleCh1 = 2; //Rele 1
int pinoReleCh2 = 3; // Rele 2
int pushbutton = 4; // Botão iniciar – ABRIR A PORTA DA CARRINHA
int button;

void setup()
{
Serial.begin(9600);
pinMode(pinoReleCh1, OUTPUT); //Saida rele 1
pinMode(pinoReleCh2, OUTPUT); //Saida rele 2
digitalWrite(pinoReleCh1, HIGH); //Rele 1 inicia desligado
digitalWrite(pinoReleCh2, HIGH); //Rele 2 inicia desligado
pinMode(pushbutton, INPUT_PULLUP);
}
///////////////////////////////////////////////////////
////////////////////L O O P ///////////////////////////
void loop()
{
checkbutton();
if (button == LOW) // Quando o Pushbutton é = 0, vai para o LOOP1()
{
loop1();
}
}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
void checkbutton()
{
button = digitalRead(pushbutton);
//Serial.println(“Valor do botão:”);
//Serial.println(button);
delay(1);
}
// LOOP1() – Abrir escadas e vai para quando a corrente for maior que 0.5A ou depois de 3 segundos de funcionamento:
void loop1()
{
digitalWrite(pinoReleCh1, LOW); //Liga o rele 1
sensor(); //Faz a leitura do sensor de corrente

}
// LOOP2() – Fechar escadas e vai para quando a corrente for maior que 0.5A ou depois de 3 segundos de funcionamento:
void loop2()
{
digitalWrite(pinoReleCh2, LOW); //Liga o rele 2
sensor2(); //Faz a leitura do sensor de corrente
}
void sensor()
{
unsigned int x=0;
float AcsValue=0.0,Samples=0.0,AvgAcs=0.0,AcsValueF=0.0;
for (int x = 0; x < 150; x++)
{
AcsValue = analogRead(A0); //Read current sensor values
Samples = Samples + AcsValue; //Add samples together
delay (3); // let ADC settle before next sample 3ms
}
AvgAcs=Samples/150.0;
AcsValueF = (2.5 – (AvgAcs * (5.0 / 1024.0)) )/0.100;
Serial.println(AcsValueF); //Print the read current on Serial monitor
delay(1);
//while (digitalRead(pushbutton) == HIGH) {}
while (AcsValueF > 0.50) // Quando a corrente for maior que 0.5A desliga o rele e passa para o Loop2() para mudar o sentido de rotação do motor
{
digitalWrite(pinoReleCh1, HIGH);
Serial.println(“Plataforma toda aberta”);
delay(1);
button = digitalRead(pushbutton);
//Serial.println(button); // Faz a leitura do botão, se for = 0
if (button == HIGH) // Pushbutton é = 0
{
loop2();
}
}
}
void sensor2()
{
unsigned int x=0;
float AcsValue=0.0,Samples=0.0,AvgAcs=0.0,AcsValueF=0.0;
for (int x = 0; x < 150; x++)
{
AcsValue = analogRead(A0); //Read current sensor values
Samples = Samples + AcsValue; //Add samples together
delay(3); // let ADC settle before next sample 3ms
}
AvgAcs=Samples/150.0;
AcsValueF = (2.5 – (AvgAcs * (5.0 / 1024.0)) )/0.100;
Serial.println(AcsValueF); //Print the read current on Serial monitor
delay(1);
//while (digitalRead(pushbutton) == HIGH) {}
while (AcsValueF > 0.50) // Quando a corrente for maior que 0.5A desliga o rele e passa para o Loop1() para mudar o sentido de rotação do motor
{
digitalWrite(pinoReleCh2, HIGH);
Serial.println(“Plataforma toda fechada”);
delay(1);
button = digitalRead(pushbutton);
if (button == HIGH) // Pushbutton é = 0
{
loop1();
}
}
}

Obrigado.

Deste imensas voltas e acho que não pensaste bem nas condições ou até estados que este sistema vai ter. Esse é o segredo, determinares os estados que vais ter e seguir por aí.

Esta não é, de todo, a solução ideal para este problema, mas deve estar perto do que pretendes se entendi bem o teu problema.

int pinoReleCh1 = 2; //Rele 1
int pinoReleCh2 = 3; // Rele 2
int pushbutton = 4; // Botão iniciar – ABRIR A PORTA DA CARRINHA
int button;

unsigned char direction = 0; // direcção de fecho. 
unsigned char startFlag = 0; 
unsigned long startTime = 0; 
unsigned char overCurrent = 0; 
#define DELAY   3000 // 3 segundos


void setup()
{
  Serial.begin(9600);
  pinMode(pinoReleCh1, OUTPUT); //Saida rele 1
  pinMode(pinoReleCh2, OUTPUT); //Saida rele 2
  digitalWrite(pinoReleCh1, HIGH); //Rele 1 inicia desligado
  digitalWrite(pinoReleCh2, HIGH); //Rele 2 inicia desligado
  pinMode(pushbutton, INPUT_PULLUP);
}
///////////////////////////////////////////////////////
////////////////////L O O P ///////////////////////////
void loop(){

float current = sensor(); // le o sensor e recebe o valor do sensor. 
button = digitalRead(pushbutton); // le o botao. 

if (button == LOW && overCurrent == 0){ // Quando o Pushbutton é pressionado
  if (startFlag == 0)
    startTime = millis(); // agora sabemos quando o botão foi pressionado.
   
  startFlag = 1; // detecta flanco e não volta a fazer a instrução acima. 
  
  //liga o pino correcto. 
  if (direction == 0) // se a direcção é de fecho. 
    digitalWrite(pinoReleCh1, LOW); //Liga o rele 
  
  if (direction == 1) // se a direcção é de abrir. 
    digitalWrite(pinoReleCh2, LOW); //Liga o rele 2
  }

  // monitoriza overcurrent e os 3 segundos 
  // se a currente ou os 3 segundos passarem, então pára os motores. 
  if (current > 0.5 || (millis() - startTime < DELAY)) { //corrente atingiu mais do que devia. 
    overCurrent = 1; // liga esta flag que vai desligar os motores. 
    if (direction == 0) direction = 1; 
    else  direction = 0; 
  }
} else {
  //desliga os relés.  
  digitalWrite(pinoReleCh1, LOW); //Liga o rele 1
  digitalWrite(pinoReleCh2, LOW); //Liga o rele 2
  startFlag = 0; // volta a zero para detectar flanco de novo. 
  overCurrent = 0; 
}


}
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
void sensor()
{
unsigned int x=0;
float AcsValue=0.0,Samples=0.0,AvgAcs=0.0,AcsValueF=0.0;
for (int x = 0; x < 150; x++){
  AcsValue = analogRead(A0); //Read current sensor values
  Samples = Samples + AcsValue; //Add samples together
  delay (3); // let ADC settle before next sample 3ms
  }
AvgAcs=Samples/150.0;
AcsValueF = (2.5 – (AvgAcs * (5.0 / 1024.0)) )/0.100;
Serial.println(AcsValueF); //Print the read current on Serial monitor
return AcsValueF; 
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.