Bom dia pessoal estou com um problema com esse código eu fiz uma parte do código que erá para servi como um botão de emergência que se fosse acionado ele iria voltar o programa para o inicio e se teria que ligar o relé outra vez mais quando aciono o botão emergência ele para como estou querendo mais o código não esta funcionado corretamente porque o tempo estipulado não esta sendo contado corretamente pois o mesmo para o relé antes do tempo pre-determinado 

#include <EEPROM.h>

#define DEBUG1

#define MILISECONDS_IN_MINUTE 60000UL
#define MY_SETPOINT_IN_MINUTES 1 //2 minutos
#define CLOCK_TIMER (MILISECONDS_IN_MINUTE * MY_SETPOINT_IN_MINUTES)

#define EEPROM_ADDR 0x00

byte emergencia = 11;
byte EMERGENCIA = 0;
byte rele = 8;
byte BOTAO = 0;
byte MOTOR = 0;
byte PORTA_B = 10;
unsigned long motorStartedAt = 0;

boolean motorON = false;

byte lastState;

unsigned long motorTime;

int motorTimeWrite;

void setup()
{
Serial.begin(9600);
pinMode(emergencia,INPUT);
digitalWrite(emergencia,HIGH);
pinMode(PORTA_B, INPUT);
digitalWrite(PORTA_B,HIGH);
pinMode(rele, OUTPUT);
digitalWrite(rele,LOW);

lastState = EEPROM.read(EEPROM_ADDR);
#ifdef DEBUG1
Serial.print("Last state: ");
Serial.println(lastState);
#endif

if (lastState == 1) {
motorTime = EEPROM.read(EEPROM_ADDR+1) 8;
motorTime = EEPROM.read(EEPROM_ADDR+2);
motorTime *= 1000UL;
#ifdef DEBUG1
Serial.print("Motor Time: ");
Serial.println(motorTime);
#endif
}

}

void loop()
{
EMERGENCIA = digitalRead(emergencia);
BOTAO = digitalRead(PORTA_B);

if ((BOTAO == LOW || lastState == 1) && !motorON && EMERGENCIA == 0)
{
digitalWrite(rele,HIGH);
motorStartedAt = millis();
motorON = true;

if (lastState != 1) {
motorTime = CLOCK_TIMER;
lastState = 1;
EEPROM.write(EEPROM_ADDR, lastState);
#ifdef DEBUG
Serial.print("Last state: ");
Serial.println(lastState);
#endif
}
else {
motorTime = EEPROM.read(EEPROM_ADDR+1) 8;
motorTime = EEPROM.read(EEPROM_ADDR+2);
motorTime *= 1000UL;
}
}

if(motorON == true && (millis() - motorStartedAt )>= motorTime)
{
digitalWrite(rele,LOW);
motorON = false;

lastState = 0;
EEPROM.write(EEPROM_ADDR, lastState);

#ifdef DEBUG1
Serial.print("Last state: ");
Serial.println(lastState);
#endif
}

if(motorON == true && (millis() - motorStartedAt) % 1000 == 0)
{
motorTimeWrite = (motorTime - (millis() - motorStartedAt)) / 1000;

#ifdef DEBUG
Serial.print("Motor Time Write: ");
Serial.println(motorTimeWrite);

Serial.println(motorTimeWrite>>8 & 0x00FF);
Serial.println(motorTimeWrite & 0x00FF);
#endif

EEPROM.write(EEPROM_ADDR+1, motorTimeWrite>>8 & 0x00FF);
EEPROM.write(EEPROM_ADDR+2, motorTimeWrite & 0x00FF);
}
if(EMERGENCIA != 0){
digitalWrite(rele,LOW);
motorON = false;
lastState = false;
}

}

se alguém puder me ajudar fico grato

Exibições: 639

Responder esta

Respostas a este tópico

Boa tarde o botão de emergência seria normalmente fechado, ele iria interromper a contagem, caso ele fosse aberto. A porta do botão vai receber o valor 0 , pois ligo o botão com o gnd. Celso me desculpe, pelos erros de português, você e o Rui sei que a intenção sua e do Rui é de ajudar, e eu agradeço desde já e peço mil desculpa a vocês.

Boa tarde Rui, vou testar aqui e mudar essa parte no código, a e me desculpa os erros de português e muito obrigado pela ajuda que você tem me dado, muito obrigado mesmo.

Sem problema Àtila.

Se ainda tiver dificuldade, por favor, siga as minhas recomendações que será mais fácil para gente te ajudar.

Oi AFS, bom dia,

não entendi muito bem qual deverá ser o funcionamento do seu código,

por isto não consigo saber se ele está funcionando corretamente.

Recomendo você à completar a descrição que tentei fazer com base no texto que você postou.

Também não sei se você pretende continuar programando outros código.

Caso pretenda, faça o uso de de comentários e de identação, para facilitar o seu próprio

entendimento do código, e quando precisar de ajuda, facilitará o trabalho de que estiver ajudando.

Outra observação.

Veja que ao postar o seu código na área de texto do post, os símbolos de  "(shift left)"  desapareceram do código, o que causará erros na compilação do mesmo.

Segue código comentado e identado.

Att.

Rui

Anexos

Bom dia Rui, segui o seu exemplo e fiz modificações no código.
Coloquei, o relé e o botão de emergência, mas tem algo de errado, hora a contagem e feita como o determinado, hora a contagem e interrompida antes do tempo determinado .
A definição #define CLOCK_TIMER (MILISECONDS_IN_MINUTE * MY_SETPOINT_IN_MINUTES) seria para determinar o valor do tempo, caso o setpoint fosse alterado, assim poderia determinar o tempo a ser contado.

Segue código comentado e identado.

Att.

Àtila

Anexos

ÃFS, bom dia,

erro   

Access Denied

ao tentar baixar seu arquivo.

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço