Автоматическая подсветка лестницы и MM5450
- Войдите на сайт для отправки комментариев
Вот повторил схемку Лукьянова В. С. http://lukjanow.ru/2012/04/automatic-illumination-stairs-arduino/
Все заработало, но проблема в колличестве загораемых светодиодов: по скетчу автора их загораеться 16, а мне нужно 20 (так как у меня 20 ступенек). С паяльником и схемотехникой дружу, а вот с прогрпммированием, к сожалению, нет :(. Пробовал разобраться сам, изучал http://code.google.com/p/arduino-m5451-current-driver/ но так и не допер, что нужно поменять, что бы засветились 20 светиков , а не 16. Буду ОЧЕНЬ благодарен за подсказку ! Ато каждый вечер, при подъеме в темноте на 2 этаж, вспоминаю, что лежит не доделанная подсветка. Автор, к сожалению не ответил на письмо :(
Скетч автора выглядит так:
#include "lightuino3.h" #include "Ultrasonic.h" //Устанавливаем контакты для первого датчика #define TRIG_PIN 12 #define ECHO_PIN 13 //Устанавливаем контакты для второго датчика #define TRIG2_PIN 10 #define ECHO2_PIN 11 //Определяем первый датчик Ultrasonic OurModuleUp(TRIG_PIN, ECHO_PIN); //Определяем второй датчик Ultrasonic OurModuleDown(TRIG2_PIN, ECHO2_PIN); // pins 0, 1 used by Serial const unsigned char DataPin = 6; const unsigned char clockPin = 7; // задержка между ступеньками const long lightSpacing = 280; //задержка свечения всей лестницы const long lightHold = 10000; //задержка выстрела сенсоров const long pingReadDelay = 50; // Диапазон при котором сработает сенсор const float minBottomIn = 33.0f; const float minTopIn = minBottomIn; LightuinoSink sinks(clockPin, DataPin, 100, 4); boolean bClimbStarted = false; boolean bDescentStarted = false; int val; void setup() { Serial.begin(9600); pinMode(DataPin, OUTPUT); pinMode(clockPin, OUTPUT); delay(1000); sinks.set(0,0,0); } void loop() { val = analogRead(0); //Проверяем освещенность в помещении if (val>=1020){ UltrasonicDownFire();//Выстрел нижнего датчика if(bClimbStarted) { bClimbStarted = false; bDescentStarted = false; climbLightSequence(); } else { // Выстрел верхнего датчика UltrasonicUpFire(); if(bDescentStarted) { bClimbStarted = false; bDescentStarted = false; descentLightSequence(); } } delay(pingReadDelay); } } //Обработка верхнего датчика void UltrasonicUpFire() { if((OurModuleUp.Ranging(INC) < minTopIn) && (OurModuleUp.Ranging(INC) > 0)) { Serial.println("Top sensor tripped."); bDescentStarted = true; } } //Обработка нижнего датчика] void UltrasonicDownFire() { if((OurModuleDown.Ranging(INC) < minTopIn) && (OurModuleDown.Ranging(INC) > 0)) { Serial.println("Bottom sensor tripped."); bClimbStarted = true; } } void climbLightSequence(){ LedsOnDown(); } void LedsOnDown(){ //Обнуляем byte ledState[9]; for (int j=0;j=0;k--) { for (int j=8;j>=1;j--) { ledState[k] = (ledState[k] >> 1) + 128; sinks.set(ledState); delay(lightSpacing); } } //Задержка delay(lightHold); //Гасим for (int k=1;k>=0;k--) { for (int j=8;j>=1;j--) { ledState[k] = (ledState[k] >> 1); sinks.set(ledState); delay(lightSpacing); } } delay(pingReadDelay); } void descentLightSequence(){ LedsOnUp(); } void LedsOnUp(){ //Обнуляем byte ledState[9]; for (int j=0;j ledState[j] = B00000000; } //Зажигаем for (int k=0;k { for (int j=0;j { ledState[k]=(ledState[k] << 1) + 1; sinks.set(ledState); delay(lightSpacing); } } delay(lightHold); for (int k=0;k { for (int j=0;j { ledState[k]=(ledState[k] << 1); sinks.set(ledState); delay(lightSpacing); } } delay(pingReadDelay); }
Простите не заметил сразу как всавлять программный код в сообщение. А отредактировать сообщение не пойму как :(
Рекомендую вам выбросить этот код и написать свой. Не использую этих бесполезных библиотек.
Рекомендую вам выбросить этот код и написать свой. Не использую этих бесполезных библиотек.
К сожалению, я не силен в написании :( А обидно, работает но не до конца ...
Для начала давайте избавимся от бестолковой библиотеки Ultrasonic.h
В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?
Для начала давайте избавимся от бестолковой библиотеки Ultrasonic.h
В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?
Спасибо за отклик !
нет :( в монитор мусор какойто постоянно сыпет без влияния датчиков даже
Не может такого быть. Какой мусор? копируйте и сюда выложите, вы скорость сериал-соединения правильно установили?
Если у вас датчики HC-SR04 и они правильно подключены, то все должно работать. Единственное что может не работать - это 1 датчик из-за того что Е1 на 13 выводе - это я подправил, но никак не мусор.
Сори, скорость нета действительно стояла
Работает ! Пишет расстояние !
Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:
Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:
Моргают !
Ну а теперь давайте попробуем подвигать их туда - сюда. Туда:
Кстати, если двигаются, то куда? снизу-вверх или сверху-вниз?
Зажигаеться последовательно только 8 штук Двигаються от output bit 1
Так все загораются?
Так все загораются?
Мигает только 8. Не по очереди а все 8 сразу
А пример из сообщения #8 ?
А пример из сообщения #8 ?
там мигают все, только что перепроверил !
А так?
А так?
так все заграются по порядку ! правда у меня 20й (последний) не распаян на плате но думаю и там все ок
Померял на 20м выходе тестором все ОК !
Ну и остается объединить в один кода два примера и задать условия:
Зажигаются периодически сами по себе без датчиков и с 1 по 20.
Я бы еще сделал например так, что когда срабатывает один датчик светодиоды загораются, поднимаешься/спускаешься по леснице - проходжишь через второй датчик и только после этого светодиоды тухнут, ну и естественно на тот случай если первый датчик сработал, а второй нет - тоесть на лесницу кто-то вошел, но не вышел, светодиоды тухли бы через некоторое время. Все это для того что бы не вычислять время, за которое человек поднимается/спускается, ну и мало ли остановился на леснице.
Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.
Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.
И так загораются сами по себе с 1 по 20 без влияния датчиков :( И еще у меня в семе есть фоторезистор (для включения светиков только в темное время суток).
Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.
Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.
Ок проверю есче. Попробую уменшить расстояние выстрела датчика. Отпишусь.
Уменшил расстояние УЗ датчиков до 50 см. В итоге работает вроде как так: при вкл. ждет срабатывания датчика. Срабатывет правильно, тоесть зажигает или снизу или сверху в зависимости от датчика. Но ! после 1 срабатывания работа зацикливаеться - после срабатывания идет -поджих светиков - потухли - снова поджих через паузу - поджиг итд но без ожидания сработки датчика. Нужно, что ли, какоето обнуление схемы, ожидание начального сотояния.... Пр ивкл. схемы ардуина мигает красным, ждет срабатывания датчика, а после первого срабатывания уже не мигает, а просто периодически поочередно засвечивает. Вот как то так.
В коде ошибка была - в циклах везде минусы стояли.
Еще заметил: если при сработке верхнего датчика светики загораются сверху вних потом тухнут и снова загораются но уже снизу вверх.
Почти порядок. При срабатывании светиков от конца в начало не тухнет последний светик. Потом при сработке наоборот он тухнет.
Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?
Я Вам очень признателен и благодпрен Максим !!! Даже и не думал, что кто то так поможет. Думал может разве что подсказочку дадут, а Вы молодец ! Респект !
Еще был бы благодарен за внедрение в скетч работы моего фоторезистора. Может можно просто скопировать кусок из того скетча.
Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?
При срабатывании датчика подключенного к контактам 12 и 13 ардуины. Светики загораються по порядку но последний не тухнет. Если идет сработка опять же етого датчика то светик тухнет и засвечиваются сначала и опять последний не тухнет до сработки датчиков.
По поводу фоторезистора - просто обверните в условие кусок кода с 25 по 55 строки. Предварительно посмотрев через стандартный пример AnalogReadSerial какие значения выдает фоторезистор.
Вот так все верно загораеться и тухнет! Пасибки ! А регулировать скорость загорания и скорость затухания светиков етим? Тоесть, к примеру, что бы светики загорались медленнее и тухли медленнее. Оно
-
delay(100);
// задержка зажигания
иdelay(100);
// задержка затухания
???Да, плюс еще есть задержка свечения, та что 3 секунды.
Да, плюс еще есть задержка свечения, та что 3 секунды.
Да да, спасибо, я понял. Еще раз премного Вам благодарен !!! В Вашем скетче хоть немножко и мне понятно ;) Хорошо, что не перевелись еще такие как Вы !
Максим помогите еще плз. Попробовал только что выгрызть кусок для фоторезистора но не компилиться :( Нехвтает моих мозгов :) При тех значених вроде нормальн работало.
Так покажите что не компилируется.
Нужны ети строки или еще что то ? И как ето обернуть в условие ? И куда их впихнуть ? (перед измерением расстоянияили все равно куда). Простите за такие нубские вопросы :) Как я писал, с программированием у меня БЕДА !
Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?
Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?
Нет не смотрел . Просто у меня на том скетче работало. Когда фоторезистор вниз подстол наклонял- срабатывала подсветка а подымал вверх на свет - не срабатывала.
Как видите есть зона нечувствительности
то есть включится при значении больше 1020, а выключится только если ниже 1000, можете уменьшить или увеличить зону нечувствительности.
Еще раз ОГРОМНОЕ спасибо ! Работает ! Только пришлось фонариком засветить что бы не срабатывал :). Но с этим, благодаря Вам я думаю справлюсь ;)
Может кому еще интересно будет смогу выложить фото или видео (пока только в настольном варианте). И всем буду писать что скомпилировано благодаря хорошему человеку аля maksim.
Увеличте порог выключения
if
(analogRead(FOTO) < 1015) state = 0;
// порог освещенности выключения
Пробовал играться значением:
1015
// порог освещенности выключения
. Сначала не понял почему разницы особо не было :) , а оказалось етот фоторезистор немного "слеповат" к теплому спектру лучей (мои экономки в люстре).От холодного белого (рядом стоящая настольная лампа) срабатывает. Так что подстрою уж под свое освещение ;)У фоторезистора какой номинал подтягивающего резистора?
У фоторезистора какой номинал подтягивающего резистора?
10к
То есть это у резистора номинал 10 кОм, а не фоторезистора, правильно?
То есть подключено так?
Тогда попробуйте резистор на 20кОм или выше, или вообще уберите его и такой код залейте:
Ну и естественно поиграйтесь порогами включения/выключения.
А лучше, что бы долго не искать залейте этот пример и посмотрите в мониторе как меняются значения:
Схемка верна. Завтра поробую еще поиграться. Спасибо за советы !!!