используется следующий датчик:
меряет расстояние до объекта и при изменении отправляет на сервер новое значение. может использоваться как детектор движения (прошёл кто-то мимо), как детектор присутствия в какой-то ограниченной зоне (за столом или возле плиты) или, как я запланировал, для измерения уровня отходов в септике.
код скетча контроллера:
Код: Выделить всё
#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