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

Oi AFS, bom dia.

Eu gostaria muito de te ajudar, 

mas tem 2 problemas:

1o. O seu código não está nada comentado, o que me daria muito trabalho de entender o funcionamento

      do mesmo e o  porque de cada linha dele.

2o. Como você postou om código direto na área de texto do post, ele perde a identação, e fica muito mais

     difícil de analisar as "funções", os"ifs" "else", etc.

Caso voce resolva, comenta-lo adequadamente, post como arquivo anexado ou em site como o pastbin.com,

e eu tentarei te ajudar.

Caso não entenda o termo "identação", leia o meu post em:

http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

Att.

Rui

Bom dia Rui eu comentei o código ele funcionada da seguinte forma quando e acionado o botão ele liga o relé e começa a contar um tempo já determinado e se caso o arduino for desconectado da energia ele grava o tempo onde parou e quando o arduino voltar a ser ligado ele começa a rodar o tempo apartír do memento onde ele foi desligado o que eu quero fazer e colocar um botão que serviria de emergência se ele fosse acionado o programa seria reiniciado e se eu quiser voltar a ligar o relé novamente partiria tudo do zero novamente e queria criar uma outra parte no código que será para ligar outro relé mais esse outro relé só poderia ser ligado se não estiver sendo contado o tempo. 

Anexos

Olá Àtila eu lendo o seu post nao entendi muita coisa pois estou com duvida poderia me esclarecer por favor a primeira pergunta e sobre se seu programa tem que comecar com o rele ligado e porque se ele tem que ligar no inicio tambem ficaria ligado sempre a parte esquisita e que se for assim quando voce mandar ligar ele ja esta ligado e portanto sempre fica ligado outra pergunta e sobre o tempo estipulado porque eu nao entendi se e em segundos ou minutos porque diz que e em minutos e o numero e muito grande entao daria algumas horas e como eu nao achei onde voce usa o numero fiquei sem saber o que e de verdade tambem tem outro ponto acho que talvez pode ser que mais ou menas seria complicado entender o seu codigo porque naum tem nada dizendo o que que esta acontecendo em cada pedaco dele desculpa ta eu tentei ajudar valeu

Bom dia Celso eu comentei o código e fiz um comentário de como o código funciona no que eu respondi ao Rui

Bom dia Celso eu comentei o código e postei ele novamente junto com uma explicação do que o código faz no que eu respondi o Rui a e o tempo e em minutos aqui você pode estipular o tempo que você quer MY_SETPOINT_IN_MINUTES 1 //2 minutos

Olá Àtila, Nunca vi usar operacao matematica no define o compilador nao reclama outra coisa tambem percebi que foi definido debug1 e tem lugar que esta usando debug o que pode causar erro outra coisa e que acho que voce nao leu minhas duvidas o qual nao consta na explicacao que deu ao Rui por favor ainda nao consegui entender a coisa toda seria melhor voce comentar sobre o codigo no proprio codigo porque ai a gente poderia entender o que voce pretende fazer em cada trecho entende lembre-se que ao cortar a energia o arduino nao e capaz de fazer nada pois para de funcionar imediatamente e tambem na logica voce tem que entender que as coisas nao comecam do meio e portanto normalmente analizamos a logica comecando pelo inicio espero que tenha entendido agora valeu boa sorte

Boa tarde Celso me desculpe por ter passado uma informação que não ficou clara no código quando o arduino e desliga da energia ele grava a posição em que ele estava contando na eeprom para que quando o arduino voltar a ser energizado novamente ele contar o restante do tempo boa tarde muito obrigado pela sua atenção

esse debug1 não sei ao certo o que ele faz pois o pessoal do site arduino.cc que me ajudaram a chegar nesse ponto em que o código esta e foram eles que adaptaram esse debug1

Quando desliga da energia, o arduino não faz nada!

Eu sei o que acontece no código e que ele grava a contagem no momento da interrupção e quando e ligado novamente ele inicial a contagem de onde foi que parou

Sr ÀFS, bom dia.

Acho que um dos problemas de seu código não funcionar, é que nestas duas linha

do setup:

eepromAddr = EEPROM.read(EEPROM_ADDR) 8;
eepromAddr = EEPROM.read(EEPROM_ADDR+1);

você sobrepõe o valor lido na primeira linha com o valor lido na segunda linha.

Acho que elas devriam ser assim:

eepromAddr = EEPROM.read(EEPROM_ADDR) 8;
eepromAddr |= EEPROM.read(EEPROM_ADDR+1);

concordo com o SEI, qdo ele disse: 

Nunca vi usar operação matemática no define o compilador.

portanto aconselho a você a usar assim: 

#define CLOCK_TIMER 60000UL

Uma terceira observação,

mande consertar ou troque seu teclado.

Verifiquei que seu teclado não digita .(ponto) e , (virgula), e outros sinais,

e do jeito que o seu texto está escrito, é muito difícil entende-lo, pela falta

destes sinais

Rui

Caro Àtila,

Ainda estou meio confuso com a lógica do programa pois:

1 - O código não está identado;

2 - O código não tem comentários;

3 - Sua explicação sem pontos e vírgulas é difícil de entender;

4 - Não sei se o botão de emergência deveria ser normalmente aberto ou normalmente fechado e o que exatamente significa "voltar ao início".

Somente assim, terei condições de ajudá-lo.

Se possível, corrija no post, assim poderemos ter todas as informações em apenas um lugar.

Muito obrigado,

  'Eiju

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço