
Для данного проекта нам понадобится:
Приемник и передатчик на 433МГц в количестве 2 шт. http://ali.pub/1joehv
Arduino uno http://ali.pub/1joeoa
Arduino Mega http://ali.pub/1joeqf
Arduino nano http://ali.pub/1joes6
BME 280 http://ali.pub/1joewn
BMP180 http://ali.pub/1joey7
DS18b20 http://ali.pub/1jof0j
LCD nokia 5110 http://ali.pub/1jof7c
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Давайте для начала рассмотрим схему подключения приемника

Из данной схемы видно какой пин датчиков к какому пину ардуино подключен.
В FLProg данная схема выглядит вот таким образом:

Ниже в видео в конце этой статьи я подробно рассказываю, какой блок для чего служит в данной схеме.
Скетч приемника:
#include <Adafruit_Sensor.h>
#include <VirtualWire.h>
#include <Adafruit_BME280.h>
#include <SPI.h>
#include <EasyTransferVirtualWire.h>
#include <LCD5110_Graph.h>
int out1;
int out2;
int out3;
int out4;
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//Struct can'e be bigger then 26 bytes for VirtualWire version
int data1;
int data2;
int data3;
int data4;
};
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
LCD5110 myGLCD(8,9,10,11,12);
extern uint8_t TinyFont[]; // Объявление трех внешних
extern uint8_t SmallFont[]; // массивов символов
extern uint8_t BigNumbers[];
bool en_str_214990099_1;
String in_str_214990099_1;
bool en_str_214990099_2;
String in_str_214990099_2;
bool en_str_214990099_3;
String in_str_214990099_3;
float Temperature_168723051_1;
float Pressure_168723051_1;
float Altitude_168723051_1;
float Humidity_168723051_1;
#define BME_SCK_168723051_1 13
#define BME_MISO_168723051_1 12
#define BME_MOSI_168723051_1 11
#define BME_CS_168723051_1 10
#define SEALEVELPRESSURE_HPA_168723051_1 (1013.25)
Adafruit_BME280 bme_168723051_1; // I2C
bool en_str_214990099_4;
String in_str_214990099_4;
void setup()
{
ET.begin(details(mydata));
vw_set_rx_pin(4);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000);
vw_rx_start(); // Start the receiver PLL running
if ( 1 ) {
pinMode(13, OUTPUT);
}
randomSeed(analogRead(0));
myGLCD.InitLCD();
myGLCD.setContrast (60); // установка контраста
if (!bme_168723051_1.begin()) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
}
void loop()
{
myGLCD.update();
delay (100); // Задержка 0.1 с
myGLCD.clrScr(); // Очистка экрана
en_str_214990099_1 = 1;
in_str_214990099_1 = ((String("Zal ")) + ((String(out1, DEC))));
if (en_str_214990099_1==1)
{
myGLCD.setFont(SmallFont);
myGLCD.print(in_str_214990099_1, 0, 10);
}
//check and see if a data packet has come in.
if(ET.receiveData()){
if ( 1 ) {
digitalWrite(13, HIGH);
}
out1 = mydata.data1;
out2 = mydata.data2;
out3 = mydata.data3;
out4 = mydata.data4;
if ( 1 ) {
digitalWrite(13, LOW);
}
}
//you should make this delay shorter then your transmit delay or else messages could be lost
delay(250);
en_str_214990099_2 = 1;
in_str_214990099_2 = ((String("spalnya ")) + ((String(out2, DEC))));
if (en_str_214990099_2==1)
{
myGLCD.setFont(SmallFont);
myGLCD.print(in_str_214990099_2, 0, 20);
}
en_str_214990099_3 = 1;
in_str_214990099_3 = ((String("kuhnya ")) + (( _floatToStringWitRaz(Temperature_168723051_1,2))));
if (en_str_214990099_3==1)
{
myGLCD.setFont(SmallFont);
myGLCD.print(in_str_214990099_3, 0, 30);
}
Temperature_168723051_1 = bme_168723051_1.readTemperature();
Pressure_168723051_1 = bme_168723051_1.readPressure() / 100.0F * 0.7500;
Altitude_168723051_1 = bme_168723051_1.readAltitude(SEALEVELPRESSURE_HPA_168723051_1);
Humidity_168723051_1 = bme_168723051_1.readHumidity();
en_str_214990099_4 = 1;
in_str_214990099_4 = String("METEOSTATION");
if (en_str_214990099_4==1)
{
myGLCD.setFont(SmallFont);
myGLCD.print(in_str_214990099_4, 5, 0);
}
}
String _floatToStringWitRaz(float value, int raz)
{
return String(value,raz);
}
Ссылка на проект в FLProg: https://yadi.sk/d/xaPb9cJv3JyG9p
Модуль LCD 5110 : https://yadi.sk/d/wxYROnHtvwjFE
Модуль BME 280: https://yadi.sk/d/V-yyGBC8vwjMp
Модуль приемника и передатчика 433МГц: https://yadi.sk/d/rgQ1TDXl3JyGPR
Теперь давайте рассмотрим схему подключения передатчика на DS18b20:

