Ви не увійшли.
Сторінки 1
Всем привет! У меня есть собака, которая любит лазить по столешне, когда нас нет дома. Хотелось придумать что-то простое и в то же время действенное.
Сначала я думал про сирену или автомобильный клаксон в сочетании с лампой-стробоскопом, однако подсказал товарищь, что собаки очень боятся шокеров, по целому ряду причин: все таки это небольшая молния на вид и на звук, собаки интуитивно боятся этого природного явления, плюс выдеяется газ – озон, который доказывает собаке о том, что это действительно молния.
Внимание! Собаку никто не собирается бить током, я её люблю и она мне нужна Речь идет о срабатывании шокера на расстоянии от полуметра от предпологаемого проникнования собаки, для создания эффекта отпугивания.
Мне очень не хотелось вести провода через весь стол, чтобы обеспечить работу датчика. Это не. Поэтому придумал отражать лазер от зеркальца и улавливать его фоторезистором (или датчиком света, если хотите). В будущем под это дело будет сделан монолитный корпус, который можно удобно и быстро поставить в любом месте. Ну а пока соберем макет.
Итак приступим, для работы нам понадобится:
• Резистор 1к Ом
• Резистор 220 Ом
• Ардуино, конечно
• Точеный лазер
• Фото резистор
• Реле (можно в принципе обойтись и транзистором, будет дешевле, но для простоты и наглядности возьмем готовое реле)
• Кнопка – для включения\выключения режима «охрана»
• Провода-джампера и макетная плата
• Шокер
Начнем с шокера, я купил самый дешевый, китайский на барахолке, обошлось этого около 260грн. Нужно его разобрать и припаяться к кнопке включения. Провода сразу соединяем с реле. У реле есть три контакта, соответственно можно подключиться либо к NO (нормально открытый) либо к NC (нормально закрытый), нам нужно включать контакты кнопки шокера, только по сигналу, значит соединяемся к NO.
Подключаем реле к ардуино. У реле три контакта, +5в, земля и сигнал. +5в и землю соединяем с одноименными выходами ардуино (5V, GND), а сигнал на выход №8.
На фото:
• Красный – выход №8
• Оранжевый – 5V
• Синий – GND
Реле подключено и готово к использованию. Теперь подключим кнопку, которой мы сможем приводить наше устройство в режим «охрана». См фото, кнопка подключается одной ногой к плюсу (5V), второй через резистор (220 Ом) к земпле, и этой же ногой к входу ардуино №2 – это наш сигнал, с кнопки, который мы считываем.
Далее подключеам фото резистор, он подключается также как и кнопка, за исключением, что резистор здесь 1к Ом, а сигнал (зеленый провод на фото) идет на аналоговый вход ардуино А0.
Лазер подключается проще простого, один котакт на 5В, второй на земплю.
Вот и все подключение! Теперь нам нужна программа которая будет всем этим управлять.
Логика работы следующая. Есть некоторый режим «охрана», в котором, наше устройство в боевой готовности. Когда мы включаем ардуино, у нас этот режим выключен. Но на лазер уже подается питание и он работает. После того, как мы включили ардуино нам нужно направить лазер непосредственно на фоторезистор. После этого мы нажимаем кнопку включения режима «охрана», после чего загорится светодид на плате ардуино возле выхода №13. В этот момент ардуино запоминает количество света, попадающее на фоторезистор и, если оно уменьшается больше чем на 30% (указывается в коде программы), мы включаем реле, к которому подключен шокер. Есть некоторый режим защиты от ложного срабатывания, если датчик сработал больше чем на 3 секунды, то скорее всего что-то пошло не так, например зеркало сдвинулось и луч лазера уже не попадает на фоторезистор, в этом случае мы просто выключем режим «охрана».
Смотрите видео данного устройства в действии:
Вот и все, дайте мне знать, что вы думаете об этом проекте, в коментариях!
Ну и на последок, код самой программы, конечно:
#define SHOKER_PIN 8
#define PHOTORESISTOR_PIN A0
#define BUTTON_PIN 2
#define LED_PIN 13
int g_buttonState = 0;
unsigned g_isAlarmOn = false;
unsigned g_shokIsOn = false;
unsigned g_lightAmount = 0;
unsigned g_shockCount = 0;
void setup() {
Serial.begin(9600);
pinMode(SHOKER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
}
void DisableAlarm(){
Serial.printf("[-] Alarm OFF\n");
digitalWrite(LED_PIN, LOW);
digitalWrite(SHOKER_PIN, LOW);
g_isAlarmOn = false;
g_shockCount = 0;
}
void EnableAlarm(){
g_lightAmount = analogRead(PHOTORESISTOR_PIN);
Serial.printf("[+] Alarm ON (light = %d)\n", g_lightAmount);
digitalWrite(LED_PIN, HIGH);
g_isAlarmOn = true;
g_shockCount = 0;
}
void DoShock(){
if (g_shockCount > 3){
Serial.printf("[!] Shock count exceeded, disable alarm...\n");
DisableAlarm();
}else{
g_shockCount += 1;
Serial.printf("[SHOCK!]\n");
digitalWrite(SHOKER_PIN, HIGH);
delay(300);
digitalWrite(SHOKER_PIN, LOW);
}
}
void loop() {
bool isButtonPressed = false;
int buttonState = digitalRead(BUTTON_PIN);
//
// filter button output
//
if (buttonState != g_buttonState){
g_buttonState = buttonState;
isButtonPressed = (buttonState == HIGH) ? true : false;
}
//
// disable/anable alarm
//
if (isButtonPressed){
Serial.printf("[~] button pressed\n");
if (g_isAlarmOn){
DisableAlarm();
}else{
EnableAlarm();
}
}
//
// if alarm set, and light from
//
if (g_isAlarmOn){
int lightAmount = analogRead(PHOTORESISTOR_PIN);
if (lightAmount < g_lightAmount * 0.7){
Serial.printf("[?] %d < %f = %b\n", lightAmount, g_lightAmount * 0.7, (lightAmount < g_lightAmount * 0.7));
DoShock();
}else{
g_shockCount = 0;
}
}
}
Неактивний
Сторінки 1