Автоматическая подсветка лестницы и 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
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 void setup() { Serial.begin(9600); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); } void loop() { Serial.print("D1 = "); Serial.print(Ultrasonic(T1, E1)); Serial.print("cm D2 = "); Serial.print(Ultrasonic(T2, E2)); Serial.println("cm"); delay(100); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; }В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?
Для начала давайте избавимся от бестолковой библиотеки Ultrasonic.h
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 void setup() { Serial.begin(9600); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); } void loop() { Serial.print("D1 = "); Serial.print(Ultrasonic(T1, E1)); Serial.print("cm D2 = "); Serial.print(Ultrasonic(T2, E2)); Serial.println("cm"); delay(100); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; }В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?
Спасибо за отклик !
нет :( в монитор мусор какойто постоянно сыпет без влияния датчиков даже
Не может такого быть. Какой мусор? копируйте и сюда выложите, вы скорость сериал-соединения правильно установили?
Если у вас датчики HC-SR04 и они правильно подключены, то все должно работать. Единственное что может не работать - это 1 датчик из-за того что Е1 на 13 выводе - это я подправил, но никак не мусор.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 void setup() { Serial.begin(9600); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(E2, INPUT); digitalWrite(E1, HIGH); digitalWrite(E2, HIGH); } void loop() { Serial.print("D1 = "); Serial.print(Ultrasonic(T1, E1)); Serial.print("cm D2 = "); Serial.print(Ultrasonic(T2, E2)); Serial.println("cm"); delay(100); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; }Сори, скорость нета действительно стояла
Работает ! Пишет расстояние !
Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:
//Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { MM5450(0xFFFFFFFF); delay(1000); MM5450(0x00000000); delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, HIGH); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, LOW); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:
Моргают !
Ну а теперь давайте попробуем подвигать их туда - сюда. Туда:
uint32_t mask = 0b11111111111111111111; //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { for(char i = 19; i >= 0; i--) { MM5450(mask<<i); delay(100); } delay(1000); for(char i = 0; i < 20; i--) { MM5450(mask>>i); delay(100); } delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { digitalWrite(DATA, data&(1UL<<i)); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Кстати, если двигаются, то куда? снизу-вверх или сверху-вниз?
Зажигаеться последовательно только 8 штук Двигаються от output bit 1
Так все загораются?
uint32_t mask = 0b11111111111111111111; //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { MM5450(0xFFFFFFFF); delay(1000); MM5450(0); delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { digitalWrite(DATA, data&(1UL<<i)); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Так все загораются?
uint32_t mask = 0b11111111111111111111; //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { MM5450(0xFFFFFFFF); delay(1000); MM5450(0); delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { digitalWrite(DATA, data&(1UL<<i)); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Мигает только 8. Не по очереди а все 8 сразу
А пример из сообщения #8 ?
А пример из сообщения #8 ?
там мигают все, только что перепроверил !
А так?
uint32_t mask = 0b11111111111111111111; //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { for(char i = 19; i >= 0; i--) { MM5450(mask<<i); delay(100); } delay(1000); for(char i = 0; i < 20; i--) { MM5450(mask>>i); delay(100); } delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }А так?
uint32_t mask = 0b11111111111111111111; //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { for(char i = 19; i >= 0; i--) { MM5450(mask<<i); delay(100); } delay(1000); for(char i = 0; i < 20; i--) { MM5450(mask>>i); delay(100); } delay(1000); } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }так все заграются по порядку ! правда у меня 20й (последний) не распаян на плате но думаю и там все ок
Померял на 20м выходе тестором все ОК !
Ну и остается объединить в один кода два примера и задать условия:
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { if(Ultrasonic(T1, E1) < 100) // если расстояние первого датчика меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } if(Ultrasonic(T2, E2) < 100) // если расстояние второго датчика меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Зажигаются периодически сами по себе без датчиков и с 1 по 20.
Я бы еще сделал например так, что когда срабатывает один датчик светодиоды загораются, поднимаешься/спускаешься по леснице - проходжишь через второй датчик и только после этого светодиоды тухнут, ну и естественно на тот случай если первый датчик сработал, а второй нет - тоесть на лесницу кто-то вошел, но не вышел, светодиоды тухли бы через некоторое время. Все это для того что бы не вычислять время, за которое человек поднимается/спускается, ну и мало ли остановился на леснице.
Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i--) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }И так загораются сами по себе с 1 по 20 без влияния датчиков :( И еще у меня в семе есть фоторезистор (для включения светиков только в темное время суток).
Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.
Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.
Ок проверю есче. Попробую уменшить расстояние выстрела датчика. Отпишусь.
Уменшил расстояние УЗ датчиков до 50 см. В итоге работает вроде как так: при вкл. ждет срабатывания датчика. Срабатывет правильно, тоесть зажигает или снизу или сверху в зависимости от датчика. Но ! после 1 срабатывания работа зацикливаеться - после срабатывания идет -поджих светиков - потухли - снова поджих через паузу - поджиг итд но без ожидания сработки датчика. Нужно, что ли, какоето обнуление схемы, ожидание начального сотояния.... Пр ивкл. схемы ардуина мигает красным, ждет срабатывания датчика, а после первого срабатывания уже не мигает, а просто периодически поочередно засвечивает. Вот как то так.
В коде ошибка была - в циклах везде минусы стояли.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i++) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i < 20; i++) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Еще заметил: если при сработке верхнего датчика светики загораются сверху вних потом тухнут и снова загораются но уже снизу вверх.
Почти порядок. При срабатывании светиков от конца в начало не тухнет последний светик. Потом при сработке наоборот он тухнет.
Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?
Я Вам очень признателен и благодпрен Максим !!! Даже и не думал, что кто то так поможет. Думал может разве что подсказочку дадут, а Вы молодец ! Респект !
Еще был бы благодарен за внедрение в скетч работы моего фоторезистора. Может можно просто скопировать кусок из того скетча.
Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?
При срабатывании датчика подключенного к контактам 12 и 13 ардуины. Светики загораються по порядку но последний не тухнет. Если идет сработка опять же етого датчика то светик тухнет и засвечиваются сначала и опять последний не тухнет до сработки датчиков.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }По поводу фоторезистора - просто обверните в условие кусок кода с 25 по 55 строки. Предварительно посмотрев через стандартный пример AnalogReadSerial какие значения выдает фоторезистор.
Вот так все верно загораеться и тухнет! Пасибки ! А регулировать скорость загорания и скорость затухания светиков етим? Тоесть, к примеру, что бы светики загорались медленнее и тухли медленнее. Оно
-delay(100);// задержка зажиганияиdelay(100);// задержка затухания???Да, плюс еще есть задержка свечения, та что 3 секунды.
Да, плюс еще есть задержка свечения, та что 3 секунды.
Да да, спасибо, я понял. Еще раз премного Вам благодарен !!! В Вашем скетче хоть немножко и мне понятно ;) Хорошо, что не перевелись еще такие как Вы !
Максим помогите еще плз. Попробовал только что выгрызть кусок для фоторезистора но не компилиться :( Нехвтает моих мозгов :) При тех значених вроде нормальн работало.
Так покажите что не компилируется.
Нужны ети строки или еще что то ? И как ето обернуть в условие ? И куда их впихнуть ? (перед измерением расстоянияили все равно куда). Простите за такие нубские вопросы :) Как я писал, с программированием у меня БЕДА !
// Диапазон при котором сработает сенсор const float minBottomIn = 33.0f; const float minTopIn = minBottomIn; val = analogRead(0); //Проверяем освещенность в помещении if (val>=1020){Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?
Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?
Нет не смотрел . Просто у меня на том скетче работало. Когда фоторезистор вниз подстол наклонял- срабатывала подсветка а подымал вверх на свет - не срабатывала.
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 //Устанавливаем контакт фоторезистора #define FOTO A0 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); } void loop() { static bool state; if(analogRead(FOTO) > 1020) state = 1; // порог освещенности включения if(analogRead(FOTO) < 1000) state = 0; // порог освещенности выключения if(state) { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Как видите есть зона нечувствительности
то есть включится при значении больше 1020, а выключится только если ниже 1000, можете уменьшить или увеличить зону нечувствительности.
Еще раз ОГРОМНОЕ спасибо ! Работает ! Только пришлось фонариком засветить что бы не срабатывал :). Но с этим, благодаря Вам я думаю справлюсь ;)
Может кому еще интересно будет смогу выложить фото или видео (пока только в настольном варианте). И всем буду писать что скомпилировано благодаря хорошему человеку аля maksim.
Увеличте порог выключения
if(analogRead(FOTO) < 1015) state = 0;// порог освещенности выключенияПробовал играться значением:
1015// порог освещенности выключения. Сначала не понял почему разницы особо не было :) , а оказалось етот фоторезистор немного "слеповат" к теплому спектру лучей (мои экономки в люстре).От холодного белого (рядом стоящая настольная лампа) срабатывает. Так что подстрою уж под свое освещение ;)У фоторезистора какой номинал подтягивающего резистора?
У фоторезистора какой номинал подтягивающего резистора?
10к
То есть это у резистора номинал 10 кОм, а не фоторезистора, правильно?

