Ультразвуковой дальномер и таймер

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Добрый день.

Прошу помощи т.к. не знаю куда начать копать. Хочу вот что сделать-есть ультразвуковой дальномер HC-SR04 и Nano. Измеряю расстояние до объекта, если объект находится на 28см<Расстоянии<30см(промежуток) больше 3сек, тогда загорается и горит светодиод. Горит до тех пор пока расстояние не станет меньше 5см(не совсем уверен что получится,просто не хочу мутить кнопку,а просто поднести руку к датчику и вырубить светодиод, такой вот аналог кнопки квитирования).

Код пока получился такой:

#include <Ultrasonic.h>
Ultrasonic ultrasonic(8,9);
#define ledPin 12
#define  INTERVAL  3000
unsigned long previousMillis;

void setup() //процедура setup

{
pinMode(ledPin, OUTPUT); 
Serial.begin(9600);
ledPinState=0;
}

void loop()
{
  int distance_cm=ultrasonic.Ranging(CM);
  Serial.print(distance_cm);
  Serial.println("cm");    
  delay(100);

  if (distance_cm<30&&distance_cm>28&&millis() - previousMillis > INTERVAL){
        previousMillis = millis();  
        digitalWrite(ledPin,HIGH);}
  if(distance_cm<5){
            digitalWrite(ledPin,LOW);
          }
   if(distance_cm>31){
    digitalWrite(ledPin,LOW);
   }
      }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А в чём помощь-то нужна? Что с этим кодом не так?

Ой! А чё это в 22-ой строке написано?

distance_cm<30&&distance_cm>28

Вы уверены, что не хотите просто сравнить с 29? Других-то вариантов нет (она же int). Это вообще, про что?

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Ну вообще да,ступил чето,можно проверить равно ли 29 :)Хотя думаю надо вообще длину в мм высчитывать, иначе погрешность боюсь большая будет,хотя читал что точность дальномера +/- 1см, кто скажет как на деле?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

legionercheg пишет:

читал что точность дальномера +/- 1см, кто скажет как на деле?

У HC-SR04 - как повезёт и зависит от чёртовой уймы причин (например, от того из чего сделано препятствие). Надо экспериментировать.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

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

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Вроде подправил код,на 123circuits вроде в эмуляторе работает:

#define ledPin 12
#define pot A1
#define  INTERVAL  3000
unsigned long previousMillis;
unsigned long currentMillis;

void setup()

{
pinMode(ledPin, OUTPUT); 
Serial.begin(9600);
previousMillis=0;
}

void loop()
{
  int distance_cm=analogRead(pot);
  Serial.println(distance_cm);  
  delay(100);
  if (distance_cm > 500)
		{
	   	currentMillis = millis() - previousMillis;
		if (currentMillis > INTERVAL)
			{
			digitalWrite(ledPin,HIGH);
			}
  		}
  else
    	{
		digitalWrite(ledPin,LOW);
		previousMillis = millis();
		}
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

> датчик открытой двери холодильника

А просто замукать два контакта не вариант?

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Т.е. открыл дверь и сразу зуммер заорал?И смысл?Нужен как раз именно таймер.

Можно еще конечно через заряд конденсатора сделать,но выбрал вариант с ардуиной.

bwn
Offline
Зарегистрирован: 25.08.2014

legionercheg пишет:

Т.е. открыл дверь и сразу зуммер заорал?И смысл?Нужен как раз именно таймер.

Можно еще конечно через заряд конденсатора сделать,но выбрал вариант с ардуиной.

Можно на лисапеде педали крутить, но выбрал вариант с лошадью.))))
Таймер 555 (транзистор+RC)  и магнит-геркон, не? Зачем целый МК, тем более типа дуины, на это вешать?

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

bwn пишет:

Можно на лисапеде педали крутить, но выбрал вариант с лошадью.))))

Не совсем понял комплимент это или подкол :) Ну да ладно :)

Через дуину решил делать т.к. с радиодеталями напряженка в нашем городе,а из соседнего одну микросхемку копеечную заказывать влом,да и по доставке накладно.А на дуине можно любую(ну или почти?)логику написать.

Еще думаю над вариантом геркон+дуина :)

bwn
Offline
Зарегистрирован: 25.08.2014

Это "Тополем" по воробью палить. Помойки и телевизоры, времен Брежнева, на чердаке у вас тоже отменили? Любой древний транзистор (ток для пищалки должен обеспечить, П5 не подойдет), два резистора, конденсатор и активная пищалка (можно пассивную, тогда еще пяток окаменевших деталей потребуется).
А мощи 328 Atmegi, вам на сотню холодильников хватит и еще останется.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Я вполне понял ваш посыл.И отчасти предпологал что вместо помощи опять разговоры пойдут в эту сторону :)Но вот объясните мне,уважаемый bwn, нахрена мне лазить по помойкам, когда Ардуино Нано сейчас стоит ~150руб.?

