датчик расстояния для дома

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

датчик расстояния для дома

Сообщение sergejey » Вт окт 22, 2013 5:34 pm

сделал ещё одно забавное устройство в свою беспроводную сеть на arduino и rf 433 -- датчик расстояния

используется следующий датчик:

Изображение

меряет расстояние до объекта и при изменении отправляет на сервер новое значение. может использоваться как детектор движения (прошёл кто-то мимо), как детектор присутствия в какой-то ограниченной зоне (за столом или возле плиты) или, как я запланировал, для измерения уровня отходов в септике.

код скетча контроллера:

Код: Выделить всё

#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <EEPROM.h> //Needed to access the eeprom read write functions

#define PIN_LED 13
#define PIN_LED_T 13 
#define PIN_RF 4
#define PIN_ECHO 3 
#define PIN_TRIG 2 
#define ACCURACY 10


#define COMMAND_DISTANCE 16 // command code for distance

#define RF_SEND_COUNTER 3 // number of packets to send with transmission
 

unsigned int unique_device_id = 0;


int maximumRange = 150; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance, distanceSent; // Duration used to calculate distance

long int timeSentDistance=0;


//create object
EasyTransferVirtualWire ET; 

struct SEND_DATA_STRUCTURE{
  //put your variable definitions here for the data you want to send
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  //Struct can'e be bigger then 26 bytes for VirtualWire version
  unsigned int device_id;
  unsigned int destination_id;    
  unsigned int packet_id;
  byte command;
  int data;
};

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;

//This function will write a 2 byte integer to the eeprom at the specified address and address + 1
void EEPROMWriteInt(int p_address, unsigned int p_value)
{
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);

  EEPROM.write(p_address, lowByte);
  EEPROM.write(p_address + 1, highByte);
}

//This function will read a 2 byte integer from the eeprom at the specified address and address + 1
unsigned int EEPROMReadInt(int p_address)
{
  byte lowByte = EEPROM.read(p_address);
  byte highByte = EEPROM.read(p_address + 1);

  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

void blinking(int count) {
 for(int i=0;i<count;i++) {
  digitalWrite(PIN_LED, HIGH); 
  delay(200);
  digitalWrite(PIN_LED, LOW);
  delay(200);
 }
}

void sendRFData() {
 Serial.print("Transmitting packets ... ");   
 for(int i=0;i<RF_SEND_COUNTER;i++) {
  if (i>0) {
   delay(200);    
  }
  digitalWrite(PIN_LED_T, HIGH); 
  ET.sendData();
  digitalWrite(PIN_LED_T, LOW);
 }  
 Serial.println("DONE");   
}

void setup()
{

  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_LED_T, OUTPUT); 

 pinMode(PIN_TRIG, OUTPUT);
 pinMode(PIN_ECHO, INPUT);  
  Serial.begin(9600); 

  ET.begin(details(mydata));
  vw_set_tx_pin(PIN_RF);
  vw_setup(2000);        // Bits per sec
  randomSeed(analogRead(0));


  // Device ID
  Serial.print("Getting Device ID... "); 
  unique_device_id=EEPROMReadInt(0);
  if (unique_device_id<10000 || unique_device_id>60000) {
    Serial.print("N/A, updating... "); 
    unique_device_id=random(10000, 60000);
    EEPROMWriteInt(0, unique_device_id);
  }
  Serial.println(unique_device_id);   
  mydata.device_id = unique_device_id;
  mydata.destination_id = 0;  
  
}

void loop()
{

  digitalWrite(PIN_TRIG, LOW);
  delayMicroseconds(2);
  
 digitalWrite(PIN_TRIG, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(PIN_TRIG, LOW);
 duration = pulseIn(PIN_ECHO, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
  //Serial.println("-1");
  digitalWrite(PIN_LED, HIGH); 
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 if (abs(distance-distanceSent)>ACCURACY) {
      Serial.print("Distance: ");
      Serial.println(distance);   
      distanceSent=distance;
      timeSentDistance=millis()/1000;
      mydata.packet_id = random(65535);
      mydata.command = COMMAND_DISTANCE; //power counter
      Serial.print("Sending value: ");
      mydata.data = (int)distance;
      Serial.println(mydata.data);
      sendRFData();

 }
 digitalWrite(PIN_LED, LOW); 
 } 
  
 
  delay(100); // задержка. 
}


фотография прототипа:

Изображение

принципиальную схему рисовать не буду отдельно -- здесь тоже самое что в статье по ссылке ниже, только подключен этот датчик (последний подключается просто к контроллеру -- Gnd/Vcc питание и выводы Trig/Echo на data-pin-ы)

прицип системы и код для сборщика информации от датчиков:
http://smartliving.ru/Main/ArduinoVirtualWire

передатчик (на будущее для отправки команд по радио-каналу)
http://smartliving.ru/forum/viewtopic.p ... =654#p5077

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: датчик расстояния для дома

Сообщение Ivan » Ср окт 23, 2013 8:27 am

После прочтения задумался себе поставить тоже. Жаль что нельзя 1-wire туда прикрутить. А то Ардуину жалко в яму пихать, и питание все равно вести (Даже если ставить VirtualWire)

Прикол: Вот бы она ещё питалась от газов в яме :)
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: датчик расстояния для дома

