klaytonboy10 escreveu:Então cansei até que já tentei, o problema é que sempre que tento incluir uma nova rotina , interfere e da erro no programa todo. Por isso que te peço pra você me disponibilizar pois você conhece o programa todo e sabe adicionar as rotinas certas que não interfere no programa todo. Então peço só mais está, que se possível você disponibilize pra mim.
Então, o problema é que vc ta começando do jeito mais difícil.klaytonboy10 escreveu:Cansei pelo que entendi no link que você me mandou ele ativa o led quando aperta no botao. Parece com o que eu quero, porém preciso que ative o led só depois que fique precionado por no mínimo 5segundos, e além disso queria que aparecesse a mensagem de água baixa no tid.
A primeira coisa que vc precisa fazer é criar um novo programa do zero no arduino só pra testar essa parte de detectar o nível da água. A partir do momento que vc elaborou o código e viu que ta funcionando do jeito que vc quer, aí sim vc se preocupa em adicionar ele no programa do computador de bordo.
Eu vou quebrar seu galho dessa vez mas só na primeira parte. Eu peguei o código do tutorial do site do arduino e alterei pra fazer o que vc quer:
Código: Selecionar todos
// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
int ArrayNivelReservatorio[5] = {0,0,0,0,0};
byte IndiceNivReservatorio, NivelReservatorio;
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// subtrai a leitura do ciclo anterior
NivelReservatorio = NivelReservatorio - ArrayNivelReservatorio[IndiceNivReservatorio];
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH)
{
//Se leitura = High, grava informação numa lista de que o nível do reservatório está OK
ArrayNivelReservatorio[IndiceNivReservatorio] = 0;
}
else
{
//Se leitura = Low, grava informação numa lista de que o nível do reservatório está baixo
ArrayNivelReservatorio[IndiceNivReservatorio] = 1;
}
// adiciona a leitura no total
NivelReservatorio = NivelReservatorio + ArrayNivelReservatorio[IndiceNivReservatorio];
IndiceNivReservatorio++;
if (NivelReservatorio == 5)
{
//Se soma das leituras for igual a 5, significa que todas as leituras deram nível baixo. Assim, acionamos o led
digitalWrite(ledPin, HIGH);
//Mostra aviso no TID
//mydisplay.display_message("Nivel baixo",254);
}
if (IndiceNivReservatorio == 5)
{
IndiceNivReservatorio = 0;
}
delay(1000);
}
A partir do momento que vc fez isso e deu certo, aí sim é hora de juntar os dois programas. Como vc faz isso? Aqui eu vou deixar nas suas mãos mas vou te dar as instruções pq é fácil.
A primeira coisa que vc vai fazer é copiar o arquivo .ino desse programa e jogar na mesma pasta do programa do computador de bordo. Abra a IDE do Arduino que vc vai ver que na parte superior vai ter duas abas, uma com o código do computador de bordo e outra com o programa acima. Agora os dois programas estão formando um só.
Todas as declarações de variáveis existentes no programa acima vc vai tirar e vai colar no programa do computador de bordo junto com as declarações existentes.
O conteúdo do "void setup" do programa acima, ou seja, os pinMode, vc vai tirar do programa acima e vai colocar dentro do "void setup" do programa do computador de bordo. Elimine por completo o "void setup" do programa acima.
O "void loop()" do programa acima vc vai renomear pra qualquer outra coisa, deixe "void nivel_reservatorio()".
Agora vem a a parte importante da integração. Vc quer uma checagem por tempo, certo? Dentro do programa do computador de bordo existe uma rotina que roda sempre que é a "coisas_a_fazer_sempre()", e dentro dela tem uma subrotina que roda a cada segundo. Vc vai colocar "nivel_reservatorio();" sem aspas, logo abaixo do trecho:
Código: Selecionar todos
if (intervaloSecsC >= 1)
{
zera_intervalo_C();
Código: Selecionar todos
if (intervaloSecsC >= 1)
{
zera_intervalo_C();
nivel_reservatorio();
Vc vai precisar fazer ajustes depois, como remover o delay(1000); que eu deixei no programa acima, além de descomentar o "mydisplay.display_message("Nivel baixo",254);" pra poder aparecer a mensagem de nível baixo no TID. Vai ter outros ajustes menores pra fazer e depois a gente discute elas mas o grosso ta aí.