Remote TX using NUCLEO_L152RE + AUREL RTX-MID-3V (Sub1GHz module). This SW working in conjunction of the RX part that is: Remote RX using NUCLEO_L152RE + AUREL RTX-MID-3V (Sub1GHz module)
Diff: main.cpp
- Revision:
- 0:6877fadef7d5
- Child:
- 1:c11167ef6bd1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Jan 08 01:54:02 2017 +0000 @@ -0,0 +1,338 @@ +/* + + TX for remote Thermostat + + By: www.emcu.eu + Date: 04-January-2017 + + NUCLEO-L152RE and AUREL RTX-MID-3V (433.92 MHz - mod. ASK - 3Vcc) + + AUREL RTX-MID-3V + Italian AUREL manual is here: http://www.aurelwireless.com/wp-content/uploads/manuale-uso/650201033G_mu.pdf + English AUREL manual is here: http://www.aurelwireless.com/en/radiomodem-data-transceivers/ + https://www.futurashop.it/index.php?route=product/product&filter_name=RTX-MID-3V&product_id=2788 + + CONNECTIONS from AUREL RTX-MID-3V to NUCLEO L152RE + PIN1 Antenna 17cm + PIN2 GND + PIN4 TX connected to TX on NUCLEO L152RE + PIN5 Tx/Rx connected to PA_10 on NUCLEO L152RE + PIN6 ENABLE connected to PB_3 on NUCLEO L152RE + PIN7 GND + PIN8 Analog Out not connected + PIN9 RX connected to RX on NUCLEO L152RE + PIN10 VCC connected to 3,3V on NUCLEO L152RE + + NOTE: between GND and VCC put a capacitor of 0,1uF and a second capacitor + of 10uF + + + ********** IMPORTANT IMPORTANT IMPORTANT IMPORTANT ********** + + This project use the USART for this reason you must do the below + modifications on NUCLEO-L152RE, more info are here: + http://www.emcu.it/NUCLEOevaBoards/U2andL152/U2andL152.html#USART2_for_communication_with_shield_or + + Put a jumper on SB62 and on SB63 + Remove a 0 ohm resistor from SB13 and SB14 + + ATTENTION: + After this modifications, you lost the possibility to use the virtual comm + to connect the NUCLEO to the PC . + + ************************************************************* + + + ********** EXPLANATIONS: + + Build two boards one with RX software and another with TX software. + When you press Blue button (and hold it) + on the board_TX, the green LED must turn ON, the same + on the board_RX the green LED must turn ON. + If you release the Blue button (on the board_TX) the green LED must go OFF + on both on the boards. + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + + + */ + + +#include "mbed.h" + +Serial pc(SERIAL_TX, SERIAL_RX); // tx, rx +DigitalOut RTX_DIR(PA_10); // 1 == TX 0 == RX +DigitalOut RTX_Enable(PB_3); // 1 == RTX enable 0 == RTX disable + +DigitalOut myled(LED1); // This LED is on NUCLEO-L152RE +DigitalIn BlueButton(USER_BUTTON); // This is Blue-Button and is on NUCLEO-L153RE + +#define Pressed 0 +#define NotPressed 1 +#define Enable 1 +#define Disable 0 +#define ACK 2 +#define OK 1 +#define FAIL 0 +#define Received 0 +#define NotReceived 1 + +#define ON 1 +#define OFF 0 +#define TX 1 +#define RX 0 + +#define Baud 1200 // 9600 +#define DlyForEndTX 220 // 220 +#define MaxReTX 40 // 40 +#define DebTime 200 // Debounce time +#define WaitBeforeToDoRX 200 // 100 + +int Car='\0'; +int RisultatoRX=FAIL; +int MemBlueButton=10; +int MemOkFail=FAIL; +int MemOK=FAIL; +int MemOFF=NotReceived; +int MemON=NotReceived; + +int MemBB = NotPressed; + + +int TestRX_Data(void); +void RTX_StartUp(void); +void RTX_PowerDown(void); +void RTX_PowerON(void); +void RTX_TX(void); +void RTX_RX(void); + +int CarStr[3]; +int PuntCar = 0; + +void callback() { + // Note: you need to actually read from the serial to clear the RX interrupt + Car = pc.getc(); + if (Car == '#' & PuntCar == 0) + { + PuntCar = 0; + CarStr[PuntCar] = Car; + PuntCar++; + } + else if (PuntCar > 0 & PuntCar < 3) + { + CarStr[PuntCar] = Car; + PuntCar++; + } +} + + +// +// MAIN ***************************************************************** +// +int main() +{ + int n=0; + int Rip=3; + + pc.baud(Baud); + pc.attach(&callback, pc.RxIrq); // It is for reading under Interrupt the + // RX from USART + + // Start Up of the RTX-MID and put it in RX mode + RTX_StartUp(); + + MemBB = Pressed; + MemOFF = NotReceived; + MemON = NotReceived; + + while (1) + { + // Test the status of the Blue button (TX) ************************ + if ((BlueButton == Pressed) && (MemBB == NotPressed)) + { + wait_ms(DebTime); // Debounce + if (BlueButton == Pressed) + { + MemBB = Pressed; + n=0; + while (TestRX_Data() != OK) + { + RTX_TX(); // RTX-MID on TX mode + // Send Message + pc.printf("#1@"); // Send Command ON + wait_ms(DlyForEndTX); + RTX_RX(); // RTX-MID on RX mode + wait_ms(WaitBeforeToDoRX); // 100 + for (Rip=0; Rip<40; Rip++) // 40 + { + if (TestRX_Data() == OK) + { + myled = ON; + goto EndBBpressed; + // break; + } + } + n++; + if (n > MaxReTX) + break; + } + } + // myled = ON; + wait(2); + MemBB = NotPressed; + EndBBpressed: + RTX_RX(); // RTX-MID on RX mode + } + + + if ((BlueButton == NotPressed) && (MemBB == Pressed)) + { + wait_ms(DebTime); // Debounce + if (BlueButton == NotPressed) + { + MemBB = NotPressed; + n=0; + while (TestRX_Data() != ACK) + { + RTX_TX(); // RTX-MID on TX mode + // Send Message + pc.printf("#2@"); // Send Command OFF + wait_ms(DlyForEndTX); + RTX_RX(); // RTX-MID on RX mode + wait_ms(WaitBeforeToDoRX); // 100 + for (Rip=0; Rip<40; Rip++) // 40 + { + if (TestRX_Data() == ACK) + { + myled = OFF; + goto EndBBnotpressed; + // break; + } + } + n++; + if (n > MaxReTX) + break; + } + } + // myled = OFF; + wait(2); + MemBB = Pressed; + EndBBnotpressed: + RTX_RX(); // RTX-MID on RX mode + } + + // END Test the status of the Blue button (TX) ************************ + + + + } +} + +// +// END MAIN ************************************************************* +// + + +// +// Decode Message +// +// REMEMBER: +// before to use this function must put in RX mode the RTX +// +int TestRX_Data(void) + { + int OkFail=0; // 1==OK==ON 2==ACK==OFF + + if (CarStr[0]=='#' & CarStr[1]=='1' & CarStr[2]=='@') + OkFail=1; // OK==ON + else if (CarStr[0]=='#' & CarStr[1]=='2' & CarStr[2]=='@') + OkFail=2; // ACK==OFF + else; + + if (PuntCar >= 3) // Reset the CarStr & PuntCar + { + CarStr[0] = '0'; + CarStr[1] = '1'; + CarStr[2] = '2'; + PuntCar = 0; + } + + return OkFail; + } + +void RTX_StartUp(void) + { + RTX_Enable = Disable; + wait_ms(10); + RTX_Enable = Enable; + wait_ms(1); + RTX_DIR = TX; // RTX-MID in TX mode + wait_ms(1); // Wait the stabilizzation of the transceiver + RTX_Enable = Disable; + wait_ms(10); + RTX_Enable = Enable; + wait_ms(1); + RTX_DIR = RX; // RTX-MID in RX mode + wait_ms(1); // Wait the stabilizzation of the transceiver + RTX_Enable = Disable; + wait_ms(1); + RTX_Enable = Enable; + wait_ms(1); + } + +void RTX_PowerDown(void) + { + RTX_Enable = Disable; + wait_ms(10); + } + +void RTX_PowerON(void) + { + RTX_Enable = Disable; + wait_ms(1); + } + +void RTX_TX(void) + { + // RTX_Enable = Disable; + // wait_ms(10); + // RTX_Enable = Enable; + // wait_ms(1); + RTX_DIR = TX; // RTX-MID in TX mode + wait_us(400); // Wait the stabilizzation of the transceiver + } + +void RTX_RX(void) + { + // RTX_Enable = Disable; + // wait_ms(10); + // RTX_Enable = Enable; + // wait_ms(1); + // RTX_DIR = TX; // RTX-MID in TX mode + // wait_ms(1); // Wait the stabilizzation of the transceiver + RTX_DIR = RX; // RTX-MID in RX mode + wait_us(40); + RTX_Enable = Disable; + wait_us(20); + RTX_Enable = Enable; + wait_us(200); + } + + \ No newline at end of file