Need Help! Включение "умного зеркала" на Ардуино

necton
Offline
Зарегистрирован: 21.01.2019

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

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

В этом скетче, все просто - если с ультразвукового датчика показания менее 100 - включается подстветка ("желый светодид" не или реле подстветки), если 50 и менее - та же фигня но.. вот тут то и нужен ваш ценный совет опытных кунаков! 

01#include <Ultrasonic.h>
02#define trigPin 3
03#define echoPin 2
04 
05#define Relay 9
06#define YellowLED 10
07 
08int distance = 2;
09 
10Ultrasonic ultrasonic(trigPin, echoPin);
11 
12void setup() {
13  Serial.begin(115200);
14  pinMode(Relay, OUTPUT);
15  pinMode(YellowLED, OUTPUT);
16   
17}
18 
19void loop() {
20  distance = ultrasonic.distanceRead();
21  Serial.println(distance);
22  
23  if (distance < 100) {
24      digitalWrite(Relay, HIGH);
25  }
26  else {
27      digitalWrite(Relay, LOW);
28  }
29   
30  if (distance < 50) {
31    digitalWrite(YellowLED, HIGH);
32  }
33  else {
34    digitalWrite(YellowLED,LOW);
35  }

 ----------------------------------------------

Итак, с YellowLED все понятно, или логический уровень 1 или 0. На освещение интерьера подаётся питание пока перед зеркалом кто-то торчит в пределах метра (переменная равна 100 или менее), но вот как бы похитрее реализовать включение монитора (планшета) в переменной Relay- я бы хотел спросить у вас.

Фактический, нужно (для запрятанного за стекло планшета с подпаянной к реле кнопкой Power):

А: Не держать уровень 1 все время, пока человек стоит у зеркала, а имитировать нажатие пальцем кнопки POWER, скажем на пол секунды.

Б: отлично, нажатие было, планшет за заркалом включился, но черт подери, как сделать так, что бы кнопка не нажималась (или не была нажата постоянно) каждый раз при прохождении цикла, пока человек стоит у зеркала (переменная Distance равна или менее чам 50)? Очень не хотелось бы использовать Delay! Очень, поскольу это на пять минут отановит работу Ардуинки и заглушит реакцию на подстветку (yellowLED).. Теоретический, надо сделать так, что бы после короткого нажатия, пять минут не было никакой реакции на событие (человек за это время все просмотрит, причешится и уйдёт на работу), после чего, через пять минут повторное короткое нажатие - теперь уже выключающее планшет и снова перевод в ожидание когда distance <50.

Я тут и про флаги и про разные переменные уже начитался, голова пухнет.. Хотя я уверен, что для знающих - там всего-то пару строк кода и никаких костылей. Помогите пожалуйста, престарелому самодельщику:))

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

А поищите, типа - "блинк без делей". И можно в гугеле набрать "Леший в мире Ардуино".

b707
Offline
Зарегистрирован: 26.05.2017

necton пишет:

но черт подери, как сделать так, что бы кнопка не нажималась (или не была нажата постоянно) каждый раз при прохождении цикла, пока человек стоит у зеркала (переменная Distance равна или менее чам 50)?

Да очень просто! Когда ваша программа первый раз нажимает кнопку Power - запомните это событие. Запишите где-нибудь  что "свет уже включен" . И не включайте его вторично, пока сами не выключите.

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

Правильное слово для поиска "конечный автомат".

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Да вот на днях захотел тоже сделать "умное зеркало". Положил рядом с обычным зеркалом ардуину и ничего не вышло.Куда бы ардуину не перекладывал,все время получается "дурацкое зеркало" .Как гляну в него, а там дурак с идиотской рожей смотрит. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ты потомушта ее рядом ложил, а надо было синей изолентой примотать. 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

DetSimen пишет:

Ты потомушта ее рядом ложил, а надо было синей изолентой примотать. 

Злой ты. Вот лишь бы поиздеваться! Не Ардуино должно видеть зеркало, а зеркало Ардуино! Надо не приматывать, а перед зеркалом разместить ... и без корпуса. 

strarbit
Offline
Зарегистрирован: 12.06.2016