123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #include "queue.h"
- boolean disableRx = true;
- const int rxPinA = 7; // RX, Connected to pin 7
- const int enablePin = 4; // Enable, Connected to RTX pin 6: 0=Power down, 1=Active
- const int txEnablePin = 5; // rx/TX, Connected to RTX pin 5: 0=Rx, 1=Tx
- const int txPin = 6; // TX, Connected to RTX pin 4
- //********************************************************************
- // SETUP
- //********************************************************************
- void setup() {
-
- disableRx = true;
- pinMode(rxPinA, INPUT);
- pinMode(enablePin, OUTPUT);
- pinMode(txEnablePin, OUTPUT);
- pinMode(txPin, OUTPUT);
-
- digitalWrite(enablePin, LOW);
- digitalWrite(txEnablePin, LOW);
- digitalWrite(txPin, LOW);
-
- // ------------------ INIT THE TRANCEIVER -------------------------
- // From powerdown mode (pin 4-5-6 low),
- // 1. Drive high pin 6 (ENABLE)
- // 2. After 20us drive high pin 5 (RX/TX)200us, hold on 40us
- // 3. Drive down 20us pin 6 (ENABLE).
- digitalWrite(enablePin, HIGH); delayMicroseconds( 20 );
- digitalWrite(txEnablePin, HIGH); delayMicroseconds( 200 ); digitalWrite(txEnablePin, LOW);
- delayMicroseconds( 40 );
- digitalWrite(enablePin, LOW); delayMicroseconds( 20 ); digitalWrite(enablePin, HIGH);
- delayMicroseconds( 200 );
- // ------------------ INIT THE TRANCEIVER -------------------------
-
- Serial.begin(9600); // USB Serial
- rcvInitQueue();
-
- cli(); // Clear interrupt
- setup_timer_interrupt();
- sei(); // Enable interrupt
-
- disableRx = false;
- }
- //********************************************************************
- // INTERRUPT FUNCTIONS
- //********************************************************************
- void setup_timer_interrupt()
- {
- //set timer1 interrupt at 10Hz
- TCCR1A = 0;// set entire TCCR1A register to 0
- TCCR1B = 0;// same for TCCR1B
- TCNT1 = 0;//initialize counter value to 0
- // set compare match register for 1hz increments
-
- // OCR1A = 40. This results is 16MHz / 8 / 40 = 20 uS between interrupts
- OCR1A = 40;
- // turn on CTC mode
- TCCR1B |= (1 << WGM12);
- // Set CS12:CS10 to 010 = /8 prescaler
- TCCR1B |= (1 << CS11);
-
- // enable timer compare interrupt
- TIMSK1 |= (1 << OCIE1A);
- }
- // 10uS timer interrupt function
- ISR(TIMER1_COMPA_vect,ISR_NOBLOCK) {
-
- static unsigned char currValue = 0;
- static unsigned short samples = 0;
- static unsigned short newSamples = 0;
-
- //return; // FOR DEBUG, Disables nexa receive
- // Sample the pin value
- unsigned char value = digitalRead(rxPinA);
- if( value == currValue ) {
- samples++;
- samples+=newSamples;
- newSamples=0;
- }
- else {
- newSamples++;
- }
- if( newSamples == 3 ) {
- uint16_t queSamples = (uint16_t)((samples*20 > 60000)? 60000 : samples*20);
- rcvEnQueue(queSamples); // Max 46000
- samples = newSamples;
- newSamples = 0;
- currValue = value;
- }
- }
- void stopInterrupts() {
- EIMSK &= 0xFC; // Clear bit 1:0 in Enable Interrupt register
- }
- //********************************************************************
- // LOOP
- //
- // Test-code: <NT1B5C1D83>
- //********************************************************************
- #define SER_RX_MODE_WAIT 0
- #define SER_RX_MODE_RCV 1
- #define SER_RX_MODE_END 2
- extern unsigned long x_data; // Receive data from Nexa
- extern unsigned long temp1_x_data; // Receive data from temp1
- void loop() {
-
- static int rxMode = SER_RX_MODE_WAIT;
- static int rxNum = 0;
-
- static unsigned long last_rx_time = 0;
-
- static unsigned char txDataReady = 0;
-
- static unsigned long previous_nexa_x_data = 0;
- static unsigned long nexa_old_time=0;
-
- static unsigned long previous_temp1_x_data = 0;
- static unsigned long temp1_old_time=0;
-
- //static boolean firstRun = true;
- static uint16_t width;
-
- static unsigned long txCode = 0;
-
- static unsigned long previous_now = 0; // Get the current time
- unsigned long now = millis(); // Get the current time
-
- // Check millis() for wrapping (after 49 days)
- if( previous_now > now ) {
- last_rx_time = 0; // Reset last rx time
- }
-
- // Display version information 10 sec after startup
- /* if( firstRun == true && now > 30000 ) {
- Serial.println("433MHz Repeater module. (Arduino nano) Ver: 170211 14:46"); // **** VERSION ****
- firstRun = false;
- } */
-
- if( rcvDeQueue(&width) ) {
-
- // ********** NEXA ***********
- if( nextPulseNexa(width) ) {
-
- last_rx_time = now; // Set last rx time to now
-
- if( x_data != previous_nexa_x_data || now > (nexa_old_time+1000) ) {
- unsigned long remote_id = (x_data & 0xFFFFFFC0) >>6;
- int group = (x_data & 0x00000020) >>5;
- int onOff = (x_data & 0x00000010) >>4;
- int channel = (x_data & 0x0000000C) >>2;
- int button = (x_data & 0x00000003);
- //Serial.println(remote_id);
- if( ( remote_id == 11067169UL || remote_id == 20071093UL ) && txDataReady == 0 ) {
-
- remote_id++; // Increase the remote id with one ( = the real id of the nexa remote control )
- txDataReady = 1;
-
-
- txCode = ((remote_id << 6) & 0xFFFFFFC0 );
- txCode |= ((group << 5) & 0x00000020 );
- txCode |= ((onOff << 4) & 0x00000010 );
- txCode |= ((channel << 2) & 0x0000000C );
- txCode |= ((button ) & 0x00000003 );
-
- }
- previous_nexa_x_data = x_data;
- }
-
- nexa_old_time = now;
- resetDecoder();
- }
- }
-
- if( txDataReady == 1 && (now > (last_rx_time+200)) ) { // Transmit if it has passed more than 100mS since last rx
- txDataReady = 0;
- sendNexaCode(txCode);
- }
-
- previous_now = now; // Store to check for wrapping of millis()
- }
|