Еще раз повторюсь,я понял что пытаетесь научить меня "рационально использовать мощности".Но мне бы пока с этим разобраться, а потом что то переделать в сторону упрощения схемы всегда можно успеть :)

bwn
Offline
Зарегистрирован: 25.08.2014

Дуина+геркон - отслеживаем пин на замыкание-размыкание, запускаем таймер, по истечении интервала начинаем пищать.
Дуина+фоторезистор - отслеживаем сигнал включения света, далее аналогично.
Дуина + холодильник - отслеживаем подачу напряжения на лампу холодильника.
Дуина+термодатчик - отслеживаем изменение температуры в верх, запускаем таймер, продолжаем контроль (если остановилось или пошло вниз сбрасываем таймер) здесь придется еще вводить дополнительные коэффициенты и учесть горячую кастрюлю.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Спасибо.

С самой концепцией я вроде определился-или датчик расстояния или геркон.Буду и то и то пробовать.

С фоторезюком отпала идея из-за последнего случая "не закрытой дверцы"-на двери стояла подставка для пакета с молоком у которой ручка(на подобии как у кружки)и эта ручка уперлась в контейнер с овощами,и получилось что концевик на ~1мм вдавило и свет погас,но фактически щель то осталась.И холодильник так всю ночь простоял.

Поэтому сначала идея с HC-SR04.Если не получится-геркон.Если и это не сработает-выкину подставку для молока и сделаю через фоторезистор :)

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

Единственное меню смущает в этом таймере это millis(), он же через какое то время переполняется.Как код в этом случае себя поведет?

bwn
Offline
Зарегистрирован: 25.08.2014

legionercheg пишет:

Единственное меню смущает в этом таймере это millis(), он же через какое то время переполняется.Как код в этом случае себя поведет?

Уже сто раз на форуме обсуждалось, как работало, так и будет работать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn пишет:

Уже сто раз на форуме обсуждалось, как работало, так и будет работать.

Это не совсем так. Вопрос - как запрограммировать. Пример "блинк без делэй" с данного сайта - да, нормально работает, но Интернет переполнен похожими примерами, которые при переполнении ломаются. Это (ломание) не так просто запрограммировать, но специалисты, как показывает практика, имеются.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

legionercheg пишет:

Единственное меню смущает в этом таймере это millis(), он же через какое то время переполняется.Как код в этом случае себя поведет?

Как запрограммируете. так и поведёт.

Если нет уверенности в понимании арифметики, то есть очень простой спобсоб проверить как поведёт. Взять просто число вместо миллис и написать цикл, где это число постоянно увеличиваясь проходит переполнение. И просто посмотреть как ведёт себя Ваш алгоритм.

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

ЕвгенийП пишет:

Единственное меню смущает в этом таймере это millis(), он же через какое то время переполняется.Как код в этом случае себя поведет?

Запрограммировал вот так http://arduino.ru/forum/programmirovanie/ultrazvukovoi-dalnomer-i-taimer#comment-157769 (#5 сообщение чуть выше)

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

bwn пишет:

Уже сто раз на форуме обсуждалось, как работало, так и будет работать.

Это не совсем так. Вопрос - как запрограммировать. Пример "блинк без делэй" с данного сайта - да, нормально работает, но Интернет переполнен похожими примерами, которые при переполнении ломаются. Это (ломание) не так просто запрограммировать, но специалисты, как показывает практика, имеются.

Соглашусь, было бы желание, и что один человек построил, другой завсегда сломать сможет.))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

legionercheg пишет:

...хотя читал что точность дальномера +/- 1см, кто скажет как на деле?

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

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

bwn пишет:

legionercheg пишет:

Т.е. открыл дверь и сразу зуммер заорал?И смысл?Нужен как раз именно таймер.

Можно еще конечно через заряд конденсатора сделать,но выбрал вариант с ардуиной.

Можно на лисапеде педали крутить, но выбрал вариант с лошадью.))))
Таймер 555 (транзистор+RC)  и магнит-геркон, не? Зачем целый МК, тем более типа дуины, на это вешать?

Да проще растяжку поставить %)

Открыл дверь - и усе......

legionercheg
legionercheg аватар
Offline
Зарегистрирован: 03.06.2015

bwn пишет:

Таймер 555 (транзистор+RC)  и магнит-геркон, не? Зачем целый МК, тем более типа дуины, на это вешать?

Все таки пробую вникнуть как этот таймер работает.Т.е. мне ведь нужно чтобы включение происходило не сразу,а только если на входе есть/нет (тут можно по разному сделать) сигнал в течении какого то определенного времени(время за которое успеет зарядиться конденсатор).Нашел такой сайт http://everycircuit.com/app (модеры не сочтите за рекламу), так вот сможет кто нить мне хотя бы в ней нарисовать, как правильно должна работать схема. Скока ни пытался я на этом сайте "перерисовать" схемы с инета-ниче не работает.