Подсветка рабочей зоны кухни
- Войдите на сайт для отправки комментариев
Добрый день! Задался вопросом об автоматической подсветке рабочих зон в кухне. Нашёл в инете код, но он работает процентов на 30. Значит имеем два HC-SR04 для двух зон и кнопку для принудительного включения зоны №1. Из всего этого нормально работает только зона №2. На кнопку никак не реагирует, а на датчик срабатывает но не гаснет.
// подключаем библиотеку I2C: #include <Wire.h> // подключаем библиотеку датчика BH1750: #include <BH1750.h> // объявляем объект lightMeter: BH1750 lightMeter; int a = 0; const int Trig1 = 6; const int Echo1 = 7; const int Trig2 = 8; const int Echo2 = 9; const int ledPin1 = 12; // 13 – если будете использовать встроенный в Arduino светодиод const int ledPin2 = 11; long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода long interval = 1000; // интервал мигания в миллисекундах void setup() { pinMode(Trig1, OUTPUT); pinMode(Echo1, INPUT); pinMode(Trig2, OUTPUT); pinMode(Echo2, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(3, INPUT_PULLUP); Serial.begin(9600); lightMeter.begin(); //инициализация датчика BH1750 } unsigned int time_us = 0; unsigned int distance_sm1 = 0; unsigned int distance_sm2 = 0; void loop() { //считываем показания с BH1750: uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light:"); Serial.print(lux); Serial.println("lx"); delay(100); digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig1, LOW); // Затем убираем time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса distance_sm1 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm1); // Выводим на порт digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig2, LOW); // Затем убираем time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса distance_sm2 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm2); // Выводим на порт if (lux < 80) { if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод previousMillis = millis(); } else { if (previousMillis - millis() > previousMillis) { previousMillis = millis(); } if (millis() - previousMillis > interval) { digitalWrite(ledPin1, 0); // тушим } } // для второго датчика if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin2, 1); // Зажигаем светодиод delay(400); } else { digitalWrite(ledPin2, 0); // иначе тушим } } if (lux > 80) { if (digitalRead(3) == HIGH) { a = 1; } if (a == 1) { Serial.println(distance_sm1); // Выводим на порт if (distance_sm1 < 50) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод delay(400); } else { digitalWrite(ledPin1, 0); // иначе тушим a = 0; } } } }
Если прописать кнопку - const int knopka = 3; и pinMode(knopka, INPUT_PULLUP); то кнопка отрабатывает нормально. Незнаю насколько это правильно, но работает.
[code] // подключаем библиотеку I2C: #include <Wire.h> // подключаем библиотеку датчика BH1750: #include <BH1750.h> // объявляем объект lightMeter: BH1750 lightMeter; int a = 0; const int knopka = 3; const int Trig1 = 6; const int Echo1 = 7; const int Trig2 = 8; const int Echo2 = 9; const int ledPin1 = 12; // 13 – если будете использовать встроенный в Arduino светодиод const int ledPin2 = 11; long previousMillis = 0; // здесь будет храниться время последнего изменения состояния светодиода long interval = 1000; // интервал мигания в миллисекундах void setup() { pinMode(Trig1, OUTPUT); pinMode(Echo1, INPUT); pinMode(Trig2, OUTPUT); pinMode(Echo2, INPUT); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(knopka, INPUT_PULLUP); Serial.begin(9600); lightMeter.begin(); //инициализация датчика BH1750 } unsigned int time_us = 0; unsigned int distance_sm1 = 0; unsigned int distance_sm2 = 0; void loop() { //считываем показания с BH1750: uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); delay(400); digitalWrite(Trig1, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig1, LOW); // Затем убираем time_us = pulseIn(Echo1, HIGH); // Замеряем длину импульса distance_sm1 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm1); // Выводим на порт digitalWrite(Trig2, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig2, LOW); // Затем убираем time_us = pulseIn(Echo2, HIGH); // Замеряем длину импульса distance_sm2 = time_us / 58; // Пересчитываем в сантиметры Serial.println(distance_sm2); // Выводим на порт if (lux < 80){ if (distance_sm1 < 80) // Если расстояние менее 80 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод previousMillis = millis(); } else { if (previousMillis - millis() > previousMillis) { previousMillis = millis(); } if (millis() - previousMillis > interval) { digitalWrite(ledPin1, 0); // тушим } } if (lux < 80)// для второго датчика if (distance_sm2 < 50) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin2, 1); // Зажигаем светодиод delay(400); } else { digitalWrite(ledPin2, 0); // иначе тушим } } if (lux > 80){ if (digitalRead(3) == HIGH) { a = 1; } if (a == 1) { Serial.println(distance_sm1); // Выводим на порт if (distance_sm1 < 80) // Если расстояние менее 50 сантиметром { digitalWrite(ledPin1, 1); // Зажигаем светодиод delay(400); } else { digitalWrite(ledPin1, 0); // иначе тушим a = 0; } } } } [/code]
Подскажите как подправить:
1 Что бы зона №1 не зацикливалась, а отключалась если растояние до датчика станет более установленого (80) 2 Сделать задержку на выключение для каждой зоны отдельно. Например зона №1 - 2мин. зона №2 - 5 сек. (что бы не моргала когда отошёл на пару сек/мин.)
1. Функция millis() возвращает значение типа unsigned long, поэтому переменные previousMillis и interval логично тоже объявить как unsigned long.
2. Условие
if
(previousMillis - millis() > previousMillis
) не будет выполняться никогда, поскольку millis() в данном скетче всегда больше[равно] previousMillis.3.
А как это можно подправить или почитать про это более подробно? Из того, что я нашёл как-то поверхностно всё описано - не для моих тупых мозгов.
Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.
1. Условие if (previousMillis - millis() < previousMillis) будет выполняться всегда. Если от чего-то отнять что-то, результат будет меньше этого самого чего-то, утверждает Капитан Очевидность.
2. Функция millis() возвращает значение типа unsigned long, поэтому переменные long OnTime1 = 50000; long OnTime2 = 5000; логично тоже объявить как unsigned long. Да, повторяюсь, да, уже писал об этом. Направление считаю правильным.
посмотрите стандартный пример мигаем без задержек, разберитесь как он работает и будет вам счастье
Боюсь у Вас по-прежнему проблемы с непониманием того, как работают эти if.
Да похоже не только с if, но и вообще с построением и пониманием всего алгоритма.
[/quote]
посмотрите стандартный пример мигаем без задержек, разберитесь как он работает и будет вам счастье
[/quote]
а теперь догадайтесь как сделать с задержкой, так, что ли?
Я понимаю, что тут никто никому не обязан, но без более подробного пояснения что и для чего в этом коде и взможное решение исправления ошибок мне самому будет очень сложно разобраться.
Я понимаю, что тут никто никому не обязан, но без более подробного пояснения что и для чего в этом коде и взможное решение исправления ошибок мне самому будет очень сложно разобраться.
С Ардуино я знаком совсем недавно, но с программированием существенно дольше. Послушайте мой совет - выкинте этот код совсем и начните всё писать сами с нуля. Переделывать чужой код, который ещё и не понимаешь, часто сложнее, чем написать свой. На мой взгляд, это лучший способ учиться программированию - начать решать свою конкретную несложную задачку. Но нужно смириться с тем, что её решение потребует времени больше, чем Вы, возможно, рассчитывали. Разумеется, это если Вы хотите чему-то научиться. Если же Вам нужен только свет на кухне, то проще обратиться в раздел "Ищу исполнителя".
Свой код я напишу позже, когда буду чётко понимать всю логику построения тело программы. Я пока не нашёл более менее доступный для понимания обучающий материал и ковыряю чужие скетчи. На примерах с подробным описанием мне проще понять что и для чего, ну и конечно же лезем в тему которая интересует именно сегодня, а не изучаем от А до Я. С какойбы стороны не изучай, а вопросы будут всегда. И где их задавать как не на форуме - знакомых владеющих языками програмирования то нет.
Переписал код, всё вроде теперь работает, но есть один баг. Когда срабатывает датчик и загорается свет, то засвечивая датчик освещённости программа останавливается ожидая затемнения датчика. Можно конечно поискать тёмный уголок и там расположить датчик освещённости, но это ведь неправильно, программа должна работать и при вкюченом общем освещении. Может подскажет кто как можно поправить код.
Вроде сам поправил. Убрал фигурные скобки на 71 и 77 строке.
{
if
(millis() - previousMillis1 > previousMillis1) {
072
previousMillis1 = millis();
073
}
074
if
(millis() - previousMillis1 > interval1) {
075
digitalWrite(ledPin1, 0);
// тушим
076
}
077
}
Они мне с самого начала там не нравились.
Так же и для второго датчика. Буду дальше тестировать.
ПС: Подскажите зачем это -
if
(a == 1) И какую функцию оно выполняет?
строки 71 и 85 полный бред.
трудно посмотреть пример блинк визаут делей?
Скетч копилируется,но в работе не проверял
Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать?
Не работает. Или перед загрузкой а ардуино я должен что то с кодом ещё сделать?
Что сделать, что сделать. Провести отладку и бета-тестирование. Посмотреть в чем затык, и отключть часть кода. Ведь что бы проверить код собрать макетную плату. А то кажется новичкам, что код пишется и сразу работает.
Вот примеры аналогичных кодов.http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Я же без притензий, просто сообщил, что не работает. Макетка собрана, на ней и тестирую.
Теперь есть реакция на приближение к датчикам, но если растояние меняется то светодиоды моргают.
Издержки УЗ датчиков. Можете отключить один и попробовать . Может в одиночку стабильней будет.
Нет, так же моргает.
Если это не пойдет, то больше идей нет.
На УЗ1 иногда проскакивают ещё мырги, на УЗ2 нет. Второе, если подойти к датчикам и уйти в сторону то светодиоды продолжают светиться. Если подойти и так же отойти то всё чётко - тухнут.