Из схемы видно что куда подключается.

Ссылка проект: https://yadi.sk/d/12b0tZG63JyGwK
#include <OneWire.h>
#include <EasyTransferVirtualWire.h>
#include <VirtualWire.h>
byte _d18x2x1Addr[8]={0x28, 0xFF, 0xCC, 0x27, 0x64, 0x16, 0x4, 0xA1};
OneWire _ow2(2);
bool in1;
float in2;
int in3;
int in4;
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//Struct can'e be bigger then 26 bytes for VirtualWire version
int data1;
int data2;
int data3;
int data4;
};
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
void setup()
{
ET.begin(details(mydata));
vw_set_tx_pin(12); //установка пина, к которому подключен data-вход передатчика
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000);
if ( 1 ) {
pinMode(13, OUTPUT);
}
randomSeed(analogRead(0));
}
void loop()
{
in1 = 0;
in2 = (_d18x2x1O);
in3 = 0;
in4 = 0;
mydata.data1 = in1;
mydata.data2 = in2;
mydata.data3 = in3;
mydata.data4 = in4;
if ( 1 ) {
digitalWrite(13, HIGH);
}
ET.sendData();
if ( 1 ) {
digitalWrite(13, LOW);
}
delay(1000);
if(_isTimer(_d18x2x1Tti, 1000)) {
_d18x2x1Tti = millis();
_d18x2x1O= _readDS18_ow2(_d18x2x1Addr, 0);}
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
int16_t raw = (data[1] << 8) | data[0];
if (type_s)
{
raw = raw << 3;
if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1;
}
return (float)raw / 16.0;
}
float _readDS18_ow2(byte addr[8], byte type_s)
{ byte data[12];
byte i;
_ow2.reset();
_ow2.select(addr);
_ow2.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = _ow2.read();}
_ow2.reset();
_ow2.select(addr);
_ow2.write(0x44, 1);
return _convertDS18x2xData(type_s, data);}
Ну и схема передатчика на BMP180:

В схеме также показано какой пин куда подключается.

Ссылка на проект: https://yadi.sk/d/6iRGWq-z3JyHPG
#include <Wire.h>
#include <EasyTransferVirtualWire.h>
#include <VirtualWire.h>
#include <BMP085.h>
BMP085 _bmp085 = BMP085();
long _bmp085T = 0;
int in1;
int in2;
int in3;
int in4;
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//Struct can'e be bigger then 26 bytes for VirtualWire version
int data1;
int data2;
int data3;
int data4;
};
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
unsigned long _bmp0851Tti = 0UL;
void setup()
{
Wire.begin();
_bmp085.init();
ET.begin(details(mydata));
vw_set_tx_pin(12); //установка пина, к которому подключен data-вход передатчика
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000);
if ( 1 ) {
pinMode(13, OUTPUT);
}
randomSeed(analogRead(0));
}
void loop()
{if(_isTimer(_bmp0851Tti, 1000)) {
_bmp0851Tti = millis();
_bmp085.getTemperature(&_bmp085T);
}
in1 = (_bmp085T)/(10);
in2 = 0;
in3 = 0;
in4 = 0;
mydata.data1 = in1;
mydata.data2 = in2;
mydata.data3 = in3;
mydata.data4 = in4;
if ( 1 ) {
digitalWrite(13, HIGH);
}
ET.sendData();
if ( 1 ) {
digitalWrite(13, LOW);
}
delay(1000);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
Демонстрация работы данной программы можно увидеть в видео приведенном в конце статьи.
Видео: