Maksim, я с програмированием вообще никак. Стыдно конечно. Но, в 45 лет не лезит в голову, как не стараюсь. Решил сделать подсветку в прихожей, залил соответственно этот скетч, с 42 поста. Все настроил, работает. У меня вопрос, нелья сделать так если в момент включенного освещения, проходит второй человек, свечение не выключалось по заданному в программе времени, а продливалось на некоторое время. И по последнему срабатыванию сенсора измнялось направление выключения светодиодов.
На данный момент, получается так. Человек вышел, подсветка ещё горит. Второй пошел, а у него на половине пути, освещение выключится. Т.е, топай в потёмках.
здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки
Здравствуйте.. попытался сделать ШИМ на 5451... впринципе выходит вполне красиво...
но он полу ручной, то есть некоторые цифры прописаны вручную.
у кого есть идеи как унифицировать - давайте подумаем...
//Устанавливаем контакты для драйвера
#define DATA 8
#define CLOCK 12
//Устанавливаем контакт фоторезистора
#define FOTO A0
//Устанавливаем контакты для первого датчика
#define T1 10
#define E1 6
//Устанавливаем контакты для второго датчика
#define T2 5
#define E2 4
//Устанавливаем контакты для Третьего датчика
#define T3 3
#define E3 2
//Устанавливаем контакт управления яркостью светодиодов
#define BR 9
const byte brightset = 250;// яркость включенной лестницы
const byte brightsetFirstLast = 1; // яркость первой и последнй ступеньки
//Задаем количество светодиодов
#define NUM_LEDS 14
#define NUM_MIDDLE_LEDS 9
const uint32_t masky []= {
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b0000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000000000000000001,
0b1000000000000000100000000000001,
0b1000000000100000000000100000001,
0b1000000000000000100000000000001,
0b1000000100000001000000010000001,
0b1000000100000001000000010000001,
0b1000010000010000001000001000001,
0b1000010000010000001000001000001,
0b1000100001000010000100001000001,
0b1000100001000010000100001000001,
0b1010101010101010101010101010101,
0b1101101101101101101101101101101,
0b1111011111011111101111110111111,
0b1111111111111111111111111111111,
};
const uint32_t shadow[] =
{ // бегущая тень
0b11111111111111111110,
0b11111111111111111101,
0b11111111111111111011,
0b11111111111111110111,
0b11111111111111101111,
0b11111111111111011111,
0b11111111111110111111,
0b11111111111101111111,
0b11111111111011111111,
0b11111111110111111111,
0b11111111101111111111,
0b11111111011111111111,
0b11111110111111111111,
0b11111101111111111111,
0b11111011111111111111,
0b11110111111111111111,
0b11111111111111111111,
};
unsigned long FirstLastBitDec; // количество ступенек в двоичном коде типо 0b100000000000000000000....
unsigned long MidleBitDec; // количество ступенек до первого перерыва в двоичном коде типо 0b0000000100000000000000....
uint32_t piss;
uint32_t data;
void setup()
{
Serial.begin(9600);
pinMode(DATA, OUTPUT);
pinMode(CLOCK, OUTPUT);
digitalWrite(CLOCK, HIGH);
digitalWrite(FOTO, HIGH);
pinMode(BR, OUTPUT);
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
pinMode(E1, INPUT);
pinMode(T3, OUTPUT);
pinMode(E3, INPUT);
pinMode(E2, INPUT);
digitalWrite(E1, HIGH);
digitalWrite(E2, HIGH);
DetectBitNumLeds();
FirstLast();
}
void loop() // Основной цикл.
{
//Serial.println(analogRead(FOTO)); //Serial.println(BitDec); // Serial.println(" ");
delay(10);
static bool state, state0;
if (analogRead(FOTO) > 500) state0 = 1; // включение выключеие дежурки
if (analogRead(FOTO) < 200) // гистерезис отключения дежурки
{
state0 = 0;
analogWrite(BR, LOW);
}
if (state0 == 1) FirstLast();
if (analogRead(FOTO) > 500) state = 1; // порог освещенности включения
//else analogWrite(9, LOW); // выключаем ночную подсветку
if (analogRead(FOTO) < 200) state = 0; // порог освещенности выключения
// else analogWrite(9, HIGH); // включаем ночную подсветку
if (state)
{
int D1 = Ultrasonic(T1, E1); // измеряем расстояние НИЖНЕГО датчика
// Serial.print("BOT");
// Serial.println(D1);
if (D1 > 0 && D1 < 80) // если расстояние меньше 70см, то
TurnOnBotTop ();
int D2 = Ultrasonic(T2, E2); // измеряем расстояние ВЕРХНЕГО датчика
// Serial.print("TOP");
// Serial.println(D2);
if (D2 > 0 && D2 < 80) // если расстояние меньше 70см, то
TurnOnTopBot ();
int D3 = Ultrasonic(T3, E3); // измеряем расстояние ВЕРХНЕГО датчика
// Serial.print("MID");
// Serial.println(D3);
if (D3 > 0 && D3 < 80) // если расстояние меньше 70см, то
TurnOnMidle ();
//delay (5000);
//TurnOffMidle();
}
}
void TurnOnMidle ()
{
unsigned long PriviusMidleBitDecBot=0;
unsigned long PriviusMidleBitDecTop=0;
analogWrite (BR, brightset);
if ((NUM_LEDS-NUM_MIDDLE_LEDS)>=NUM_MIDDLE_LEDS)
{
for (char i = 1; i <NUM_MIDDLE_LEDS-1; i++)
{
unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop;
unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot;
PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec);
//delay(300); // задержка зажигания
PriviusMidleBitDecBot=LesenkaBot;
PriviusMidleBitDecTop=LesenkaTop;
}
for (char i = NUM_MIDDLE_LEDS-1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++)
{
unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop;
unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot;
PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+MidleBitDec);
// delay(300); // задержка зажигания
PriviusMidleBitDecBot=LesenkaBot;
PriviusMidleBitDecTop=LesenkaTop;
}
//delay(500);
for (char i= 1; i< NUM_MIDDLE_LEDS-1 ;i++)
{
unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec);
//delay(300);
}
for (char i= NUM_MIDDLE_LEDS-1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++)
{//Serial.println(i);
unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
PWMOFF_MM5450(LesenkaTop+MidleBitDec+1);
// delay(300);
}
}
else
{
for (char i = 1; i <= NUM_LEDS-NUM_MIDDLE_LEDS-1; i++)
{
unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop;
unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot;
PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec);
PriviusMidleBitDecBot=LesenkaBot;
PriviusMidleBitDecTop=LesenkaTop;
//delay(300);// задержка зажигания
}
for (char i = NUM_LEDS-NUM_MIDDLE_LEDS; i < NUM_MIDDLE_LEDS-1; i++)
{
unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop;
unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot;
PWM_MM5450(LesenkaTop+LesenkaBot+MidleBitDec+1);
PriviusMidleBitDecBot=LesenkaBot;
PriviusMidleBitDecTop=LesenkaTop;
//delay(300);// задержка зажигания
}
// delay(500);
for (char i= 1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++)
{
unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec);
//delay(300);
}
for (char i= NUM_LEDS-NUM_MIDDLE_LEDS+1; i< NUM_MIDDLE_LEDS ;i++)
{
unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i);
unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i);
PWMOFF_MM5450(LesenkaBot+MidleBitDec+LesenkaTop+FirstLastBitDec);
// delay(300);
}
}FirstLastAfterON();
}
void TurnOnBotTop () //Зажигаем лестницу снизу вверх
{
analogWrite (BR, brightset);
for (char i = NUM_LEDS - 1; i >NUM_LEDS-NUM_MIDDLE_LEDS; i--) // зажигаем светодиоды в другую сторону
{
PWM_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec+MidleBitDec);
//delay(300); // задержка зажигания
}
for (char i = NUM_LEDS-NUM_MIDDLE_LEDS - 1; i >0; i--) // зажигаем светодиоды в другую сторону
{
PWM_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec);
//delay(300); // задержка зажигания
}
// delay(500); // ждем 0,5 секунд
for (int j = 0; j <= 2; j++) // бегущая тень
{
// delay(1000);
for (int k = 0; k <= NUM_LEDS; k++)
{
PWM_MM5450(shadow[k]);
// delay(100);
}
}
for (char i = 1; i < NUM_MIDDLE_LEDS; i++) // тушим светодиоды
{
PWMOFF_MM5450((FirstLastBitDec*2-1 << i)+1);
//delay(300); // задержка затухания
}
for (char i = NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды
{
PWMOFF_MM5450((FirstLastBitDec*2-1 << i)+1+MidleBitDec);
//delay(300); // задержка затухания
}
FirstLastAfterON();
}
void TurnOnTopBot () // зажигаем лестницу сверху вниз
{
analogWrite (BR, brightset);
for (char i = NUM_LEDS-1; i > NUM_MIDDLE_LEDS; i--) // зажигаем светодиоды в одну сторону
{
PWM_MM5450((FirstLastBitDec*2-1 << i)+1+MidleBitDec);
// delay(300); // задержка зажигания
}
for (char i = NUM_MIDDLE_LEDS-1; i > 0; i--) // зажигаем светодиоды в одну сторону
{
PWM_MM5450((FirstLastBitDec*2-1 << i)+1);
// delay(300); // задержка зажигания
}
// delay(500); // ждем 15 секунд
for (int j = 0; j <= 2; j++) //бегущая тень
{
PWM_MM5450(shadow[16]);
for (int k = NUM_LEDS; k >=0; k--)
{
PWM_MM5450(shadow[k]);
// delay(100);
}
}
for (char i = 1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++) // тушим светодиоды
{
PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec);
// delay(300); // задержка затухания
}
for (char i = NUM_LEDS-NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды
{
PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec+MidleBitDec);
// delay(300); // задержка затухания
}
FirstLastAfterON();
}
void DetectBitNumLeds()//определяем число ступенек в BIN формате первой, последней и той что по середине исходя из количества ступенек
{
FirstLastBitDec=1;
MidleBitDec=1;
for (int i=1;i<NUM_LEDS;i++)
{
FirstLastBitDec=FirstLastBitDec*2;
Serial.println(FirstLastBitDec);
}
for (int j=1;j<NUM_MIDDLE_LEDS;j++)
{
MidleBitDec=MidleBitDec*2;
Serial.println(MidleBitDec);
}
}
void FirstLastAfterON()// зажигаем первую последнюю и ту что посередине после того как прошел
{ for (int i=brightset;i>=brightsetFirstLast;i--)
{analogWrite (BR, i);
MM5450(FirstLastBitDec+MidleBitDec+1);
}
analogWrite (BR, brightsetFirstLast);
MM5450(FirstLastBitDec+MidleBitDec+1);
}
void FirstLast()// зажигаем первую последнюю и ту что посередине
{
analogWrite (BR, brightsetFirstLast);
MM5450(FirstLastBitDec+MidleBitDec+1);
}
int Ultrasonic(byte Trig_pin, byte Echo_pin)// расчитвыем расстояние ультрасоников
{
digitalWrite(Trig_pin, HIGH);
delayMicroseconds(20);
digitalWrite(Trig_pin, LOW);
return pulseIn(Echo_pin, HIGH, 20000) / 29.0 / 2;// возвращение дистанции в см
}
void PWM_MM5450(uint32_t data) // шим включения ступеньки
{
for (int j=0;j<=19;j++)
{
for (int i=0;i<=32;i++)
{
if (masky[j] & (1UL << i))
{
MM5450(data);
}
else
{MM5450(piss);
}
}
}piss=data;
}
void PWMOFF_MM5450(uint32_t data) // шим выключения ступеньки
{
for (int j=19;j>=0;j--)
{
for (int i=0;i<=32;i++)
{
if (masky[j] & (1UL << i))
{
MM5450(piss);
}
else
{MM5450(data);
}
}
}piss=data;
}
void MM5450(uint32_t jopa) // програмка зажигания ступеньки
{byte i;
digitalWrite(DATA, 1);
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
for (i = 0; i < NUM_LEDS; i++)
{
if (jopa & (1UL << i)) digitalWrite(DATA, HIGH);
else digitalWrite(DATA, LOW);
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
}
digitalWrite(DATA, 0);
for (byte j = 0; j < 35 - NUM_LEDS; j++)
{
digitalWrite(CLOCK, LOW);
digitalWrite(CLOCK, HIGH);
}
}
код писал для себя, у меня есть еще вход в комнату по середине лестницы, поэтому используется три датчика (не обращайте внимание на горящую посерединке ступеньку либо закомментируйте). проверьте pinы от ардуины.
проблемы в том что не использую delay(); а значит установить какие то временные рамки не могу нормально, приходится изголяться..
здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки
Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.
Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.
Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.
Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.
вообще любой пойдет, какой понравится - такой бери....
У меня ардуину будет питает один маломощный БП, а на ленты питание будет идти от другого мощного ватт на 150 БП. Я тут задумался над таким вопросом: зачем постоянно держать под напругой этот мощный БП особенно днем, может запитать его через доп. реле, а этим реле будет управлять ардуина? Кто-нибудь делал такое?
Так что ж там заводить розетка 220 вольт в которую ,кстати, будет подключены и Ваши блоки питания, и для Андруино, и для лент, а нагрузкой у него те же блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.
Так что ж там заводить розетка 220 вольт в которую ,кстати, будет подключены и Ваши блоки питания, и для Андруино, и для лент, а нагрузкой у него те же блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.
Свет включили - все отрубилось по датчику... Зачем вам отрубать БП? пусть даже и мощный, на холостом ходу сколько он потребляет? полватта? ватт? 1.5-2 рубля мнимой экономии в месяц вам погоду не сделают, а дергать питание ардуины лишний раз смысла нет... Вспомните свой опыт - лампочки в 90% случаях сгорают при включении, ардуина не лампочка, но лишний раз ее дергать не стоит.
а зачем его держать постоянно под напряжением? он же 75% времени будет бездействовать
Обесточивать или нет - ваше личное дело. К чему вас переубеждать? тем более вы сами себя убедили уже в необходимости экономить 1.5-2р в месяц))
У меня куча сотрудников, которые работают за компами, компы никогда не выключаются (по причине того, что по ночам устанавливаются обновления и часть процессов запускаются в ночь). Через 1 час бездействия они конечно "засыпают", потребление снижается в разы, но они все равно потребляют энергию. Но это не суть, есть у меня безопасник, который в силу своей профессиональной специфики постоянно выключает монитор, а когда уходит вечером домой, то и компьютер. Так вот ему я меняю монитор и комп каждые 3 года, другие сотрудники уже и по 5 лет отработали: компы живут, на паре мониторов подсветку меняли... и все))
PS. Помню был у меня когда-то в инстутитуте предмет - "Переходные процессы" - жуткая вещь... вспоминая все что происходит при включении оборудования совсем пропадает желание что-то выключать))) Ну это так, лирическое отступление... сорри за оффтоп.
Главная беда с ШИМ на 5450, длинный цикл загрузки данных. После того как в предел по даташиту его упихал, получается добрых 60мкс, что весьма не мало и оставляет нам пространство только для 16кГц несущей частоты, если мы берем 8бит ШИМ, еле выходит 60Гц частоты ШИМ... К тому же, при таких накладных, держать дежурку на ШИМ вообще не реально и надо ее выставлять через Brightness pin.
R33 это перемычка, поставь 10Ом если хочешь, разницы никакой.. больше 1 кОм - работать не будет... Имхо, резистора там не нужно...
R34 это переменный резистор, на сколько понял от датчика освещения или для замены датчика... там надо подбирать в зависимости от датчика освещения, думаю не больше 1-10 кОм , програмно потом подбираются состояния...
как уже писал выше у меня отличается... по середине лестницы есть еще один вход с полуторного этажа ) поэтому использую три датчика движения.. если поможет , то пользуйся)
это лежит сейчас на тумбочке.. лестница еще не до конца готова.. все проверено, все работает
Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).
Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).
Скажите пожалуйста на какой схеме вы попробовали данный скейч и работает супер выложите пожалуйста линк
Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?
Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?
А что вы имеете в виду из-за блока какой ток нужен если у мкня 16 светильников по 9ват, и что не нужны резисторы на 47 а на 10ком
то что у меня китайский импульсный блок питания, не обращай внимание... если у тебя 16 светиков по 9ват, то и нужно около 150 вт +25%. итого бери 200 вт, не ошибешься...
Привет ! К сожалению, я не знаю русский язык , так пишет tranzlator . У меня есть проблема , что я не могу добавить вручную датчика hcsr04 на этот код , если вы можете мне помочь? приветствия
Вопрос снят.
Проблемой битый контакт.)
Бывает. Всегда есть 2 причины неисправости - есть контакт там где не нужно или нету контакта там где нужно ;)
скажите пожалуйста R14 для чего нужна, а то я уже 4-ый раз пробую и никак не получяется
Проблемой битый контакт.)
за один битый контакт два небитых дают.
Изготавление печатных плат и подсветка лестници !
Maksim, я с програмированием вообще никак. Стыдно конечно. Но, в 45 лет не лезит в голову, как не стараюсь. Решил сделать подсветку в прихожей, залил соответственно этот скетч, с 42 поста. Все настроил, работает. У меня вопрос, нелья сделать так если в момент включенного освещения, проходит второй человек, свечение не выключалось по заданному в программе времени, а продливалось на некоторое время. И по последнему срабатыванию сенсора измнялось направление выключения светодиодов.
Чувак намудрил слишком. Но в общем понять можно. Это все "инженерно и с запасом" получилось :)
Нет. Нужно переписывать код на "риалтайм", без delay
На данный момент, получается так. Человек вышел, подсветка ещё горит. Второй пошел, а у него на половине пути, освещение выключится. Т.е, топай в потёмках.
здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки
Здравствуйте.. попытался сделать ШИМ на 5451... впринципе выходит вполне красиво...
но он полу ручной, то есть некоторые цифры прописаны вручную.
у кого есть идеи как унифицировать - давайте подумаем...
//Устанавливаем контакты для драйвера #define DATA 8 #define CLOCK 12 //Устанавливаем контакт фоторезистора #define FOTO A0 //Устанавливаем контакты для первого датчика #define T1 10 #define E1 6 //Устанавливаем контакты для второго датчика #define T2 5 #define E2 4 //Устанавливаем контакты для Третьего датчика #define T3 3 #define E3 2 //Устанавливаем контакт управления яркостью светодиодов #define BR 9 const byte brightset = 250;// яркость включенной лестницы const byte brightsetFirstLast = 1; // яркость первой и последнй ступеньки //Задаем количество светодиодов #define NUM_LEDS 14 #define NUM_MIDDLE_LEDS 9 const uint32_t masky []= { 0b0000000000000000000000000000001, 0b0000000000000000000000000000001, 0b0000000000000000000000000000001, 0b0000000000000000000000000000001, 0b1000000000000000000000000000001, 0b1000000000000000000000000000001, 0b1000000000000000000000000000001, 0b1000000000000000100000000000001, 0b1000000000100000000000100000001, 0b1000000000000000100000000000001, 0b1000000100000001000000010000001, 0b1000000100000001000000010000001, 0b1000010000010000001000001000001, 0b1000010000010000001000001000001, 0b1000100001000010000100001000001, 0b1000100001000010000100001000001, 0b1010101010101010101010101010101, 0b1101101101101101101101101101101, 0b1111011111011111101111110111111, 0b1111111111111111111111111111111, }; const uint32_t shadow[] = { // бегущая тень 0b11111111111111111110, 0b11111111111111111101, 0b11111111111111111011, 0b11111111111111110111, 0b11111111111111101111, 0b11111111111111011111, 0b11111111111110111111, 0b11111111111101111111, 0b11111111111011111111, 0b11111111110111111111, 0b11111111101111111111, 0b11111111011111111111, 0b11111110111111111111, 0b11111101111111111111, 0b11111011111111111111, 0b11110111111111111111, 0b11111111111111111111, }; unsigned long FirstLastBitDec; // количество ступенек в двоичном коде типо 0b100000000000000000000.... unsigned long MidleBitDec; // количество ступенек до первого перерыва в двоичном коде типо 0b0000000100000000000000.... uint32_t piss; uint32_t data; void setup() { Serial.begin(9600); pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); digitalWrite(FOTO, HIGH); pinMode(BR, OUTPUT); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(T3, OUTPUT); pinMode(E3, INPUT); pinMode(E2, INPUT); digitalWrite(E1, HIGH); digitalWrite(E2, HIGH); DetectBitNumLeds(); FirstLast(); } void loop() // Основной цикл. { //Serial.println(analogRead(FOTO)); //Serial.println(BitDec); // Serial.println(" "); delay(10); static bool state, state0; if (analogRead(FOTO) > 500) state0 = 1; // включение выключеие дежурки if (analogRead(FOTO) < 200) // гистерезис отключения дежурки { state0 = 0; analogWrite(BR, LOW); } if (state0 == 1) FirstLast(); if (analogRead(FOTO) > 500) state = 1; // порог освещенности включения //else analogWrite(9, LOW); // выключаем ночную подсветку if (analogRead(FOTO) < 200) state = 0; // порог освещенности выключения // else analogWrite(9, HIGH); // включаем ночную подсветку if (state) { int D1 = Ultrasonic(T1, E1); // измеряем расстояние НИЖНЕГО датчика // Serial.print("BOT"); // Serial.println(D1); if (D1 > 0 && D1 < 80) // если расстояние меньше 70см, то TurnOnBotTop (); int D2 = Ultrasonic(T2, E2); // измеряем расстояние ВЕРХНЕГО датчика // Serial.print("TOP"); // Serial.println(D2); if (D2 > 0 && D2 < 80) // если расстояние меньше 70см, то TurnOnTopBot (); int D3 = Ultrasonic(T3, E3); // измеряем расстояние ВЕРХНЕГО датчика // Serial.print("MID"); // Serial.println(D3); if (D3 > 0 && D3 < 80) // если расстояние меньше 70см, то TurnOnMidle (); //delay (5000); //TurnOffMidle(); } } void TurnOnMidle () { unsigned long PriviusMidleBitDecBot=0; unsigned long PriviusMidleBitDecTop=0; analogWrite (BR, brightset); if ((NUM_LEDS-NUM_MIDDLE_LEDS)>=NUM_MIDDLE_LEDS) { for (char i = 1; i <NUM_MIDDLE_LEDS-1; i++) { unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop; unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot; PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec); //delay(300); // задержка зажигания PriviusMidleBitDecBot=LesenkaBot; PriviusMidleBitDecTop=LesenkaTop; } for (char i = NUM_MIDDLE_LEDS-1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++) { unsigned long LesenkaTop = (MidleBitDec << i)+PriviusMidleBitDecTop; unsigned long LesenkaBot = (MidleBitDec >> i)+PriviusMidleBitDecBot; PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+MidleBitDec); // delay(300); // задержка зажигания PriviusMidleBitDecBot=LesenkaBot; PriviusMidleBitDecTop=LesenkaTop; } //delay(500); for (char i= 1; i< NUM_MIDDLE_LEDS-1 ;i++) { unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i); unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i); PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec); //delay(300); } for (char i= NUM_MIDDLE_LEDS-1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++) {//Serial.println(i); unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i); unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i); PWMOFF_MM5450(LesenkaTop+MidleBitDec+1); // delay(300); } } else { for (char i = 1; i <= NUM_LEDS-NUM_MIDDLE_LEDS-1; i++) { unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop; unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot; PWM_MM5450(LesenkaTop+LesenkaBot+FirstLastBitDec+1+MidleBitDec); PriviusMidleBitDecBot=LesenkaBot; PriviusMidleBitDecTop=LesenkaTop; //delay(300);// задержка зажигания } for (char i = NUM_LEDS-NUM_MIDDLE_LEDS; i < NUM_MIDDLE_LEDS-1; i++) { unsigned long LesenkaTop = (MidleBitDec >> i)+PriviusMidleBitDecTop; unsigned long LesenkaBot = (MidleBitDec << i)+PriviusMidleBitDecBot; PWM_MM5450(LesenkaTop+LesenkaBot+MidleBitDec+1); PriviusMidleBitDecBot=LesenkaBot; PriviusMidleBitDecTop=LesenkaTop; //delay(300);// задержка зажигания } // delay(500); for (char i= 1; i<= NUM_LEDS-NUM_MIDDLE_LEDS ;i++) { unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i); unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i); PWMOFF_MM5450(LesenkaTop+LesenkaBot+MidleBitDec); //delay(300); } for (char i= NUM_LEDS-NUM_MIDDLE_LEDS+1; i< NUM_MIDDLE_LEDS ;i++) { unsigned long LesenkaTop = ((FirstLastBitDec-MidleBitDec) << i); unsigned long LesenkaBot = ((MidleBitDec*2-1) >> i); PWMOFF_MM5450(LesenkaBot+MidleBitDec+LesenkaTop+FirstLastBitDec); // delay(300); } }FirstLastAfterON(); } void TurnOnBotTop () //Зажигаем лестницу снизу вверх { analogWrite (BR, brightset); for (char i = NUM_LEDS - 1; i >NUM_LEDS-NUM_MIDDLE_LEDS; i--) // зажигаем светодиоды в другую сторону { PWM_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec+MidleBitDec); //delay(300); // задержка зажигания } for (char i = NUM_LEDS-NUM_MIDDLE_LEDS - 1; i >0; i--) // зажигаем светодиоды в другую сторону { PWM_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec); //delay(300); // задержка зажигания } // delay(500); // ждем 0,5 секунд for (int j = 0; j <= 2; j++) // бегущая тень { // delay(1000); for (int k = 0; k <= NUM_LEDS; k++) { PWM_MM5450(shadow[k]); // delay(100); } } for (char i = 1; i < NUM_MIDDLE_LEDS; i++) // тушим светодиоды { PWMOFF_MM5450((FirstLastBitDec*2-1 << i)+1); //delay(300); // задержка затухания } for (char i = NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды { PWMOFF_MM5450((FirstLastBitDec*2-1 << i)+1+MidleBitDec); //delay(300); // задержка затухания } FirstLastAfterON(); } void TurnOnTopBot () // зажигаем лестницу сверху вниз { analogWrite (BR, brightset); for (char i = NUM_LEDS-1; i > NUM_MIDDLE_LEDS; i--) // зажигаем светодиоды в одну сторону { PWM_MM5450((FirstLastBitDec*2-1 << i)+1+MidleBitDec); // delay(300); // задержка зажигания } for (char i = NUM_MIDDLE_LEDS-1; i > 0; i--) // зажигаем светодиоды в одну сторону { PWM_MM5450((FirstLastBitDec*2-1 << i)+1); // delay(300); // задержка зажигания } // delay(500); // ждем 15 секунд for (int j = 0; j <= 2; j++) //бегущая тень { PWM_MM5450(shadow[16]); for (int k = NUM_LEDS; k >=0; k--) { PWM_MM5450(shadow[k]); // delay(100); } } for (char i = 1; i <NUM_LEDS-NUM_MIDDLE_LEDS; i++) // тушим светодиоды { PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec); // delay(300); // задержка затухания } for (char i = NUM_LEDS-NUM_MIDDLE_LEDS+1; i < NUM_LEDS; i++) // тушим светодиоды { PWMOFF_MM5450((FirstLastBitDec*2-1 >> i)+FirstLastBitDec+MidleBitDec); // delay(300); // задержка затухания } FirstLastAfterON(); } void DetectBitNumLeds()//определяем число ступенек в BIN формате первой, последней и той что по середине исходя из количества ступенек { FirstLastBitDec=1; MidleBitDec=1; for (int i=1;i<NUM_LEDS;i++) { FirstLastBitDec=FirstLastBitDec*2; Serial.println(FirstLastBitDec); } for (int j=1;j<NUM_MIDDLE_LEDS;j++) { MidleBitDec=MidleBitDec*2; Serial.println(MidleBitDec); } } void FirstLastAfterON()// зажигаем первую последнюю и ту что посередине после того как прошел { for (int i=brightset;i>=brightsetFirstLast;i--) {analogWrite (BR, i); MM5450(FirstLastBitDec+MidleBitDec+1); } analogWrite (BR, brightsetFirstLast); MM5450(FirstLastBitDec+MidleBitDec+1); } void FirstLast()// зажигаем первую последнюю и ту что посередине { analogWrite (BR, brightsetFirstLast); MM5450(FirstLastBitDec+MidleBitDec+1); } int Ultrasonic(byte Trig_pin, byte Echo_pin)// расчитвыем расстояние ультрасоников { digitalWrite(Trig_pin, HIGH); delayMicroseconds(20); digitalWrite(Trig_pin, LOW); return pulseIn(Echo_pin, HIGH, 20000) / 29.0 / 2;// возвращение дистанции в см } void PWM_MM5450(uint32_t data) // шим включения ступеньки { for (int j=0;j<=19;j++) { for (int i=0;i<=32;i++) { if (masky[j] & (1UL << i)) { MM5450(data); } else {MM5450(piss); } } }piss=data; } void PWMOFF_MM5450(uint32_t data) // шим выключения ступеньки { for (int j=19;j>=0;j--) { for (int i=0;i<=32;i++) { if (masky[j] & (1UL << i)) { MM5450(piss); } else {MM5450(data); } } }piss=data; } void MM5450(uint32_t jopa) // програмка зажигания ступеньки {byte i; digitalWrite(DATA, 1); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); for (i = 0; i < NUM_LEDS; i++) { if (jopa & (1UL << i)) digitalWrite(DATA, HIGH); else digitalWrite(DATA, LOW); digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } digitalWrite(DATA, 0); for (byte j = 0; j < 35 - NUM_LEDS; j++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }код писал для себя, у меня есть еще вход в комнату по середине лестницы, поэтому используется три датчика (не обращайте внимание на горящую посерединке ступеньку либо закомментируйте). проверьте pinы от ардуины.
проблемы в том что не использую delay(); а значит установить какие то временные рамки не могу нормально, приходится изголяться..
здравствуйте, не подскажете а как можно использовать m5451 для семисегментных дисплеев, в режиме динамической индикации, есть ли какие нибудь библиотеки
Не очень понятно, что имеете ввиду под "динамической" индикацией. Как минимум есть https://github.com/supercrab/arduino-seven-segment
Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.
Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.
Всем привет. Тоже задумался соорудить такую подсветку, для своей будущей лестницы.
Практически все купил. Остался пока один вопрос. Какой фоторезистор брать? Я правильно понимаю, что можно вообще любой? под какой отлажена программа с 339 поста? Спасибо.
вообще любой пойдет, какой понравится - такой бери....
понятно. спасибо) буду тренироваться.
У меня ардуину будет питает один маломощный БП, а на ленты питание будет идти от другого мощного ватт на 150 БП. Я тут задумался над таким вопросом: зачем постоянно держать под напругой этот мощный БП особенно днем, может запитать его через доп. реле, а этим реле будет управлять ардуина? Кто-нибудь делал такое?
dukes, можно и через реле освещенности
тогда надо ставить реле освещенности и синхронизировать его работу с ардуиной плюс отдельное питание на него заводить.
Так что ж там заводить розетка 220 вольт в которую ,кстати, будет подключены и Ваши блоки питания, и для Андруино, и для лент, а нагрузкой у него те же блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.
Так что ж там заводить розетка 220 вольт в которую ,кстати, будет подключены и Ваши блоки питания, и для Андруино, и для лент, а нагрузкой у него те же блоки питания и 2-3 метра провода вот и вся синхронизация, потемнело- пиалово подалось на всю систему.
ОООО, я об этом не подумал. можноже все разом выключать. а ардуинке плохо не станет если во время выполнения программы ей питание обрубать?
Свет включили - все отрубилось по датчику... Зачем вам отрубать БП? пусть даже и мощный, на холостом ходу сколько он потребляет? полватта? ватт? 1.5-2 рубля мнимой экономии в месяц вам погоду не сделают, а дергать питание ардуины лишний раз смысла нет... Вспомните свой опыт - лампочки в 90% случаях сгорают при включении, ардуина не лампочка, но лишний раз ее дергать не стоит.
а зачем его держать постоянно под напряжением? он же 75% времени будет бездействовать
а зачем его держать постоянно под напряжением? он же 75% времени будет бездействовать
Обесточивать или нет - ваше личное дело. К чему вас переубеждать? тем более вы сами себя убедили уже в необходимости экономить 1.5-2р в месяц))
У меня куча сотрудников, которые работают за компами, компы никогда не выключаются (по причине того, что по ночам устанавливаются обновления и часть процессов запускаются в ночь). Через 1 час бездействия они конечно "засыпают", потребление снижается в разы, но они все равно потребляют энергию. Но это не суть, есть у меня безопасник, который в силу своей профессиональной специфики постоянно выключает монитор, а когда уходит вечером домой, то и компьютер. Так вот ему я меняю монитор и комп каждые 3 года, другие сотрудники уже и по 5 лет отработали: компы живут, на паре мониторов подсветку меняли... и все))
PS. Помню был у меня когда-то в инстутитуте предмет - "Переходные процессы" - жуткая вещь... вспоминая все что происходит при включении оборудования совсем пропадает желание что-то выключать))) Ну это так, лирическое отступление... сорри за оффтоп.
linker1185 скажи пожалуйста как севить правильно irf714 к светодиодом какие выходы и к смд какие выходы
linker1185 скажите както так должно выйти http://forum.amperka.ru/attachments/img_20150206_160256-2-jpg.2324/
?????????????
спосибо
Главная беда с ШИМ на 5450, длинный цикл загрузки данных. После того как в предел по даташиту его упихал, получается добрых 60мкс, что весьма не мало и оставляет нам пространство только для 16кГц несущей частоты, если мы берем 8бит ШИМ, еле выходит 60Гц частоты ШИМ... К тому же, при таких накладных, держать дежурку на ШИМ вообще не реально и надо ее выставлять через Brightness pin.
вид снизу
скажите пожалуйста какой номинал у R10, R12 R33
и зачем нужен R34
выдели красным где они стоят, по картинке не видно
Дай Бох паймете
И если возможна поставьте реальную фото с верзнем и нижнем видом спосибо
R10 и R12 по 10 кОм
R33 это перемычка, поставь 10Ом если хочешь, разницы никакой.. больше 1 кОм - работать не будет... Имхо, резистора там не нужно...
R34 это переменный резистор, на сколько понял от датчика освещения или для замены датчика... там надо подбирать в зависимости от датчика освещения, думаю не больше 1-10 кОм , програмно потом подбираются состояния...
а у Вас готовый проект есть можете сфотографировать
как уже писал выше у меня отличается... по середине лестницы есть еще один вход с полуторного этажа ) поэтому использую три датчика движения.. если поможет , то пользуйся)
это лежит сейчас на тумбочке.. лестница еще не до конца готова.. все проверено, все работает
Спосибо
Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).
Здравствуйте, пробовал ваш скейтч для умной лестницы из 182 поста, работает супер, не подскажите как в программе ступени лишние отключать, я начинающий, хочется сделать своми руками:) и схема если есть есть нарисованная тоже посмотреть, не могу с этими полевиками разобраться, спасибо:)).
Скажите пожалуйста на какой схеме вы попробовали данный скейч и работает супер выложите пожалуйста линк
В 17 и 18 строке же написано..
задаём кол-во ступенек
#define NUM_LEDS 16
в данном случае вместо 16 пишите сколько вам надо
схемы смотрите где то там же , выкладывали уже не раз , во всех возможных форматах))
Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?
если собрано, то просто проверьте... помоему в 182 посту уже подправлено, и там достаточно изменить цифру..
полевики если используете irf7314 или подобный подключаются так
почти монтажная схема выглядит так.
резисторы что от +12В ставь на 10 кОм, те что от ног м5450 ставь 1 кОм
От делителя напряжения я лично отказался. посколько по даташиту ардуинка нано
у меня работает, чуть теплая... Делитель напряжения грелся гораздо сильнее... возможно из-за блока питания, не проверял..
Всмысле на какой схеме?На столе собрал,к микросхеме 5450 подключил по отрезку ленты из трёх светодиодов,смотрел и наслаждался как работает),теперь задача поставить транзисторы для усиления каналов и уменьшить количество ступеней и всё).Неужели так просто вместо цифры 16,поставить например 14 для уменьшения количества ступеней,или ещё где то в программе изменять надо?
В смысле по какому рисунку подключял компоненты
если собрано, то просто проверьте... помоему в 182 посту уже подправлено, и там достаточно изменить цифру..
полевики если используете irf7314 или подобный подключаются так
почти монтажная схема выглядит так.
резисторы что от +12В ставь на 10 кОм, те что от ног м5450 ставь 1 кОм
От делителя напряжения я лично отказался. посколько по даташиту ардуинка нано
у меня работает, чуть теплая... Делитель напряжения грелся гораздо сильнее... возможно из-за блока питания, не проверял..
А что вы имеете в виду из-за блока какой ток нужен если у мкня 16 светильников по 9ват, и что не нужны резисторы на 47 а на 10ком
то что у меня китайский импульсный блок питания, не обращай внимание... если у тебя 16 светиков по 9ват, то и нужно около 150 вт +25%. итого бери 200 вт, не ошибешься...
А монтажную плату без делителя напряжение можеш поставить
попробую, спасибо, а такие полевики в DIP корпусе бывают?
количество ступеней понял как менять, в 182 посту что такое : //Устанавливаем контакт управления яркостью светодиодов
Привет ! К сожалению, я не знаю русский язык , так пишет tranzlator . У меня есть проблема , что я не могу добавить вручную датчика hcsr04 на этот код , если вы можете мне помочь? приветствия
http://technika-laika.blogspot.com/2014/09/sterownik-oswietlenia-schodow...
#include <Tlc5940.h> #include "ClickButton.h" const int downButtonPin = 8; const int upButtonPin = 6; const int midButtonPin = 7; int ledCount = 18; //liczba aktywnych wyjść (taśm led) int brightness = 4095; //maksymalna jasność int delayTime = 1; int midStep = 13; int outs[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; //wyjścia do których podpinane są taśmy int outState[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // Nr. of buttons in the array const int buttons = 3; ClickButton button[3] = { ClickButton (downButtonPin, LOW, CLICKBTN_PULLUP), ClickButton (upButtonPin, LOW, CLICKBTN_PULLUP), ClickButton (midButtonPin, LOW, CLICKBTN_PULLUP), }; int LEDfunction[buttons] = { 0, 0, 0 }; const int DOWN_BUTTON = 0; const int UP_BUTTON = 1; const int MID_BUTTON = 2; const int STAN_WYLACZONY = 0; const int STAN_ROZJASNIANIE_OD_DOLU = 1; const int STAN_SCIEMNIANIE_OD_DOLU = 2; const int STAN_ROZJASNIANIE_OD_GORY = 3; const int STAN_SCIEMNIANIE_OD_GORY = 4; const int STAN_ROZJASNIANIE_OD_SRODKA = 5; const int STAN_SCIEMNIANIE_OD_SRODKA = 6; const int STAN_ROZJASNIANIE_CALOSCI = 7; const int STAN_SCIEMNIANIE_CALOSCI = 8; const int STAN_WLACZONY = 9; const int SCIEMNIANIE_POJEDYNCZE_STEP = 5; const int SCIEMNIANIE_CALOSCI_STEP = 10; const int ROZJASNIANIE_POJEDYNCZE_STEP = 25; const int ROZJASNIANIE_CALOSCI_STEP = 10; int STAN = STAN_WYLACZONY; void setup() { Tlc.init(); for (int i=0; i<buttons; i++) { // Setup button timers (all in milliseconds / ms) // (These are default if not set, but changeable for convenience) button[i].debounceTime = 20; // Debounce timer in ms button[i].multiclickTime = 250; // Time limit for multi clicks button[i].longClickTime = 800; // Time until long clicks register } updateLed(); } void loop() { for (int i=0; i<buttons; i++) { // Update state of all buitton button[i].Update(); // Save click codes in LEDfunction, as clicks counts are reset at next Update() if (button[i].clicks != 0) LEDfunction[i] = button[i].clicks; // Simply toggle LED on single clicks // (Cant use LEDfunction like the others here, // as it would toggle on and off all the time) if(button[i].clicks == 1) { wlaczPianino(i); } // slow blink (must hold down button. 1 second long blinks) if(LEDfunction[i] == -1) { ustawStanStaly(i); LEDfunction[i] = 0; } } updateCircuitState(); updateLed(); delay(delayTime); } void updateLed() { for (byte diode = 0; diode<ledCount;diode++) { Tlc.set(outs[diode], brightness-outState[diode]); } Tlc.update(); } void updateCircuitState() { if (STAN == STAN_ROZJASNIANIE_OD_DOLU) { rozjasnianieOdDolu(); } if (STAN == STAN_SCIEMNIANIE_OD_DOLU) { sciemnianieOdDolu(); } if (STAN == STAN_ROZJASNIANIE_OD_GORY) { rozjasnianieOdGory(); } if (STAN == STAN_SCIEMNIANIE_OD_GORY) { sciemnianieOdGory(); } if (STAN == STAN_ROZJASNIANIE_CALOSCI) { rozjasnianieCalosci(); } if (STAN == STAN_SCIEMNIANIE_CALOSCI) { sciemnianieCalosci(); } if (STAN == STAN_ROZJASNIANIE_OD_SRODKA) { rozjasnianieOdSrodka(); } if (STAN == STAN_SCIEMNIANIE_OD_SRODKA) { sciemnianieOdSrodka(); } } void rozjasnianieOdSrodka() { bool changed = false; for (int diode = midStep; diode<ledCount;diode++) { if (outState[diode] < brightness) { int newState = outState[diode]; newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP; if (newState > brightness) { newState = brightness; } outState[diode] = newState; changed = true; break; } } for (int diode = midStep-1; diode>=0;diode--) { if (outState[diode] < brightness) { int newState = outState[diode]; newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP; if (newState > brightness) { newState = brightness; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_SCIEMNIANIE_OD_SRODKA; } } void sciemnianieOdSrodka() { bool changed = false; for (int diode = midStep; diode<ledCount;diode++) { if (outState[diode] > 0) { int newState = outState[diode]; newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP; if (newState < 0 ) { newState = 0; } outState[diode] = newState; changed = true; break; } } for (int diode = midStep-1; diode>=0;diode--) { if (outState[diode] > 0) { int newState = outState[diode]; newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP; if (newState < 0) { newState = 0; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_WYLACZONY; } } void rozjasnianieCalosci() { bool changed = false; for (int diode = 0; diode<ledCount;diode++) { if (outState[diode] < brightness) { int newState = outState[diode]; newState = newState + ROZJASNIANIE_CALOSCI_STEP; if (newState > brightness) { newState = brightness; } outState[diode] = newState; changed = true; } } if (!changed) { STAN = STAN_WLACZONY; } } void sciemnianieCalosci() { bool changed = false; for (int diode = 0; diode<ledCount;diode++) { if (outState[diode] > 0) { int newState = outState[diode]; newState = newState - SCIEMNIANIE_CALOSCI_STEP; if (newState < 0) { newState = 0; } outState[diode] = newState; changed = true; } } if (!changed) { STAN = STAN_WYLACZONY; } } void rozjasnianieOdDolu() { bool changed = false; for (int diode = 0; diode<ledCount;diode++) { if (outState[diode] < brightness) { int newState = outState[diode]; newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP; if (newState > brightness) { newState = brightness; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_SCIEMNIANIE_OD_DOLU; } } void sciemnianieOdDolu() { bool changed = false; for (int diode = 0; diode<ledCount;diode++) { if (outState[diode] > 0) { int newState = outState[diode]; newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP; if (newState < 0) { newState = 0; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_WYLACZONY; } } void rozjasnianieOdGory() { bool changed = false; for (int diode = ledCount-1; diode>=0;diode--) { if (outState[diode] < brightness) { int newState = outState[diode]; newState = newState + ROZJASNIANIE_POJEDYNCZE_STEP; if (newState > brightness) { newState = brightness; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_SCIEMNIANIE_OD_GORY; } } void sciemnianieOdGory() { bool changed = false; for (int diode = ledCount-1; diode>=0;diode--) { if (outState[diode] > 0) { int newState = outState[diode]; newState = newState - SCIEMNIANIE_POJEDYNCZE_STEP; if (newState < 0) { newState = 0; } outState[diode] = newState; changed = true; break; } } if (!changed) { STAN = STAN_WYLACZONY; } } void wlaczPianino(int button) { /* jesli swiatla byly wlaczone, tylko plynnie wylaczamy */ if (STAN == STAN_WLACZONY) { if (button == DOWN_BUTTON) { STAN = STAN_SCIEMNIANIE_OD_DOLU; } if (button == UP_BUTTON) { STAN = STAN_SCIEMNIANIE_OD_GORY; } if (button == MID_BUTTON) { STAN = STAN_SCIEMNIANIE_OD_SRODKA; } } /* jesli swiatla byly wylaczone, wtedy plynnie wlaczamy */ if (STAN == STAN_WYLACZONY) { if (button == DOWN_BUTTON) { STAN = STAN_ROZJASNIANIE_OD_DOLU; } if (button == UP_BUTTON) { STAN = STAN_ROZJASNIANIE_OD_GORY; } if (button == MID_BUTTON) { STAN = STAN_ROZJASNIANIE_OD_SRODKA; } } } void ustawStanStaly(int button) { Serial.print("ustawStanStaly "); Serial.print(button); Serial.print(" "); Serial.println(STAN); if ( STAN == STAN_WLACZONY || STAN == STAN_SCIEMNIANIE_OD_DOLU || STAN == STAN_SCIEMNIANIE_OD_GORY || STAN == STAN_SCIEMNIANIE_OD_SRODKA ) { STAN = STAN_SCIEMNIANIE_CALOSCI; } if ( STAN == STAN_WYLACZONY || STAN == STAN_ROZJASNIANIE_OD_DOLU || STAN == STAN_ROZJASNIANIE_OD_GORY || STAN == STAN_ROZJASNIANIE_OD_SRODKA ) { STAN = STAN_ROZJASNIANIE_CALOSCI; } }#define BR 9, я его не подключал все работает, можно узнать что и как это готовить?
Этим контактом задается яркость первой и последней ступеней в тёмное время.
Подскажите пожалуйста, как сделать чтобы первая и и последняя ступень горела в пол накала
//Устанавливаем контакты для драйвера #define DATA 6 #define CLOCK 7 //Устанавливаем контакт фоторезистора #define FOTO A0 //Устанавливаем контакты для первого датчика #define T1 4 #define E1 5 //Устанавливаем контакты для второго датчика #define T2 2 #define E2 3 //Устанавливаем контакт управления яркостью светодиодов #define BR 9 const byte brightset = 255; //Задаем количество светодиодов #define NUM_LEDS 16 const uint32_t mask = 0b1111111111111111; void setup() { pinMode(DATA, OUTPUT); pinMode(CLOCK, OUTPUT); digitalWrite(CLOCK, HIGH); digitalWrite(FOTO, HIGH); pinMode(BR, OUTPUT); pinMode(T1, OUTPUT); pinMode(T2, OUTPUT); pinMode(E1, INPUT); pinMode(E2, INPUT); digitalWrite(E1, HIGH); digitalWrite(E2, HIGH); FirstLast(); } void loop() { int D1 = Ultrasonic(T1, E1); // измеряем расстояние первого датчика if(D1 > 0 && D1 < 100) // если расстояние меньше 100см, то { analogWrite (BR, brightset); for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону { MM5450(mask<<i); delay(200); // задержка зажигания } delay(10000); // ждем 3 секунды for(char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды { MM5450(mask>>i); delay(200); // задержка затухания } FirstLast(); } int D2 = Ultrasonic(T2, E2); // измеряем расстояние второго датчика if(D2 > 0 && D2 < 100) // если расстояние меньше 100см, то { analogWrite (BR, brightset); for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону { MM5450(mask>>i); delay(200); // задержка зажигания } delay(10000); // ждем 3 секунды for(char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды { MM5450(mask<<i); delay(200); // задержка затухания } FirstLast(); } delay(20); } void FirstLast() { analogWrite (BR, 25); MM5450(0b1000000000000001); } 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 < NUM_LEDS; 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 < 35-NUM_LEDS; i++) { digitalWrite(CLOCK, LOW); digitalWrite(CLOCK, HIGH); } }А в чем проблема? Первая с последней горят ярко или совсем не горят?
ярко горят, как и все, хочется чтобы ночью горели в пол накала, а то ночью по глазам сильно светят