То есть подключено так?
Тогда попробуйте резистор на 20кОм или выше, или вообще уберите его и такой код залейте:
//Устанавливаем контакты для первого датчика #define T1 12 #define E1 13 //Устанавливаем контакты для второго датчика #define T2 10 #define E2 11 //Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 //Устанавливаем контакт фоторезистора #define FOTO A0 const uint32_t mask = 0b11111111111111111111; void setup() { pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); digitalWrite(FOTO, HIGH); } void loop() { static bool state; if(analogRead(FOTO) > 1000) state = 1; // порог освещенности включения if(analogRead(FOTO) < 990) state = 0; // порог освещенности выключения if(state) { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask>>i); delay(100); // задержка затухания } } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(100); // задержка зажигания } delay(3000); // ждем 3 секунды for(char i = 0; i <= 20; i++) // тушим светодиоды { MM5450(mask<<i); delay(100); // задержка затухания } } } delay(20); } int Ultrasonic(byte Trig_pin, byte Echo_pin) { digitalWrite(Trig_pin, HIGH); delayMicroseconds(10); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000)/29.0/2; } void MM5450(uint32_t data) { digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for(byte i = 0; i < 20; i++) { if(data & (1UL<<i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for(byte i = 0; i < 15; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }Ну и естественно поиграйтесь порогами включения/выключения.
А лучше, что бы долго не искать залейте этот пример и посмотрите в мониторе как меняются значения:
#define FOTO A0 void setup() { Serial.begin(9600); digitalWrite(FOTO, HIGH); } void loop() { Serial.println(analogRead(FOTO)); delay(100); }Схемка верна. Завтра поробую еще поиграться. Спасибо за советы !!!