Датчик дождя или датчик препятствий

Проекты и идеи
Датчик дождя или датчик препятствий

Я переработал много разных вариантов датчика из интернета, все работают неправильно, чувствительность низкая, срабатывают на разные помехи, например на пульты ДУ или энергосберегающие лампы.
Вот и решил сам написать код, теперь у меня можно настроить чувствительность датчика от 1 см до нескольких метров и при этом не срабатывает на помехи.
Чувствительность регулируется резистором в цепи ИК диода, у меня примерно 1к и слабый ИК светодиод от старой мышки, срабатывают на расстоянии 30см от препятствия. Пробовал на оконном стекле (брызгал водой) срабатывает стабильно. На автомобильном стекле еще не проверял. Carduino с нижеприведеным кодом работает самостоятельно без компьютера. Индикатор (L) начинает светиться при срабатывании. Датчик ИК и ИК светодиод должны быть полностью изолированы друг от друга светонепроницаемым материалом.
ИК приемник используется из Кармонитор, который работает в диапазоне 38кГц.

Код:

byte tsop = 11;   //tsop
byte irLed = 10;  //ик-светодиод 
byte Led = 13;   //осветодиод(L) на плате
byte i;     // счётчик
byte num=20; //число периодов несущей 38кГц в посылаемом пакете
byte impulse=10;  // длительность полупериода
byte val, old_val;   //переменная для хранения сигнала с ИК приемника

void setup() 
{
  pinMode (irLed, OUTPUT); // разъём 10 на вывод
  pinMode(Led, OUTPUT);   //разъём 13 на вывод
  pinMode(tsop, INPUT);   // разъём 11 на ввод
  Serial.begin(115200);
}

void loop()
{
  for(i=0; i<num; i++) //цикл несущей
  {
    digitalWrite(irLed, HIGH); //зажигаем ик-диод
    delayMicroseconds(impulse); //положительный полупериод
    digitalWrite(irLed, LOW); //гасим ик-диод
    delayMicroseconds(impulse-1); //выравниваем скважность
  }
  
 val=digitalRead(tsop);//Прочитать показания датчика
 if (val==old_val)     //сравнить показания с предидущей посылкой
 {
  digitalWrite(Led,(val==LOW) ? HIGH:LOW); //если сигнал низкий то зажигаем светодиод
  if (val==LOW)   delay(300); //время свечения светодиода (L) при срабатывании
 }
old_val=val;

delay(30); //пауза между пакетами.  
  // Serial.println(val, DEC);
}  




Оригинал
technik 24.12.2009 в 19.53 (обновлен 24.12.2009 в 19.53) комментарии 0 0

комментарии(0)

Комментировать

Для добавления комментария авторизируйтесь.
Последние комментарии:
© 2012 pobot.ru