Olá pessoal, estou aqui pedindo ajuda mais uma vez,

Estou criando algumas funções que lê meus sensores exemplo:

sensor de ima 1

sensor de ima 2

sensor ldr 1

sensor ldr 2

Cada um tem um estado 0 ou 1 e preciso de alguma forma saber quando tiver alguma alteração:

A função abaixo lê os sensores redswitch e baseado nas saidas ele vai gerar uma mensagem.

//le os valores para os reed switch
void funcaoREED(){
      //le os valores das portas
      int VALREED1 = digitalRead(REED1);
      int VALREED2 = digitalRead(REED2);

      //printa no cristal

      lcd.setCursor(0,0);
      lcd.print("PORTA 1 ");
      if ( VALREED1 == 0 ) {
         lcd.print("OPEN ");
         FREED1 = 0;
      } else {
         lcd.print("CLOSE ");
         FREED1 = 1;
      }
      lcd.setCursor(0,1);
      lcd.print("PORTA 2 ");
      if ( VALREED2 == 0 ) {
         lcd.print("OPEN ");
         FREED2 = 0;
      } else {
        lcd.print("CLOSE ");
        FREED2 = 1;
      }
}

Tentei concatenar as saidas como string tipo String str; str += FREED1; str += FREED2;

A saida é 00, mas quando ele le de novo ele soma 0000 e assim vai 000000

Pensei em fazer isso para os outros sensores então eu teria uma saida como 0011 e se mudasse um numero, eu saberia que teve mudança e enviaria a mensagem com a nova informação.

Como posso fazer? Alguém tem alguma idéia?

Obrigado pessoal

E espero que tenha dado pra entender;;;rsrs

Exibições: 501

Responder esta

Respostas a este tópico

Se você quiser ler informações de um LDR terá que utilizar um analogRead usando o conceito de PWM (Pulse Width Modulation) que obter resultados analógicos em meios digitais. Os pinos digitais do Arduino com o til (~) tem suporte ao PWM, sáo eles 11, 10, 9, 6, 5, e 3.

Segue exemplo básico

int piezoPin = 8;   // Piezo no pino 8
int ldrPin = 0;     // LDR no pino analógico 0
int ldrValue = 0;   // Valor lido do LDR
int ledPin = 9;     // pino do led

void setup() {
  pinMode(ledPin, OUTPUT);
  // nada a ser feito aqui
}  // end setup()

void loop() {
  ldrValue = analogRead(ldrPin);    // lê o valor do LDR
  tone(piezoPin, 1000);             // toca um tom de 1000 Hz do piezo
  digitalWrite(ledPin, HIGH);       // ascende o led
  delay(25);                        // espera um pouco
  noTone(piezoPin);                 // interrompe o tom
  digitalWrite(ledPin, LOW);       // apaga o led
  delay(ldrValue);                  // espera a quantidade de millisegundos em ldrValue
}  // end loop()

Olá Rodrigo, obrigado pela ajuda, mas não era essa a questão, sei que não expliquei direito..rsrs

Mas tenho mais 4 sensores e preciso saber se algum deles teve alteração...

então fis o seguinte...

//GUARDA OS VALORES P/ CALCULO
KEYVALORES += VALREED1;
KEYVALORES += VALREED2;
KEYVALORES += KVALLDR1;
KEYVALORES += KVALLDR2;
KEYVALORES += TEMP;
KEYVALORES += HUMI;

VALOR = KEYVALORES;
KEYVALORES = "\0";

assim o VALOR será 000000 e se algum dos sensores mudar vais ser exemplo.. 010100

assim sei que o valor atual é diferente do anterior (000000) ai tenho que enviar um aviso.

Um abraço e muito obrigado.

Sérgio

Sérgio,

neste caso voce precisa de um contador Binário 74HC595, que possui oito portas. Usei ele para controlar 8 LEDs usando apenas três pinos do Arduino. Para o seu projeto, acredito que voce terá que colocar os pinos no modo INPUT e receber os dados do CI.

Olhe um video de um projeto

http://www.youtube.com/watch?v=50BV9QGt6PQ

Veja se isso te ajuda, ah o CI é bem barato.

// Projeto 18 - dois contadores

int latchPin = 8;    // Pino conectado ao pino 12 do 74HC595 (Latch)
int clockPin = 12;    // Pino conectado ao pino 11 do 74HC595 (Clock)
int dataPin = 11;    // Pino conectado ao pino 14 do 74HC595 (Data)

void setup() {
  // define os pinos como saída
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}  // end setup()

void loop() {
  // conta de 0 a 255
  for (int i = 0; i < 256; i++) {
    // define latchPin como LOW, para permitir o fluxo de dados
    digitalWrite(latchPin, LOW);
    shiftOut(i);
    shiftOut(255-i);
    // define latchPin como HIGH, para fechar e enviar os dados
    digitalWrite(latchPin, HIGH);
    delay(50);
  }  // end for
}  // end loop()

void shiftOut(byte dataOut) {
  // Desloca 8 bits, com o bit menos significativo (LSB) sendo deslocado primeiro, no extremo ascendente do clock
  boolean pinState;
  digitalWrite(dataPin, LOW);    // deixa o registrador de deslocamento pronto para enviar dados
  digitalWrite(clockPin, LOW);
 
  for (int i = 0; i <= 7; i++) {  // para cada bit em dataOut, envie um bit
    digitalWrite(clockPin, LOW);  // define clockPin como LOW antes de enviar o bit
    
    // se o valor de DataOut e (E lógico) de uma máscara de bits forem verdadeiros, defina pinState como 1 (HIGH)
    if (dataOut & (1 i)) {
      pinState = HIGH;
    }  // end if
    else {
      pinState = LOW;
    }  // end else
    
    // define dataPin como HIGH ou LOW, dependendo de pinState
    digitalWrite(dataPin, pinState);  // envia o bit no extremo ascendente do clock
    digitalWrite(clockPin, HIGH);  
    digitalWrite(dataPin, LOW);
  }  // end for
  digitalWrite(clockPin, LOW);    // interrompa o deslocamento de dados

}  // shiftOut()

Valeu mesmo Rodrigo.

Abraços a todos.

O 74595 é um serial para paralelo, o 74166 é o paralelo para serial

Eu usei esse scretch para testar as entradas.

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço