Bem, a cada minuto que passa me esbarro em duvidas e novidades e acabo aprendendo um pouco mais de arduino..

duvida da hora:

estou usando a biblioteca Timer1 como um contador ... esta dando tudo certo, criei uma variavel contador que começa a somar +1 se uma condicional definida no inicio do programa estiver em ON.

blz ta funcionando, qdo o sensor detecta, ela começa a contar... tudo que coloco pra fazer qdo chega no ponto de contagem estavelecido acontece., porem coloquei um botao para ser pressionado no loop, para desativar o sistema e zerar essas leituras, mas nada acontece... ou seja, parece que tudo que eu defino em outras funções nao vai pra dentro do loop... é isso? tem alguma solução?

valeu pela força

Exibições: 304

Responder esta

Respostas a este tópico

Se entendi vc fez uma variável local na sua função. Ela é temporária, a memoria é alocada e liberada a cada entrada na função.

Para ser uma variável global vc precisa criar ela no programa principal.

Vide:

http://arduino.cc/en/Reference/scope

mas é ai q ta, eu defini ela no global, antes do setup... mas os dados que peço para serem modificados nela nas funções parece q nao estao mantendo sacou? vo te mostrar o que é:

//Bibliotecas

#include <EEPROM.h>
#include <Keypad.h>
#include <TimerOne.h>


//variaveis e constantes



char dooropen [4] = {'0', '0', '0', '0'}; //Senha para abrir porta

int sirene = A1;
int speakerPin = A5;
//LEDS
int zona1 = A2;
int zona2 = A3;
int zona3 = A4;
int led13 = 13; //alarme ligado
int led12 = 12; // led saida rele F
int led11 = 11; // led zona 3
int led10 = 10; // led zona 2
int led9 = 9; // led zona 1
int z1 = 0;
int z2 = 0;
int z3 = 0;
int deteccaoalarme = 0; //condicional se alarme detectou movimento ou abertura portas
int alarmedisparado = 0; //condicional para o disparo da sirene
int alarmearmado = 1; //condicional de alarme ativado e monitorando
int count = 0; //Contador de uso geral
char state = 1; // estado das condições do teclado
int contador = 1; // timer de disparo do alarme
const byte ROWS = 4;// 4 linhas.
const byte COLS = 3;// 3 colunas.
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5};
byte colPins[COLS] = {4, 3, 2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//SETUP
void setup() {
Serial.begin(9600); //Inicializa a comunicação serial a 9600 bps

//Deifinição de modo dos pinos
pinMode(speakerPin, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(led11, OUTPUT);
pinMode(led10, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(sirene, OUTPUT);
pinMode(led13, OUTPUT);
pinMode(zona1,INPUT);
pinMode(zona2,INPUT);
pinMode(zona3,INPUT);
pinMode(door,OUTPUT);

Timer1.initialize(1000000);
Timer1.attachInterrupt(esperaalarme);


}

//timer do alarme
void esperaalarme() {
Serial.println(contador);         //esses serial print coloquei para analisar os dados das variaveis enquanto corre o timer1
Serial.println(deteccaoalarme);
Serial.println(alarmedisparado);
Serial.println(alarmearmado);
Serial.println();
if (deteccaoalarme==1) {
contador++;
}
if (contador > 10){
digitalWrite(led9,HIGH);
digitalWrite(led10,HIGH);
digitalWrite(led11,HIGH);
digitalWrite(led12,HIGH);
digitalWrite(sirene,HIGH);
alarmedisparado==1;   // aqui q esta o problema, essa variavel nao esta mudando 

}
}


void loop(){

//disparo do alarme
if (contador > 10) {            //repeti aqui para ver se funcionava mas deu na mesma
alarmedisparado==1;      // idem
}

//condicional da sirene, mas como a variavel citada nao muda, nada acontece....
if (alarmedisparado==1) {
digitalWrite(sirene,HIGH); }
else {
digitalWrite(sirene,LOW);}

obs essa parte aqui coloquei so pra ver se tava funcionando, nao vai ficar pra nao ter inconsistencia dos dados.

digitalWrite(led9,HIGH);
digitalWrite(led10,HIGH);
digitalWrite(led11,HIGH);
digitalWrite(led12,HIGH);
digitalWrite(sirene,HIGH);

Olá.

Seu problema está na própria linha de comando. Você está usando "==" (dois sinais de igual) ao invés de "=" (apenas um).

Você deve usar dois nas comparações. Nas atribuições apenas um.

Tenta aí e coloca o resultado.

Espero ter ajudado.

Luis paulo realmente era isso, valeu pela força nao sabia dessa diferença... assim que eu finalizar o projeto, que ja esta quase, posto pra galera.

O problema é mais embaixo, veja bem:

você declarou uma int, são dois bytes, 

int alarmedisparado;

quando uma variável é alterada por uma interrupção, ela deve ser do tipo volatile, assim cada vez que for acessada, ela tem de ser obrigatoriamente carregada/salva na memoria, deixando como está ela entra no stack e o compilador pode assumir que ela não mudou em alguma comparação.

Porque usar int se é só 0 ou 1 que vai a ela? Use:

volatile byte alarmedisparado;

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço