Version 1.0
Initial version.
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | .pio | ||||||
|  | .vscode | ||||||
|  | .DS_Store | ||||||
							
								
								
									
										37
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,2 +1,37 @@ | |||||||
| # RF-Open-Close-Sensor | # RF open/close sensor | ||||||
|  |  | ||||||
|  | Open/close sensor on ATmega168/328 + RF24. | ||||||
|  |  | ||||||
|  | ## Features | ||||||
|  |  | ||||||
|  | 1. Power consumption in sleep mode approximately 10 μA. Up to 2 years of operation on one CR2450 battery (estimated). | ||||||
|  | 2. When triggered transmits the battery level charge and contact status (OPEN/CLOSE). | ||||||
|  | 3. Can be used with normally closed and normally open contacts. | ||||||
|  | 4. Automatic restart in case of a hang-up. | ||||||
|  |  | ||||||
|  | ## Note | ||||||
|  |  | ||||||
|  | A gateway is required. For details see "RF - ESP-NOW Gateway". | ||||||
|  |  | ||||||
|  | ## Full config example for Home Assistant | ||||||
|  |  | ||||||
|  | ```yml | ||||||
|  | mqtt: | ||||||
|  |   sensor: | ||||||
|  |     - name: "NAME" | ||||||
|  |       device_class: "voltage" | ||||||
|  |       unit_of_measurement: "V" | ||||||
|  |       state_topic: "homeassistant/rf_sensor/ID/open_close" | ||||||
|  |       value_template: "{{ value_json.battery }}" | ||||||
|  |       force_update: true | ||||||
|  |       qos: 2 | ||||||
|  |   binary_sensor: | ||||||
|  |     - name: "NAME" | ||||||
|  |       device_class: "door" | ||||||
|  |       state_topic: "homeassistant/rf_sensor/ID/open_close" | ||||||
|  |       value_template: "{{ value_json.state }}" | ||||||
|  |       payload_on: "OPEN" | ||||||
|  |       payload_off: "CLOSE" | ||||||
|  |       force_update: true | ||||||
|  |       qos: 2 | ||||||
|  | ``` | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								hardware/BOM.xlsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hardware/BOM.xlsx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								hardware/CR2450 holder.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hardware/CR2450 holder.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 57 KiB | 
							
								
								
									
										
											BIN
										
									
								
								hardware/Gerber.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hardware/Gerber.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								hardware/Plate bottom side.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hardware/Plate bottom side.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 369 KiB | 
							
								
								
									
										
											BIN
										
									
								
								hardware/Plate upper side.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								hardware/Plate upper side.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 576 KiB | 
							
								
								
									
										5124
									
								
								hardware/Schematic.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5124
									
								
								hardware/Schematic.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										131
									
								
								platformio.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								platformio.ini
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | |||||||
|  | [env:ATmega168] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega168 | ||||||
|  | board_build.mcu = atmega168 | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
|  |  | ||||||
|  | [env:ATmega168P] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega168P | ||||||
|  | board_build.mcu = atmega168p | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
|  |  | ||||||
|  | [env:ATmega168PB] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega168PB | ||||||
|  | board_build.mcu = atmega168pb | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
|  |  | ||||||
|  | [env:ATmega328] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega328 | ||||||
|  | board_build.mcu = atmega328 | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
|  |  | ||||||
|  | [env:ATmega328P] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega328P | ||||||
|  | board_build.mcu = atmega328p | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
|  |  | ||||||
|  | [env:ATmega328PB] | ||||||
|  | platform = atmelavr | ||||||
|  | board = ATmega328PB | ||||||
|  | board_build.mcu = atmega328pb | ||||||
|  | board_build.f_cpu = 8000000L | ||||||
|  | framework = arduino | ||||||
|  | upload_protocol = usbasp | ||||||
|  | build_flags =  | ||||||
|  | 	-D OPEN=1 | ||||||
|  | 	-D CLOSE=0 | ||||||
|  | 	-D OPEN_CLOSE=7 | ||||||
|  | 	-D ID=$UNIX_TIME | ||||||
|  | board_fuses.hfuse = 0xDE | ||||||
|  | board_fuses.lfuse = 0xE2 | ||||||
|  | board_fuses.efuse = 0x07 | ||||||
|  | upload_flags =  | ||||||
|  | 	-Pusb | ||||||
|  | 	-e | ||||||
|  | lib_deps =  | ||||||
|  | 	feilipu/FreeRTOS@^10.5.0-0 | ||||||
|  | 	nrf24/RF24@^1.4.5 | ||||||
							
								
								
									
										89
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/main.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | #include "Arduino.h" | ||||||
|  | #include "Arduino_FreeRTOS.h" | ||||||
|  | #include "RF24.h" | ||||||
|  | #include "avr/interrupt.h" | ||||||
|  | #include "semphr.h" | ||||||
|  |  | ||||||
|  | typedef struct | ||||||
|  | { | ||||||
|  |   int16_t sensor_id{0}; | ||||||
|  |   int16_t sensor_type{0}; | ||||||
|  |   int16_t value_1{0}; | ||||||
|  |   int16_t value_2{0}; | ||||||
|  |   int16_t value_3{0}; | ||||||
|  |   int16_t value_4{0}; | ||||||
|  |   int16_t value_5{0}; | ||||||
|  | } transmitted_data_t; | ||||||
|  |  | ||||||
|  | void sendButtonStatus(void *pvParameters); | ||||||
|  | float getBatteryLevelCharge(void); | ||||||
|  |  | ||||||
|  | RF24 radio(9, 10); | ||||||
|  | SemaphoreHandle_t buttonSemaphore; | ||||||
|  |  | ||||||
|  | void setup() | ||||||
|  | { | ||||||
|  |   EICRA |= (1 << ISC00); | ||||||
|  |   EIMSK |= (1 << INT0); | ||||||
|  |   ADCSRA &= ~(1 << ADEN); | ||||||
|  |   radio.begin(); | ||||||
|  |   radio.setChannel(120); | ||||||
|  |   radio.setDataRate(RF24_250KBPS); | ||||||
|  |   radio.setPALevel(RF24_PA_MAX); | ||||||
|  |   radio.setPayloadSize(14); | ||||||
|  |   radio.setAddressWidth(3); | ||||||
|  |   radio.setCRCLength(RF24_CRC_8); | ||||||
|  |   radio.setRetries(15, 15); | ||||||
|  |   radio.openWritingPipe(0xDDEEFF); | ||||||
|  |   radio.powerDown(); | ||||||
|  |   buttonSemaphore = xSemaphoreCreateBinary(); | ||||||
|  |   xTaskCreate(sendButtonStatus, "Send Button Status", configMINIMAL_STACK_SIZE, NULL, 1, NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void loop() | ||||||
|  | { | ||||||
|  |   set_sleep_mode(SLEEP_MODE_PWR_DOWN); | ||||||
|  |   portENTER_CRITICAL(); | ||||||
|  |   sleep_enable(); | ||||||
|  |   portEXIT_CRITICAL(); | ||||||
|  |   sleep_cpu(); | ||||||
|  |   sleep_reset(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void sendButtonStatus(void *pvParameters) | ||||||
|  | { | ||||||
|  |   (void)pvParameters; | ||||||
|  |   for (;;) | ||||||
|  |   { | ||||||
|  |     xSemaphoreTake(buttonSemaphore, portMAX_DELAY); | ||||||
|  |     transmitted_data_t sensor{abs((int16_t)ID), OPEN_CLOSE}; | ||||||
|  |     sensor.value_1 = getBatteryLevelCharge() * 100; | ||||||
|  |     sensor.value_2 = digitalRead(PD2) ? OPEN : CLOSE; // Normally closed. | ||||||
|  |     // sensor.value_2 = digitalRead(PD2) ? CLOSE : OPEN; // Normally open. | ||||||
|  |     radio.powerUp(); | ||||||
|  |     radio.flush_tx(); | ||||||
|  |     radio.write(&sensor, sizeof(transmitted_data_t)); | ||||||
|  |     radio.powerDown(); | ||||||
|  |     sei(); | ||||||
|  |   } | ||||||
|  |   vTaskDelete(NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | float getBatteryLevelCharge() | ||||||
|  | { | ||||||
|  |   ADMUX = (1 << REFS0) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1); | ||||||
|  |   ADCSRA |= (1 << ADEN); | ||||||
|  |   delay(10); | ||||||
|  |   ADCSRA |= (1 << ADSC); | ||||||
|  |   while (bit_is_set(ADCSRA, ADSC)) | ||||||
|  |     ; | ||||||
|  |   ADCSRA &= ~(1 << ADEN); | ||||||
|  |   float value = ((1024 * 1.1) / (ADCL + ADCH * 256)); | ||||||
|  |   return value; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ISR(INT0_vect) | ||||||
|  | { | ||||||
|  |   cli(); | ||||||
|  |   xSemaphoreGiveFromISR(buttonSemaphore, NULL); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user