Arduino и модули 433МГц

gzp13
Offline
Зарегистрирован: 06.04.2015

Здравствуйте, сделал метеостанцию с датчиком измерения наружного воздуха DS18B20 , предающий температуру наружного воздуха каждую минуту  через передающий модуль 433МГц.Скетч брал из готовой библиотеки VirtualWire переделанную под свое устройство. Так вот, хочу сделать так, чтобы при пропадании сигнала передатчика(например отказ датчика температуры, или отказ питания), на экране метеостанции температура оставалась не такой какой была в последний момент измерений, а например высвечивалось сообщение "НЕТ ДАННЫХ" или что то подобное(например 000).  Подозреваю, что надо присвоить метку             byte ID=1 передатчику, и запускать счетчик минуты на полторы-две, и если сигнал с меткой byte ID=1 не приходит на приемник, то выводить сообщение о том что ID!=0 и соответственно печатать сообщение о том, что нех данных с передатчика. Направьте в нужном направлении.

arDubino
Offline
Зарегистрирован: 12.01.2017

во-первых понять что вы делаете ... таки передаете или принимаете ;)

 

gzp13
Offline
Зарегистрирован: 06.04.2015

Я передаю температуру, и принимаю эту же температуру, но мне надо чтобы при отключении передатчика на приемнике высвечивалось сообщение что нет данных с передатчика.

arDubino
Offline
Зарегистрирован: 12.01.2017

ыыыы :)))

дубина. ты принимаешь на плату или передаешь и в какой момент знаешь где передавать а где принимать.

или там у тебя оба долбят нонстоп один передачу другой прием.

посути если думать то наверно плата должна в опред. время запросить датчик. т.е. она приемник будет а датчик передатчик.

соответственно и плата должна обрабатывать событие что не получила ответ от датчика-передатчика в отведенный для этог овременной промежуток ответа , т.е. не приняла сигнал.

arDubino
Offline
Зарегистрирован: 12.01.2017

з.ы.

если ты не понял то разжую.

твой датчик якобы каждую миниту передает в эфир сигнал с температурой. у сигнала есть своя длина на которой он будет в эфире.

а плата твоя если не все время на приеме то она просто пропустит сигнал т.к. время будет же не синхронизировано.

т.е. плата приемник просто пропустит время эфира твоего сигнала.

gzp13
Offline
Зарегистрирован: 06.04.2015

Передающие модули на 433Мгц работают только на передачу, а приемные-только на прием. Соответственно дубина не я!!! Если делать запрос, то у меня должго установленно по передатчику и приемнику на каждом устройстве.

Короче сам разобрался.

gzp13
Offline
Зарегистрирован: 06.04.2015
код приемника

#include <VirtualWire.h> 
#include <EasyTransferVirtualWire.h>
 EasyTransferVirtualWire ET;


 long previousMillis = 0;

 int ID1=0;
struct SEND_DATA_STRUCTURE{
  int temperatura;
  int ID;
   
};

 SEND_DATA_STRUCTURE mydata;
void setup(void)
{
  vw_set_rx_pin(2); 
  vw_setup(2000);       // Скорость передачи (Бит в секунду) 
// start serial port
ET.begin(details(mydata));
vw_rx_start(); 
Serial.begin(9600);

}
  
void loop() {
  if (millis() - previousMillis < 5000 )
  {
  if(ET.receiveData() ) {
   Serial.println(mydata.ID);
  Serial.println(mydata.temperatura);
  ID1==1;
  previousMillis = millis();
  }
  
  }
  
  if (millis() - previousMillis > 5000 && ID1!=1)
  {
    previousMillis = millis();
     Serial.println("000");
  }    
}

Разобраться то я разобрался, да вот при встаквке кода в другой код нифига не работает. Дайте наводку))

 

это код приемника

 

Мне нужно чтобы при пропадании сигнала передатчика, приемник выводил информацию что сигнал отсутствует. Я сделал так, вроде работает, но при вставки этого кода приемника в нужную мне программу ничего не работает. Проблема идимо в том, что когда сигнал есть, передатчик отправляет сигнал ID=1, но при пропадании сигнала с передатчика(отключаю питание) сигнал ID=1 так и остается и поэтому приемник не может определить отсутствие сигнала. Наверно нужно в коде приемника установить какую то метку....

 

gzp13
Offline
Зарегистрирован: 06.04.2015
код передатчика

#include <OneWire.h>
#include <DallasTemperature.h>
#include <VirtualWire.h> 
#include <EasyTransferVirtualWire.h>
const int transmit_pin = 4; // Пин подключения передатчика 
#define ONE_WIRE_BUS 2
 EasyTransferVirtualWire ET;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 long previousMillis1 = 0;
  int ID=0;
struct SEND_DATA_STRUCTURE{
    float temperatura;
  int ID;
  };

 SEND_DATA_STRUCTURE mydata;
void setup(void)
{
  vw_set_tx_pin(4); 
  vw_setup(2000);      
ET.begin(details(mydata));
sensors.begin();
}
void loop(void)
{
sensors.requestTemperatures(); // Send the command to get temperatures
//Serial.print(sensors.getTempCByIndex(0)); Serial.println(" Celcius;");// Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
mydata.temperatura =  sensors.getTempCByIndex(0);
mydata.ID=1;
     ET.sendData();
     //Serial.print(mydata.ID);
delay (3000); 

}

а это код передатчика

 

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

gzp13 пишет:

это код приемника

Думаю что вам надо просто переменную int ID1=0; объявить не как глобальную, а как локальную, в самом начале loop

int слишком жирно для этой переменной, лучше byte.