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