Сообщение sergejey » Ср окт 23, 2013 11:03 am

Ivan писал(а):После прочтения задумался себе поставить тоже. Жаль что нельзя 1-wire туда прикрутить. А то Ардуину жалко в яму пихать, и питание все равно вести (Даже если ставить VirtualWire)
Прикол: Вот бы она ещё питалась от газов в яме :)
Про питание думал тоже, может попробую солнечную батарею поставить небольшую, что б хотя бы хватило раз в сутки показания считать -- я всё равно гораздо реже туда сам заглядываю :)

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: датчик расстояния для дома

Сообщение Ivan » Ср окт 23, 2013 11:50 am

Прикол: График изменения уровня Г очень смешной показатель
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
clark2
Сообщения: 10
Зарегистрирован: Пт янв 11, 2013 1:12 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: датчик расстояния для дома

Сообщение clark2 » Ср окт 23, 2013 1:00 pm

Вопрос по септику.
Как же оно (устройство) там будет жить, в яме.
Как защищено. Не задохнется?
Ivan
Сообщения: 1473
Зарегистрирован: Сб окт 12, 2013 11:03 pm
Благодарил (а): 49 раз
Поблагодарили: 327 раз

Re: датчик расстояния для дома

Сообщение Ivan » Ср окт 23, 2013 1:14 pm

Вопрос почему именно дальномер? Нельзя ли 2 штыря, и мереть сопротивление.
Linux, Raspberry PI, MySensors
Connect: http://connect.smartliving.ru/profile/53
Мои проекты: http://smartliving.ru/profile/4
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: датчик расстояния для дома

Сообщение sergejey » Ср окт 23, 2013 1:52 pm

clark2 писал(а):Вопрос по септику.
Как же оно (устройство) там будет жить, в яме.
Как защищено. Не задохнется?
Пока не знаю, честно говоря. Над корпусом (и питанием) надо ещё думать и экспериментировать.
Ivan писал(а):Вопрос почему именно дальномер? Нельзя ли 2 штыря, и мереть сопротивление.
Дальномер компактней и проще в установке -- поставил на стенку колодца, направил куда надо и всё.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
LutsenkoDenis
Сообщения: 521
Зарегистрирован: Вс апр 07, 2013 9:30 pm
Откуда: Moscow
Благодарил (а): 2 раза
Поблагодарили: 58 раз
Контактная информация:

Re: датчик расстояния для дома

Сообщение LutsenkoDenis » Ср окт 23, 2013 1:59 pm

Ага... и Алиса такая на всю хату: Хозяин, уровень Г критический! Спасай датчик :)
________________________________________________________
Majordomo (GitHub) на HP Microserver Gen8. OS Debian Stretch
dark_avenger
Сообщения: 9
Зарегистрирован: Чт окт 17, 2013 2:09 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: датчик расстояния для дома

Сообщение dark_avenger » Чт окт 24, 2013 2:54 pm

clark2 писал(а):Вопрос по септику.
Как же оно (устройство) там будет жить, в яме.
Как защищено. Не задохнется?
На счет задохнется не уверен, а вот влажность там очень высокая. Через пакет датчик работает?

я планировал для этой цели использовать датчик влажности. его можно эпоксидкой залить там где провода подключаются и все...
Stanislav
Сообщения: 22
Зарегистрирован: Пн апр 08, 2013 3:54 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: датчик расстояния для дома

Сообщение Stanislav » Пт окт 25, 2013 12:29 am

Ребят, есть предложение использовать более простой датчик для септика, чем дальномер...
У меня работает следующим образом:
К MajorDoMo подключены 4 ардуино мега. Одна из которых собирает показания с сенсоров (DHT, Dallas, RF 433Mhz, RF 315Mhz и т.д.). Так вот, датчик работает по протоколу кодека PT2262. Частоту 315 или 433Мгц можно заказать в том же магазине. Только нужно написать продавцу перед заказом. Датчик состоит из поплавка и передатчика. Когда уровень в септике превышен, передатчик отправляет сигнал на ардуино. Поплавок имеет 2 провода. Пластиковый, полностью герметичен. На деле закрепляем датчик в септик, а передатчик вне септика. И все работает. Уровень превышен, сигнал передан. Влажной среды не боится, стоит дешево, работает без сбоев. Короче говоря, мне нравится и во всем устраивает.
Вот здесь http://www.ebay.com/itm/Wireless-Flood- ... 2324ad34ac заказывал датчик (не только его, заказывал несколько комплектов сигнализаций, с полным набором всяческих датчиков: PIR, Gas, Smoke и т.д.). Все без проблем соединяется с ардуино через RF Module.
Ответить