Meerdere drukknoppen Arduino

Allereerst mijn vorige topic: https://www.circuitsonline.net/forum/view/138659

Ik denk dat ik beter hier kan verder gaan?

Misschien dat er hier wel geintresseerden zijn onder jullie.

Ik heb dus ondertussen de HT12E ic's ontvangen en kunnen inlezen met de arduino zonder de HT12D.

Ik heb er een UTP kabel van +/- 120m tussen geplaatst en het signaal op 1 draad gezet naar de arduino toe. Wederom leest de arduino dit perfect.

Ik heb wel gemerkt dat je best een diode op de DOUT van de HT12E plaatst want anders krijg je foute waarden.

Wat er nu rest is nog een "mooie" code schrijven en het systeem verder testen.

Mijn programmeer kunsten heb ik geleerd in het middelbaar onderwijs en dat is ondertussen toch al 16 jaar geleden. Verwacht hier dan nog maar een paar vragen.

Eerste vraag:

Ik gebruik gewoon drukknoppen, en deze hebben 2 functies. Ofwel licht ON/OFF, ofwel ON bij het indrukken OFF bij het loslaten.

De ON/OFF functie werkt perfect.
De ON functie blijft hangen. Het lijkt alsof hij de laatste gelezen DATA waarde blijft onthouden...

De getallen zijn binaire waarden naar dec omgezet.

Ik hoop dat mijn uitleg een beetje duidelijk is...

Edit: Volgens mij blijft de DATA waarde onthouden in de Library...

c code:

/*---

 HT12E.cpp
 HT12E Support for Arduino
 The purpose of this library is to enable your Arduino to receive commands remotely
 from a HT12E-driven device or control.  
 Note  : make sure HT12E is operating at 3~4kHz clock range
 Author: Marcelo Shiniti Uchimura
 Date  : Sep '13
 
---*/

#include "HT12E.h"

HT12E::HT12E(int pin, unsigned int addrMask)
{
 _pin = pin;
 pinMode(_pin, INPUT);
 _data = 0;
 _mask = addrMask << 4;  // the HT12E basic word is a stream with an 8-bit address
                         // followed by 4-bit data. I left shift the
                         // address mask 4 bits so I can match it to the entire word
}

int HT12E::read()
{
 return _data; 
}

int HT12E::error()
{
 uint8_t temp = _flags;
 _flags = 0;
 return temp & B00001111;   // LSB of _flags is the error flag
}

uint8_t HT12E::maskMatchesIncomingData()
{
 if((_data & _mask) < _mask)
 {
   _flags |= B1000;
   return 0;
 }
 return 1;
}

uint8_t HT12E::dataStreamAvailable()
{
 uint8_t ctr;
 
 /* let's get the address+data bits now */
 for(_data = 0, ctr = 0; ctr < DATASIZE; ++ctr)
 {
   _dur = pulseIn(_pin, HIGH);
   if(_dur > 250 && _dur < 333)        // if pulse width is between 1/4000 and 1/3000 secs
     {
     _data = (_data << 1) + 1;         // attach a *1* to the rightmost end of the buffer
   }
   else if(_dur > 500 && _dur < 666)   // if pulse width is between 2/4000 and 2/3000 secs
   {
     _data = (_data << 1);             // attach a *0* to the rightmost end of the buffer
   }
   else
   {
     _flags |= B0100;
     return 0;
   }
 }
 
 return 1;
}

uint8_t HT12E::syncBitGone()
{
 /* now wait until sync bit is gone */
 for(uint8_t ctr = 0; ctr < MAXTRIES; ++ctr)
 {
    if(digitalRead(_pin) == LOW) 
      return 1;
    delayMicroseconds(80);
 }
 
 _flags |= B0010;
 return 0;
}

uint8_t HT12E::pilotStreamAvailable()
{
 /* look for HT12E basic word's pilot stream */
 for(uint8_t ctr = 0; ctr < MAXTRIES; ++ctr)
 {
   while(digitalRead(_pin) == LOW);                // wait for the signal to go HIGH
   
   _dur = pulseIn(_pin, LOW);

   if(_dur > 9000 && _dur < 12000) 
     return 1;          // 36x(clock tick interval)
 }
 
 _flags |= B0001;
 return 0;
}
 
int HT12E::available()
{
 _flags = 0; // initializes error handling reference
 
 if (pilotStreamAvailable()
   &&  syncBitGone()
   &&  dataStreamAvailable()
   &&  maskMatchesIncomingData())
 {  
   _data ^= _mask;
   return 1;
 }
 
 _data = 0;
 return 0;
}

c code:

#include <HT12E.h>

HT12E remoteControl(7, B00000000); /* the incoming stream is tied to pin 7, and the address mask is the binary 01111111 */

const int ledPin1 = 8;
const int ledPin2 = 9;
const int ledPin3 = 10;
int state1 = LOW;
int state3 = LOW;
int data;
 
void setup()
{
 Serial.begin(9600);
 pinMode (ledPin1,OUTPUT);
 pinMode (ledPin2,OUTPUT);
 pinMode (ledPin3,OUTPUT);
}

void loop()
{
 
    if (remoteControl.available() > 0)
      {
        data = 0;
        Serial.println("Test");
        Serial.println(data);
        data = remoteControl.read();
        Serial.println("I have just received the following data stream: ");
        Serial.println(data);
      } 
 
    else
      {
        switch (remoteControl.error())
          {
              case 0:
                  break;
              case 1:
                  Serial.println("Failure when waiting for a pilot stream");
                  break;
              case 2:
                  Serial.println("Failure when waiting for sync bit to go away");
                  break;
              case 4:
                  Serial.println("Failure when waiting for a data stream");
                  break;
              case 8:
                  Serial.println("Data mask does not match predefined address mask");
                  break;
              default:
                  Serial.println("Unknown error occurred");
              break;
          } 
      }

     
     
     if (data == 4078) 
        {
          if (state1 == LOW)
            {
            state1 = HIGH;
            digitalWrite(ledPin1,state1);
            delay(500);         
            }
          else
            {
            state1 = LOW;
            digitalWrite(ledPin1,state1);
            delay(500);
            }
        }

      if (data == 2043) 
        {
          if (state3 == LOW)
            {
            state3 = HIGH;
            digitalWrite(ledPin3,state3);
            delay(500);         
            }
          else
            {
            state3 = LOW;
            digitalWrite(ledPin3,state3);
            delay(500);
            }
        }
      
 
   
  
     
      if (data == 4077)
        {
         digitalWrite(ledPin2,HIGH);
         
        }
      else
        {
         digitalWrite(ledPin2,LOW);  
         
        }

  
  
  Serial.println("Test2");
  Serial.println(data);

}

[Bericht gewijzigd door Zjokkeh op 15 november 2017 14:22:59 (30%)]