Mini proiect (38) - Transmisia de semnale RF 433 Mhz de la senzorul care detectează deschiderea ferestrei, și recepționarea informației pentru Arduino Atmega2560

Transmisia de semnale RF 433 Mhz de la senzorul care detectează deschiderea ferestrei, și recepționarea informației pentru Arduino Atmega2560

Azi am avut la teste un kit de comunicator radio RF 433 MHz, care l-am folosit pentru a determina starea unei ferestre cu un senzor simplu de fereastră. A trebuit să hackeresc un astfel de senzor pentru ai lipi niște fire, și pentru a citi semnalul de la senzorul magnetic, care presupun că este similar cu un modul cu senzor Hall testat mai demult. Din cauza faptului că nu am găsit nimic scris pe acest senzor, și nici pe integratul de pe placă (care cred că este un convertor analog/digital), a trebuit să măsor cu osciloscopul toate semnalele de pe placă pentru a putea determina ce aș putea să folosesc pentru determinarea stării ferestrei. 

Am reușit până la urmă, și am lipit firele care mai departe le-am conectat la ATtiny85, iar informațiile despre fereastră sunt trimise către placa ATMega2560.

 Componente:

Schema electronica/sistem:

Pe placa senzorului de ușă deschisă am lipit 4 fire:

  • Firul roșu este VCC .
  • Firul maroniu este GND.
  • Firul galben l-am legat la ieșirea senzorului magnetic, care se pare ca este citit tot timpul pe HIGH dacă este fereastra închisă și invers pe LOW.
  • Firul portocaliu l-am legat la ieșirea selectorului, dar din teste am constatat că mi-e de ajuns doar firul galben .


Apoi am folosit VCC și GND la alimentarea plăcii ATtiny85, iar de pe firul galben citesc senzorul magnetic (pe pinul PB0), care este închis atunci când magnetul este apropiat de el.  Tot de placa ATtiny85 mai este conectat modulul de transmisie RF433 Mhz STX882 pe pinul PB2, cu care se va trimite starea ferestrei, pentru fereastră închisă o să fie 9 iar pentru fereastră deschisă o să fie 5.

 


 Pe parte de recepție am folosit o placă Arduino ATMega2560 (nu am avut altceva la îndemână) , la care am conectat un receptor de alt tip MX-RM-5V 080408 (să nu mă întrebați de ce), care este legat la pinul #2 (se vede clar :)


   În fereastra din Arduino IDE pentru comunicația serială se pot vedea datele care sunt primite, pentru WindowOpen se primește valoarea 5, iar pentru WindowClosed se primește valoare 9 (identic cu ce se trimite de pe ATtiny85). Pare că funcționează destul de bine ...


Cod Transmisie - ATTiny85:
/*
Florin Simedru
Complete project details at https://automatic-house.blogspot.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <RCSwitch.h>
#include <Arduino.h>
#ifdef F_CPU
#undef F_CPU
#define F_CPU 8000000 //value must be 1000000, 8000000
#endif
#define Delay_time_ms 100
#define Led 1 // Select the pin where the led is attached. Options: from 0 to 4
#define WINDOW_OPEN_PIN 0// Select the pin where the RF transmitter is attached.
#define WINDOW_CLOSE_PIN 4// Select the pin where the RF transmitter is attached.
#define RF_SEND_PIN 2 // Select the pin where the touch button is attached
#define WINDOW_OPEN 0
#define WINDOW_CLOSED 1
#define VERSION "0.0.1"
RCSwitch mySwitch = RCSwitch();
void setup() {
// put your setup code here, to run once:
pinMode(Led, OUTPUT); // initialize the digital pin as an output.
digitalWrite(Led, LOW); // Set it in Low state
pinMode(WINDOW_OPEN_PIN, INPUT); // initialize the digital pin as an input.
digitalWrite(WINDOW_OPEN_PIN, LOW); // Set it in Low state
pinMode(WINDOW_CLOSE_PIN, INPUT); // initialize the digital pin as an input.
digitalWrite(WINDOW_CLOSE_PIN, LOW); // Set it in Low state
// Transmitter is connected to Attiny Pin PB2 <--
// That is physical pin2
mySwitch.enableTransmit(RF_SEND_PIN);
// Optional set pulse length.
mySwitch.setPulseLength(208);
// Optional set protocol (default is 1, will work for most outlets)
mySwitch.setProtocol(1, 208);
// Optional set number of transmission repetitions.
mySwitch.setRepeatTransmit(7);
}
void loop() {
// put your main code here, to run repeatedly:
// read the pushbutton input pin
int WindowOpenState = digitalRead(WINDOW_OPEN_PIN);
if(WindowOpenState == WINDOW_OPEN)
{
for (int i=0; i<8; i++)
{
/* send the activation code to the receiver*/
mySwitch.send(5, 24);
delay(50);
digitalWrite(Led, HIGH);
delay(500);
digitalWrite(Led, LOW);
}
}
else
{
mySwitch.send(9, 24);
delay(Delay_time_ms);
}
}

PlatformIO ini:
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:attiny85]
platform = atmelavr
board = digispark-tiny
framework = arduino
upload_protocol = micronucleus
lib_deps =
sui77/rc-switch@^2.6.4

Cod Receptionare - ATMega2560:
/*
Florin Simedru
Complete project details at https://automatic-house.blogspot.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <RCSwitch.h>
#include <Arduino.h>
#define LED LED_BUILTIN
RCSwitch mySwitch = RCSwitch();
#define WINDOW_CLOSED 9 //defines incoming data set by user which is transmitted
#define WINDOW_OPEN 5
void process();
void setup()
{
Serial.begin(115200);
pinMode(LED,OUTPUT);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 pinMode(led,OUTPUT);
Serial.print("Setup ok !");
}
void loop()
{
digitalWrite(LED,LOW);
if (mySwitch.available())
{
Serial.println("mySwitch.available !");
int value = mySwitch.getReceivedValue();
if (value == 0) {
Serial.print("Unknown encoding");
}
else
{
// used for checking received data
Serial.print("Received ");
Serial.print( mySwitch.getReceivedValue() );
Serial.print(" / ");
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( mySwitch.getReceivedProtocol() );
//digitalWrite(LED,HIGH);
}
if (mySwitch.getReceivedValue())
{
process();
}
mySwitch.resetAvailable();
Serial.println(" ");
}
digitalWrite(LED,HIGH );
delay(200);
}
void process()
{
unsigned long res = mySwitch.getReceivedValue();
switch (res)
{
case WINDOW_OPEN:
Serial.println("Window Open!");
digitalWrite(LED,HIGH);
break;
case WINDOW_CLOSED:
Serial.println("Window closed!");
digitalWrite(LED,LOW);
break;
}
}

PlatformIO ini:
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:megaatmega2560]
platform = atmelavr
board = megaatmega2560
framework = arduino
monitor_speed = 115200
upload_port = COM11
lib_deps = sui77/rc-switch@^2.6.4

Documentatie proiect:

 To do:

  • Starea ferestrei o să încerc să o trimit către HomeAssistant folosind cel mai probabil un ESP32 MQTT gateway, apoi o să integrez această informație in HA
  • Tre să fac o cutie în care o să înghesui placa ATtiny85 și transmițătorul RF433 Mhz

Afiliere eMag: 

Linkurile de la secțiunea "Componente" conțin adresa mea de afiliere la eMag.ro, iar dacă cumperi folosind aceste linkuri vei susține blogul meu. 

Mulțumesc! 

eMag Genius:
Hai și tu în Genius! Abonează-te la Genius 12 luni și primești beneficii premium și 20 lei card cadou eMAG. Profită acum! eMag Genius

 
Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog sau pe email simedruflorin@automatic-house.ro. O seară/zi plăcută tuturor !





Etichete

Afișați mai multe

Arhiva

Afișați mai multe