Автоматическая подсветка лестницы и MM5450

SergN
Offline
Зарегистрирован: 08.02.2017

Подскажите в чем причина. Контроллер 5450, транзисторные сборки на IRF7314.
С выходов контроллера IRF7314 подключены через резисторы по 1К.
Плавный поджиг работает с одним из последних скетей, но плавное затухание не происходит!
Если же со входов IRF7314 дать резистор к питаню, вообще ничего не работает, пробовал другие скетчи, но тогда в таком исполенние не работает плавный поджиг, сразу диоды по одному врубаються...
Уже натыкался так что спалил один контроллер(
 

Myero
Offline
Зарегистрирован: 20.10.2015

Сложно... нарисуйте от руки схему подключения и какой именно скетч использовали. 

SergN
Offline
Зарегистрирован: 08.02.2017

Myero пишет:

Сложно... нарисуйте от руки схему подключения и какой именно скетч использовали. 

Каким то чудом заработало)) Видно мастера боиться)) - Вас;)

Для чего нужны диоды D1-D4 на схеме?

Myero
Offline
Зарегистрирован: 20.10.2015

Там в 404 посте уже спрашивали и обсуждали. Сами не знаем) там светодиодики наверно поставили. Ну покажет что лестница работает в коробке

stasstroy
Offline
Зарегистрирован: 09.01.2016

Это кто-то таким решением сделал дежурную подсветку 1-ой и последней ступеней, без D1-D4 эти две ступеньки будут включаться параллельно.

YRA
Offline
Зарегистрирован: 10.01.2015

Не подскажите, где рыть, скетч из 452 поста  от уважаемого Ahtung533, все работает и настраевается под себя любимого, кроме одного -в дневном  режиме первый и последний светодиоды   горят в пол накала, что должно иметь место в ночном режиме,как только фоторезистор закрываю-  они наоборот гаснут, и все работате штатно. Что где изменить подскажите  к понедельнику лесенку должны собрать уже.

YRA
Offline
Зарегистрирован: 10.01.2015

 В коде вроде пытался поменять  высокий уровень на низкий

hvorostov78
Offline
Зарегистрирован: 20.11.2016

Всем доброго времени суток. Подскажите пожалуйста , где взять источник этой чудо лестницы (схема, скетч , описание и т.д ), повторить все это точь в точь мне подсилу, а вот исправить, дополнить--- я в этом полный ноль. Большое СПАСИБО!!!

stasstroy
Offline
Зарегистрирован: 09.01.2016

Для начала почитай всю ветку, начиная с первого поста. Здесь есть и схемы, и скетчи, так что любому начинающему не составит труда в повторении "этой чудо лестницы".

neu4
Offline
Зарегистрирован: 10.10.2017
 

dimanok88 пишет:

Я использую такой датчик http://www.uctronics.com/gy-30-bh1750fvi-intensity-digital-light-sensor-module-for-arduino-p-1494.html

Я взял простой датчик HC-SR04, подключил как тут (стр 4, рис 2):
У меня заработало!
Один резюк 620Ом надо потавить между Trig и Echo. А кто подскажем зачем его надо ставить?
artsonik88
Offline
Зарегистрирован: 07.01.2018

извините можно вопрос тоже по освещению лестницы. если мне не интересуют плавный запуск и затухание светодиодов можно ли релизовать через ардуино + блок на 16 реле допустим?

aurimaspr
Offline
Зарегистрирован: 16.03.2014


Всем доброго времени суток. Суть токова,код не мои надо чтобы посмотрели и поеснили про плавный запуск и затухание . Сеичас плавный запуск и затухание происходит рывками. пробовал с настроиками 

#define Speed 2.0
if (StairsPWMValue[i] < 5 ) StairsPWMValue[i] = 0 ;
StairsPWMValue[i-1] = 5;

нечего не получилось, все ровно мерцает

А вот и сам код

#include "Tlc5940.h"                                                                // подключить библиотеку обслуживания LED-драйвера

#define Sonar1trig  8                                                               // вход "Trig" "нижнего" сонара (имеет смысл только при использовании СОНАРОВ)
#define Sonar1echo  2                                                               // выход "Echo" "нижнего" сонара (имеет смысл только при использовании СОНАРОВ)
#define Sonar1reset 4                                                               // управление перезагрузкой "нижнего" сонара (имеет смысл только при использовании СОНАРОВ)

#define Sonar2trig  6                                                               // вход "Trig" "верхнего" сонара (имеет смысл только при использовании СОНАРОВ)
#define Sonar2echo  7                                                               // выход "Echo" "верхнего" сонара (имеет смысл только при использовании СОНАРОВ)
#define Sonar2reset 5                                                               // управление перезагрузкой "верхнего" сонара (имеет смысл только при использовании СОНАРОВ)

#define PIR1out 8                                                                   // выход "нижнего" PIR (имеет смысл только при использовании PIR-сенсоров)
#define PIR2out 6                                                                   // выход "верхнего" PIR (имеет смысл только при использовании PIR-сенсоров)

#define Sonar1limit 30                                                              // см, если обнаружена дистанция меньше, чем это число, то сонар считается сработавшим
#define Sonar2limit 30                                                              // см, если обнаружена дистанция меньше, чем это число, то сонар считается сработавшим

// === ПОЛЬЗОВАТЕЛЬСКИЕ НАСТРОЙКИ =============================================================================

#define SensorPIR false                                                             // выберите тип сенсора: FALSE = сонары SRF05,  TRUE = PIR сенсоры
#define UseResetSonar true                                                          // выберите, использовать ли механизм reset (имеет смысл только при использовании СОНАРОВ)
#define N 16                                                                        	// 2...16 - установите количество подсвечиваемых ступеней
#define Speed 2.0                                                                  // >=1.2 - задайте скорость включения/выключения освещения ступеней
#define PWM_InitialValue 500                                                       	// 0...4095 - задайте уровень яркости первой и последней ступеней в режиме ожидания
#define LightOFF_Delay 7000                                                         // мс, задайте время задержки отключения освещения после включения последней ступени

// ============================================================================================================

int StairsPWMValue[16];                                                            	// массив значений уровней яркости (0...4096) ступеней. Все операции только с ним, далее через PWM_Output передаются в LED-драйвер 

byte Sensor1_IgnoreCount = 0;                                                       // счетчик игнорирования срабатывания сенсора 1 (счетчик спускающихся по лестнице)
byte Sensor2_IgnoreCount = 0;                                                       // счетчик игнорирования срабатывания сенсора 2 (счетчик поднимающихся по лестнице)

boolean Sensor1 = false;                                                         	  // сенсор 1 зафиксировал движение 
boolean Memory1 = false;                                                            // память сенсора 1
boolean Sensor1_ON = false;                                                         // управляющий сигнал сенсора 1

boolean Sensor2 = false;                                                         	  // сенсор 2 зафиксировал движение
boolean Memory2 = false;                                                            // память сенсора 2
boolean Sensor2_ON = false;                                                         // управляющий сигнал сенсора 2

boolean AllLightOn = false;                                                         // освещение включено полностью, требуется ожидание в таком состоянии
boolean ON_BottomTop = false;                                                       // требуется включение ступеней снизу вверх
boolean OFF_BottomTop = false;                                                      // требуется выключение ступеней снизу вверх
boolean ON_TopBottom = false;                                                       // требуется включение ступеней сверху вниз
boolean OFF_TopBottom = false;                                                      // требуется выключение ступеней сверху вниз
boolean InitialState = true;                                                        // "дежурный" режим лестницы, т.н. исходное состояние
boolean direct = false;                                                             // направление : false = снизу вверх, true = сверху вниз

unsigned long PreTime;                                                              // отметка системного времени в предыдущем цикле
unsigned long ActTime;                                                              // отметка системного времени в текущем цикле

long Cycle;                                                                         // мс, длительность цикла
long AllLight_OffDelay;                                                             // мс, оставшееся время до выключения освещения лестницы


// ===== ПОДГОТОВКА ===========================================================================================

void setup() {  

//  Serial.begin(9600);
  Tlc.init();                                                                       // инициализация LED-драйвера
  delay(500);                                                                       // задержка для выполнения инициализации LED-драйвера 
  for (byte i = 1; i < 16; i++) StairsPWMValue[i] = 0;                              // обнулить массив значений яркости ступеней начиная со 2-й ступени
  StairsPWMValue[0] = PWM_InitialValue;                                             // выставление дефолтной яркости 1-ой ступени
  StairsPWMValue[N - 1] = PWM_InitialValue;                                         // выставление дефолтной яркости последней используемой ступени
  PWM_Output();                                                                     // передать в LED-драйвер начальные уровни яркости

 // - инициализация сенсора 1  

  if (SensorPIR) pinMode (PIR1out, INPUT);                                          // PIR сенсор
  else {                                                                            // сонар SRF05
    pinMode (Sonar1trig, OUTPUT);
    pinMode (Sonar1echo, INPUT);
    pinMode (Sonar1reset, OUTPUT);
    digitalWrite (Sonar1trig, LOW);
  }
  Sensor1 = false;
  Memory1 = false;
  
// - инициализация сенсора 2 

  if (SensorPIR) pinMode (PIR2out, INPUT);                                          // PIR сенсор
  else {                                                                            // сонар SRF05
    pinMode (Sonar2trig, OUTPUT);
    pinMode (Sonar2echo, INPUT);
    pinMode (Sonar2reset, OUTPUT);
    digitalWrite (Sonar2trig, LOW);
  }
  Sensor2 = false;
  Memory2 = false;

// - инициализация состояния 

  ON_BottomTop = false;                                                        
  ON_TopBottom = false;
  
  PreTime = millis();                                                               // сохранить системное время
}  

// ===== ОСНОВНОЙ ЦИКЛ ========================================================================================

void loop() { 

  InitialState = !((ON_TopBottom) || (OFF_TopBottom) || (ON_BottomTop) || (OFF_BottomTop) || (AllLightOn));
  if (InitialState) {                                                               // если лестница находится в исходном (выключенном) состоянии, сбросить флаги-"потеряшки" на всякий случай
    Sensor1_IgnoreCount = 0;                                                        // счетчик игнорирования сенсора 1
    Sensor2_IgnoreCount = 0;                                                        // счетчик игнорирования сенсора 2
  }

// - проверить состояние "НИЖНЕГО" сенсора 

  if (!SensorPIR) {                													                        // сканирование пространства перед сонаром 1
    digitalWrite(Sonar1trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Sonar1trig, LOW);
    byte distance = pulseIn(Sonar1echo, HIGH, 5000) / 58 ;                  				// расчет дистанции до препятствия (5000 - таймаут, то есть не ждать сигнала более 5мс) 
	Sensor1 = (distance > 0) && (distance <= Sonar1limit);							              // SRF05 : сонар 1 зафиксировал присутствие
	if (UseResetSonar && !(distance > 0)) digitalWrite(Sonar1reset, LOW);			        // перезапуск зависшего сонара - отключить питание до конца цикла
	}
  else Sensor1 = (digitalRead(PIR1out) == LOW);										                  // PIR : сенсор 1 зафиксировал присутствие

  Sensor1_ON = Sensor1 && !(Sensor1_IgnoreCount > 0);                           	  // счетчик игнорирования сенсора 1 не более 0 - сформировать управляющий сигнал 
  if (Sensor1 && !Memory1) {														                            // фронт срабатывания сенсора 1
    if (Sensor1_IgnoreCount > 0) Sensor1_IgnoreCount-- ;                            // если требуется игнорировть сонар 1, декремент счетчика игнорирования сенсора 1 (вероятно, кто-то закончил спуск по лестнице)
    else Sensor2_IgnoreCount++ ;                                                    // иначе, инкремент счетчика игнорирования сенсора 2 (вероятно, кто-то начал подниматься по лестнице)    
  }
  Memory1 = Sensor1 ;																                                // запомнить состояние сенсора
 
// - проверить состояние "ВЕРХНЕГО" сенсора 

  if (!SensorPIR) {                													                        // сканирование пространства перед сонаром 2
    digitalWrite(Sonar2trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(Sonar2trig, LOW);
    byte distance = pulseIn(Sonar2echo, HIGH, 5000) / 58 ;                  				// расчет дистанции до препятствия (5000 - таймаут, то есть не ждать сигнала более 5мс) 
	Sensor2 = (distance > 0) && (distance <= Sonar2limit);						                // SRF05 : сонар 2 зафиксировал присутствие
	if (UseResetSonar && !(distance > 0)) digitalWrite(Sonar2reset, LOW);			        // перезапуск зависшего сонара - отключить питание до конца цикла
	}
  else Sensor2 = (digitalRead(PIR2out) == LOW);										                  // PIR : сенсор 2 зафиксировал присутствие

  Sensor2_ON = Sensor2 && !(Sensor2_IgnoreCount > 0);                           	  // счетчик игнорирования сенсора 2 не более 0 - сформировать управляющий сигнал 
  if (Sensor2 && !Memory2) {														                            // фронт срабатывания сенсора 2
    if (Sensor2_IgnoreCount > 0) Sensor2_IgnoreCount-- ;                            // если требуется игнорировть сонар 2, декремент счетчика игнорирования сенсора 2 (вероятно, кто-то закончил подъем по лестнице)
    else Sensor1_IgnoreCount++ ;                                                    // иначе, инкремент счетчика игнорирования сенсора 1 (вероятно, кто-то начал спускаться по лестнице)    
  }
  Memory2 = Sensor2 ;																                                // запомнить состояние сенсора
  
// - освещение лестницы включено

  if (AllLightOn) {                                                                	// если лестница находится во включенном состоянии, можно сбросить флаги-"потеряшки" на всякий случай
    ON_BottomTop = false;                                                        	  // включение освещения снизу вверх
    ON_TopBottom = false;                                                        	  // включение освещения сверху вниз
  }
  
   
// - действия при срабатывания "НИЖНЕГО" сенсора 
  
  if (Sensor1_ON && InitialState) ON_BottomTop = true;                              // при срабатывании сенсора из исходного состояния лестницы начать включение освещения ступеней снизу вверх
  else if (Sensor1_ON && AllLightOn) AllLight_OffDelay = LightOFF_Delay ;           // если освещение уже полностью включено, обновить отсчет задержки выключения освещения   	
  else if (Sensor1_ON && OFF_BottomTop) {                                           // если происходит выключение освещения ступеней снизу вверх,
    OFF_BottomTop = false;                                                          // прекратить выключение освещения
    ON_BottomTop = true;                                                            // вновь начать включение освещения ступеней снизу вверх
  }
/*
  else if (Sensor1_ON && ON_TopBottom) {                                            // если происходит включение освещения ступеней сверху вниз
    ON_TopBottom = false;                                                           // прекратить включение освещения сверху вниз
    ON_BottomTop = true;                                                            // начать включение освещения ступеней снизу вверх
  }
*/  
  else if (Sensor1_ON && OFF_TopBottom) {                                           // если происходит выключение освещения ступеней сверху вниз
    OFF_TopBottom = false;                                                          // прекратить выключение освещения сверху вниз
    ON_BottomTop = true;                                                            // начать включение освещения ступеней снизу вверх
  }

// - действия при срабатывания "ВЕРХНЕГО" сенсора 

  if (Sensor2_ON && InitialState) ON_TopBottom = true;                              // при срабатывании сенсора из исходного состояния лестницы начать включение освещения ступеней сверху вниз
  else if (Sensor2_ON && AllLightOn) AllLight_OffDelay = LightOFF_Delay ;           // если освещение уже полностью включено, обновить отсчет задержки выключения освещения   	
  else if (Sensor2_ON && OFF_TopBottom) {                                       	  // если происходит выключение освещения ступеней сверху вниз
    OFF_TopBottom = false;                                                          // прекратить выключение освещения
    ON_TopBottom = true;                                                            // вновь начать включение освещения ступеней сверху вниз
  }
/*  
  else if (Sensor2_ON && ON_BottomTop) {                                        	  // если происходит включение освещения ступеней снизу вверх
    ON_BottomTop = false;                                                           // прекратить включение освещения снизу вверх
    ON_TopBottom = true;                                                            // начать включение освещения ступеней сверху вниз
  }
*/  
  else if (Sensor2_ON && OFF_BottomTop) {                                       	  // если происходит выключение освещения ступеней снизу вверх
    OFF_BottomTop = false;                                                          // прекратить выключение освещения снизу вверх
    ON_TopBottom = true;                                                            // начать включение освещения ступеней сверху вниз
  }

// - определение необходимости и направления выключения освещения

	if (AllLightOn && !(AllLight_OffDelay > 0)) {                                  	  // пора гасить освещение
    OFF_BottomTop = !direct;                                                        // снизу вверх
    OFF_TopBottom = direct;                                                         // сверху вниз
  }
 
// - управление включением/выключением освещения ступеней

  if (ON_BottomTop) BottomTopLightON();                                             // вызов процедуры включения ступеней снизу вверх
  if (OFF_BottomTop) BottomTopLightOFF();                                           // вызов процедуры выключения ступеней снизу вверх
  if (ON_TopBottom) TopBottomLightON();                                             // вызов процедуры включения ступеней сверху вниз
  if (OFF_TopBottom) TopBottomLightOFF();                                           // выключение ступеней сверху вниз
  PWM_Output();                                                                     // передать в LED-драйвер актуальные уровни яркости

// - завершение цикла

  delay(50);                                                                        // задержка для обеспечения паузы перед следующим опросом сонаров
  if (!SensorPIR) {                                                                 // восстановление питания, если был перезапуск сонаров
    digitalWrite (Sonar1reset, HIGH);                                               // всегда должен быть HIGH, для перезапуска сонара 1 установить в LOW
    digitalWrite (Sonar1reset, HIGH);                                               // всегда должен быть HIGH, для перезапуска сонара 2 установить в LOW
  } 
  
  ActTime = millis();                                                               // отметка времени для расчета длительности цикла
  Cycle = ActTime - PreTime;                                                        // прошло времени с предыдущего цикла программы 

  if (AllLight_OffDelay > 0) AllLight_OffDelay = AllLight_OffDelay - Cycle;         // если время освещения лестницы не истекло, уменьшить на длительность цикла
  else AllLight_OffDelay = 0;                                                       // иначе, время до начала отключения освещения = 0
 
  PreTime = millis();                                                               // отметка времени для расчета длительности цикла

}


// ===== ПРОЦЕДУРА ВКЛЮЧЕНИЯ СНИЗУ ВВЕРХ - ПОСЛЕДОВАТЕЛЬНОЕ УВЕЛИЧЕНИЕ УРОВНЕЙ ЯРКОСТИ СТУПЕНЕЙ ===============

void BottomTopLightON() { 
  direct = false;                                                                   // запомнить направление = снизу вверх
  for (byte i = 0; i < N; i++) {                                                    // перебор ступеней снизу вверх
    if (StairsPWMValue[i] < 1) {													                          // если очередная ступень выключена,
	  StairsPWMValue[i] = 5; 	  									                                    // задать для неё начальный уровень яркости
	  return;																		                                      // и выйти из процедуры
	  }  
	  else if (StairsPWMValue[i] < 4095 ){                                     		    // иначе, если уровень яркости ступени меньше максимального,
      StairsPWMValue[i] = StairsPWMValue[i] * Speed ; 	  								          // увеличить уровень яркости  
	  if (StairsPWMValue[i] > 4095 ) StairsPWMValue[i] = 4095 ;               		    // ограничить максимальную яркость
      return;                                                                       // и выйти из процедуры                            
    }
  }  
	AllLightOn = true;                                                            	   // освещение лестницы полностью включено
  AllLight_OffDelay = LightOFF_Delay;
  ON_BottomTop = false;                                                         	   // закончить включение ступеней снизу вверх
}

// ===== ПРОЦЕДУРА ВЫКЛЮЧЕНИЯ СНИЗУ ВВЕРХ - ПОСЛЕДОВАТЕЛЬНОЕ СНИЖЕНИЕ УРОВНЕЙ ЯРКОСТИ СТУПЕНЕЙ ===============

void BottomTopLightOFF() {  
  AllLightOn = false;                                                               // сбросить признак того, что освещение лестницы полностью включено
  for (byte i = 0; i < N ; i++) {                                                   // перебор ступеней снизу вверх
    if (((i == 0) || (i == N-1)) && (StairsPWMValue[i] > PWM_InitialValue)) {       // если это первая или последняя ступень и уровень яркости выше дежурного уровня,
      StairsPWMValue[i] = StairsPWMValue[i] / Speed ;                          // уменьшить яркость
	  if (StairsPWMValue[i] < PWM_InitialValue ) StairsPWMValue[i] = PWM_InitialValue ; // ограничить минимальную яркость
      return;                                                                       // и выйти из процедуры	  
    }  
    else if ((i != 0) && (i != N-1) && (StairsPWMValue[i] > 0)) {                   // для остальных ступеней, если уровень яркости выше "0",
      StairsPWMValue[i] = StairsPWMValue[i] / Speed ;                               // уменьшить яркость
	  if (StairsPWMValue[i] < 5 ) StairsPWMValue[i] = 0 ; 							              // ограничить минимальную яркость
      return;                                                                       // и выйти из процедуры
    }
  }
  OFF_BottomTop = false;                                                            // закончить выключение ступеней снизу вверх
}

// ===== ПРОЦЕДУРА ВКЛЮЧЕНИЯ СВЕРХУ ВНИЗ - ПОСЛЕДОВАТЕЛЬНОЕ УВЕЛИЧЕНИЕ УРОВНЕЙ ЯРКОСТИ СТУПЕНЕЙ ===============

void TopBottomLightON() { 
  direct = true;                                                                    // запомнить направление = сверху вниз
  for (byte i = N; i > 0; i--) {                                                    // перебор ступеней сверху вниз
    if (StairsPWMValue[i-1] < 1) {                                                 	// если очередная ступень выключена,
 	  StairsPWMValue[i-1] = 5; 	  									                                  // задать для неё начальный уровень яркости
	  return;																		                                      // и выйти из процедуры
	  }  
	  else if (StairsPWMValue[i-1] < 4095 ){                                     		  // иначе, если уровень яркости ступени меньше максимального,
      StairsPWMValue[i-1] = StairsPWMValue[i-1] * Speed ; 	  								      // увеличить уровень яркости  
	    if (StairsPWMValue[i-1] > 4095 ) StairsPWMValue[i-1] = 4095 ;               	// ограничить максимальную яркость
      return;                                                                       // и выйти из процедуры                            
    } 
  } 
  AllLightOn = true;                                                            	  // освещение лестницы полностью включено
  AllLight_OffDelay = LightOFF_Delay;
  ON_TopBottom = false;                                                         	  // закончить включение ступеней сверху вниз
}

// ===== ПРОЦЕДУРА ВЫКЛЮЧЕНИЯ СВЕРХУ ВНИЗ - ПОСЛЕДОВАТЕЛЬНОЕ СНИЖЕНИЕ УРОВНЕЙ ЯРКОСТИ СТУПЕНЕЙ ================

void TopBottomLightOFF() {  
  AllLightOn = false;                                                               // сбросить признак того, что освещение лестницы полностью включено
  for (byte i = N ; i >0; i--) {                                                    // перебор ступеней вниз, начиная с верхней
    if (((i == 1) || (i == N)) && (StairsPWMValue[i-1] > PWM_InitialValue)) {       // если это первая или последняя ступень и уровень яркости выше дежурного уровня,
      StairsPWMValue[i-1] = StairsPWMValue[i-1] / Speed ;                           // уменьшить яркость
	  if (StairsPWMValue[i-1] < PWM_InitialValue ) StairsPWMValue[i-1] = PWM_InitialValue ; // ограничить минимальную яркость
      return;                                                                       // и выйти из процедуры	  
    }  
    else if ((i != 1) && (i != N) && (StairsPWMValue[i-1] > 0)) {                   // для остальных ступеней, если уровень яркости выше "0",
      StairsPWMValue[i-1] = StairsPWMValue[i-1] / Speed ;                           // уменьшить яркость
	  if (StairsPWMValue[i-1] < 5 ) StairsPWMValue[i-1] = 0 ; 							          // ограничить минимальную яркость
      return;                                                                       // и выйти из процедуры
    }
  }
  OFF_TopBottom = false;                                                            // закончить выключение ступеней сверху вниз
}


// ===== ПРОЦЕДУРА ПЕРЕДАЧИ УПРАВЛЯЮЩИХ СИГНАЛОВ В LED-ДРАЙВЕР TLC 5940 =======================================

void PWM_Output() {  
  for (int i = 0; i < 16; i++) Tlc.set(i, StairsPWMValue[i]);                      	// яркость ступеней в диапазоне 0...4096 
  Tlc.update();
}

 

artemon25
Offline
Зарегистрирован: 25.12.2015

всем привет давно читаю этот форум подскажите вместо двух канального IRF7314 какой можно использовать одноканальный мосфет.    RFP15P05 MOSFET  ,IRF4905 MOSFET  ,IRF9510 MOSFET  ,IRF9520 MOSFET  ,IRFI9630G MOSFET,  KP507A MOSFET  ,FQU11P06 MOSFET ,2SJ135 MOSFET

 Заранее спасибо за ответ

aleksej
Offline
Зарегистрирован: 28.02.2018

Всем добрый день. Максим подскажите я взял ваш скетч все работает все хорошо только есть один вопрос. Помогите почему ночью загорается лестница когда все спят. ультразвуковой датчик стоит на 90 см ширина лестници от стенки ло стенки 102 см. а она срабатывает

//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  11
#define  E2  10
//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7
//Устанавливаем контакт фоторезистора
#define  FOTO A0

//Задаем количество светодиодов
#define NUM_LEDS 19

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 < 90)          // если расстояние меньше 100см, то
    {
      for(char i = NUM_LEDS-3; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask<<i);
        delay(400);                 // задержка зажигания
      }
      delay(60000);                  // ждем 3 секунды
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask>>i);
        delay(400);                 // задержка затухания
      }
    }

    int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
    if(D2 > 0 && D2 < 90)          // если расстояние меньше 100см, то
    {
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону
      {
        MM5450(mask>>i);
        delay(400);                 // задержка зажигания
      }
      delay(60000);                  // ждем 3 секунды
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask<<i);
        delay(400);                 // задержка затухания
      }
    }
  }
  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 < 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);
  }
}

 

aleksej
Offline
Зарегистрирован: 28.02.2018

Можно конечно но тогда будут присутствовать постоянное щелканье плюс износ реле
Все же лучше собрать на драйвере

aleksej
Offline
Зарегистрирован: 28.02.2018

.

Lotosss86
Offline
Зарегистрирован: 07.02.2018
Всем привет! взял код на этом форуме,подпилил под 10 ступеней с подсветкой 1 и 10 ступени,а кто-нибудь дошёл до момента встречного прохожева? Имею ввиду,чтоб после прохождения встречного человека после себя подсветка тухло в обратную сторону?
Lotosss86
Offline
Зарегистрирован: 07.02.2018


//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7
//Устанавливаем контакт фоторезистора
#define  FOTO A0
//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11
//Устанавливаем контакт управления яркостью светодиодов
#define  BR  9

const byte brightset = 255;

//Задаем количество светодиодов
#define NUM_LEDS 10
const uint32_t mask = 0b1111111111;

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() 
{
  static bool state;
  if(analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
  else analogWrite(9, LOW);   // выключаем ночную подсветку
  if(analogRead(FOTO) < 990) state = 0; // порог освещенности выключения
  else analogWrite(9, HIGH);   // включаем ночную подсветку
  if(state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
    if(D1 > 0 && D1 < 70)          // если расстояние меньше 70см, то
    {
      analogWrite (BR,  brightset);
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask<<i);
        delay(300);                 // задержка зажигания
      }
      delay(15000);                  // ждем 15 секунд
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask>>i);
        delay(300);                 // задержка затухания
      }
      FirstLast();
    }
    
    int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
    if(D2 > 0 && D2 < 70)          // если расстояние меньше 70см, то
    {
      analogWrite (BR,  brightset);
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону
      {
        MM5450(mask>>i);
        delay(300);                 // задержка зажигания
      }
      delay(15000);                  // ждем 15 секунд
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask<<i);
        delay(300);                 // задержка затухания
      }
      FirstLast();
    }
    delay(20);
  }
}


void FirstLast()
{
  analogWrite (BR,  20);
  MM5450(0b1000000001);
}


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);
  }
}

Lotosss86 пишет:

Всем привет! взял код на этом форуме,подпилил под 10 ступеней с подсветкой 1 и 10 ступени,а кто-нибудь дошёл до момента встречного прохожева? Имею ввиду,чтоб после прохождения встречного человека после себя подсветка тухло в обратную сторону?

miv
Offline
Зарегистрирован: 12.03.2018

Lotosss86 пишет:

Всем привет! взял код на этом форуме,подпилил под 10 ступеней с подсветкой 1 и 10 ступени,а кто-нибудь дошёл до момента встречного прохожева? Имею ввиду,чтоб после прохождения встречного человека после себя подсветка тухло в обратную сторону?

 

Я так понимаю, надо механизм данной проги менять с delay на работу с таймером либо прерывания по событиям вводить. Во время выполнения delay проц тупо стоит и ждет окончания времени заданного в delay. Ну и соответственно, не опрашивая датчики не знает о следующем лестницеходце. Смотрите текст проги, например в строке 055 пауза 15с. Все 15 с ардуинка в паузе и ничего больше не может делать.

Lotosss86
Offline
Зарегистрирован: 07.02.2018

ну наверно какбы да,я в программировании не силён,но если будет что-то похожее,то слепить думаю получится,вот найти бы похожий код было бы здорово!

miv
Offline
Зарегистрирован: 12.03.2018

Есть предложения по алгоритму работы? Лестница домашняя и толпы народа туда-сюда одновременно бегать не будут. Вполне достаточно 2 вариантов: после или во время вашего прохода кто-то пошёл следом за вами и после вашего прохода кто-то пошёл в другую сторону, а подсветка вызванная вами ещё не закончилась. У меня лестница двухмаршевая с площадкой посередине. Если одновременно пойдут навстречу друг другу, то что делать?

Lotosss86
Offline
Зарегистрирован: 07.02.2018

ну тут логичнее чтоб после задержки по времени отключение пошло с середины лестницы в разные концы...

а таймер обновлялся после каждого срабатывания датчика.

miv
Offline
Зарегистрирован: 12.03.2018

Я, кстати, взял за основу программу из поста #452 и добавил в неё бегущую тень от Myero. (У меня 15 ступеней, схема на драйвере 5450 и мофсетах). Контроллер простенький Atmega328 (вариант Arduino Nano). В этом контроллере есть 3 таймера, T1 16-разрядный, но он же работает и на PWM в 9 порту (где регулирвка яркости и выставляется). и 2 8-разрядные. Есть ещё ограничение, если опрашивать датчики по прерываниям от таймера, то не получается использовать задержку 20мс в опросе сонаров, т.к. delay в прерываниях не работает. Надо кумекать...этак придется перелопатить всю прогу...

MocArt
Offline
Зарегистрирован: 15.12.2014

в чем может быть дело: m5451+nano (использую 6,7 пин) и на стенде при тестовом запуске ШИМ диоды загораются и затухают мигая:

https://youtu.be/KBA34pQOh3I

код:

/* 
 * M5451 LED driver chip 
 * Author: G. Andrew Stone 
 * Public Domain 
 */ 

int myClockPin = 7;             // Arduino pin that goes to M5451 clock 
int mySerDataPin = 6;           // Arduino pin that goes to M5451 data 

void setup()                    // run once, when the sketch starts 
{ 
  Serial.begin(9600); 
} 


#define M5451_NUMOUTS 35 
#define M5451_CLK 0 
class M5451 
{ 
  public: 
  byte clockPin; 
  byte brightPin; 
  byte serDataPin; 
  M5451(byte clockPin,byte serDataPin,byte brightPin); 

  void set(unsigned long int a, byte b=0); 
  void setBrightness(byte b); 

  private: 
  void mydelay(int clk); 
}; 

void M5451::setBrightness(byte b) 
{ 
  if (brightPin < 0xff) 
    analogWrite(brightPin,b); 
} 

#define MaxBrightness 4096  //256 
class FlickerBrightness:public M5451 
{ 
  public: 
  FlickerBrightness(byte clkPin, byte dataPin, byte brightnessPin); 

  void shift(int amt=1) 
    { 
    offset+=amt; 
    if (offset>=M5451_NUMOUTS) offset -=M5451_NUMOUTS; 
    else if (offset< 0) offset +=M5451_NUMOUTS; 
    } 
  void loop(void); 

  int brightness[M5451_NUMOUTS]; 
  int bresenham[M5451_NUMOUTS]; 
  int iteration; 
  int offset; 
}; 

FlickerBrightness::FlickerBrightness(byte clkPin, byte dataPin,byte 
brightnessPin):M5451(clkPin,dataPin,brightnessPin) 
{ 
  for (int i=0;i < M5451_NUMOUTS;i++) 
  { 
    brightness[i] = 0; 
    bresenham[i]  = 0; 
  } 

  iteration = 0; 
  offset = 0; 
} 

void FlickerBrightness::loop(void) 
{ 
  int i; 
  byte pos; 
  unsigned long int a=0; 
  byte b=0; 
  boolean lvl=false; 

  for (i=0,pos=offset;i < M5451_NUMOUTS;i++,pos++) 
    { 
      if (pos>=M5451_NUMOUTS) pos=0; 
      bresenham[i] += brightness[pos]; 
      if (bresenham[i]>=MaxBrightness) 
        { 
          bresenham[i] -= MaxBrightness; 
          lvl = true; 
        } 
      else lvl = false; 

      if (i<32) a = (a<<1)|lvl; 
      else b = (b<<1)|lvl; 
    } 
  iteration++; 
  if (iteration > MaxBrightness) iteration = 0; 

  set(a,b); 
} 


M5451::M5451(byte clkPin, byte dataPin, byte brightnessPin) 
{ 
  int i; 

  clockPin = clkPin; 
  serDataPin = dataPin; 
  brightPin = brightnessPin; 

  pinMode(clkPin, OUTPUT);      // sets the digital pin as output 
  pinMode(serDataPin, OUTPUT);      // sets the digital pin as output 
  pinMode(brightPin,OUTPUT); 

  // Clear out the device so we can clock in items 
  digitalWrite(serDataPin,LOW); 
  for (i=0;i< M5451_NUMOUTS+2;i++) 
    { 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,HIGH); 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,LOW); 
    } 
} 

void M5451::mydelay(int clk) 
{ 
  int i; 
  for (i=0;i< clk;i++); 
  //delay(clk); 
} 

void M5451::set(unsigned long int a, byte b) 
{ 
  int i; 

  // Write the initial "start" signal 
  digitalWrite(clockPin,LOW); 
  digitalWrite(serDataPin,LOW); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,HIGH); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,LOW); 
  mydelay(M5451_CLK/2); 
  digitalWrite(serDataPin,HIGH); 
  mydelay(M5451_CLK/2); 
  digitalWrite(clockPin,HIGH); 
  mydelay(M5451_CLK); 
  digitalWrite(clockPin,LOW); 

  // Write the bits 
  for (i=0;i< M5451_NUMOUTS;i++) 
  { 
    int serDataVal; 
    if (i<32) { serDataVal = (a&1); a >>=1;} 
    else { serDataVal = (b&1); b>>=1;} 
    mydelay(M5451_CLK/2); 
    digitalWrite(serDataPin,serDataVal); 
    mydelay(M5451_CLK/2); 
    digitalWrite(clockPin,HIGH); 
    mydelay(M5451_CLK); 
    digitalWrite(clockPin,LOW); 
  } 
} 

void loop()                     // run over and over again 
{ 
  unsigned long int j; 
  int i; 
  FlickerBrightness leds(myClockPin,mySerDataPin,9); 
   Serial.print("clockpin: "); 
  Serial.println(myClockPin); 
  Serial.print("datapin: "); 
  Serial.println(mySerDataPin); 
  leds.setBrightness(255); 

  for (i=3;i>=0;i--) 
  { 
    for (j=0;j<35;j++) 
      { 
      leds.set(1L<< j,(j>=32) ? 1L<<(j-32):0); 
      delay(10*i); 
      } 
  } 

  // Proportional fading 
  if (1) for (j=0;j<200;j++) 
    { 
      for (i=0;i< M5451_NUMOUTS;i++) 
        { 
          int k = 1<<(j%13); 
          if ((i&3)<2) 
          { 
             if (leds.brightness[i] < 35) leds.brightness[i] = 35; 
             else leds.brightness[i] += 
leds.brightness[i]>>2; 
          } 
          else 
          { 
             if (leds.brightness[i] < 35) leds.brightness[i] = 
MaxBrightness; 
             else leds.brightness[i] -= 
leds.brightness[i]>>2; 
          } 
        } 
      for (i=0;i<100;i++) leds.loop(); 
    } 

  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  delay(250); 
  leds.set(0,0);  /* ALL OFF */ 
  delay(250); 

  // Linear per-LED brightness method 
  if (1) for (j=0;j<4096;j++) 
    { 
      for (i=0;i< M5451_NUMOUTS;i++) 
        { 
          int k = j*10; 
          if (i&1) 
          { 
            leds.brightness[i] = abs((k&(MaxBrightness*2-1))- 
MaxBrightness); 
          } 
          else 
            leds.brightness[i] = MaxBrightness - 
abs((k&(MaxBrightness*2-1))-MaxBrightness); 
        } 
      for (i=0;i<10;i++) leds.loop(); 
    } 


  // ALL FADE using M5451 Brightness feature 
  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  for (j=1;j<5;j++) 
   { 
   for (i=0;i<256;i++) 
      { 
      leds.setBrightness(i&255); 
      delay(j); 
      } 
   for (i=255;i>=0;i--) 
      { 
      leds.setBrightness(i&255); 
      delay(j); 
      } 
} 

  leds.setBrightness(255); 

  leds.set(0xffffffff,0xff);  /* ALL ON */ 
  delay(250); 
  leds.set(0,0);  /* ALL OFF */ 
  delay(250); 


  // MARQUEE 

  for (i=0;i< M5451_NUMOUTS;i++)  // Clear all LEDs to black 
    { 
      leds.brightness[i]=0; 
    } 

  // Turn on a couple to make a "comet" with dimming tail 
  leds.brightness[0] =  MaxBrightness-1; 
  leds.brightness[1] =  MaxBrightness/2; 
  leds.brightness[2] =  MaxBrightness/4; 
  leds.brightness[3] =  MaxBrightness/8; 
  leds.brightness[4] =  MaxBrightness/16; 
  leds.brightness[5] =  MaxBrightness/64; 
  leds.brightness[6] =  MaxBrightness/100; 

  for (j=0;j<100;j++) 
    { 
      leds.shift(1); 
      for (i=0;i<150;i++) leds.loop(); 
    } 

  for (j=0;j<100;j++) 
    { 
      leds.shift(-1); 
      for (i=0;i<100;i++) leds.loop(); 
    } 


  if (1) 
{ 
  leds.set(0xffffffff,0x7); 
  delay(1000); 
  leds.set(0xf0f0f0f0,0x7); 
  delay(10000); 
  leds.set(0x11111111,0x1); 
  delay(10000); 
} 

}

 

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

MocArt пишет:

в чем может быть дело:  ШИМ диоды загораются и затухают мигая

в delay-ях. 

rHOM
Offline
Зарегистрирован: 29.02.2020

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

В принципе у меня все просто реализовал на реле. Прошу сильно не пинать это мое знакомство с ардуино. 

Вот скетч.

#define  T1  24
#define  E1  26
#define  T2  28
#define  E2  30
int Relay1 = 2;
int Relay2 = 3;
int Relay3 = 4;
int Relay4 = 5;
int Relay5 = 6;
int Relay6 = 7;
int Relay7 = 8;
int Relay8 = 9;
int Relay9 = 10;
int Relay10 = 11;
int Relay11 = 12;
int Relay12 = 22;
void setup()
{
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
pinMode(E1, INPUT);
pinMode(E2, INPUT);
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
pinMode(Relay5, OUTPUT);
pinMode(Relay6, OUTPUT); 
pinMode(Relay7, OUTPUT); 
pinMode(Relay8, OUTPUT);
pinMode(Relay9, OUTPUT);
pinMode(Relay10, OUTPUT);
pinMode(Relay11, OUTPUT); 
pinMode(Relay12, OUTPUT);
}
void loop()
{
int D1 = Ultrasonic(T1, E1);    
if(D1 > 0 && D1 < 80)          
{
digitalWrite(Relay1, LOW);
delay(800);
digitalWrite(Relay2, LOW);
delay(800);
digitalWrite(Relay3, LOW);
delay(800);
digitalWrite(Relay4, LOW);
delay(800);
digitalWrite(Relay5, LOW);
delay(800);
digitalWrite(Relay6, LOW);
delay(800);
digitalWrite(Relay7, LOW);
delay(800);
digitalWrite(Relay8, LOW);
delay(800);
digitalWrite(Relay9, LOW);
delay(800);
digitalWrite(Relay10, LOW);
delay(800);
digitalWrite(Relay11, LOW);
delay(800);
digitalWrite(Relay12, LOW);
delay(8000);
}
    {
 digitalWrite(Relay1, HIGH);
delay(200);
digitalWrite(Relay2, HIGH);
delay(200);
digitalWrite(Relay3, HIGH);
delay(200);
digitalWrite(Relay4, HIGH);
delay(200);
digitalWrite(Relay5, HIGH);
delay(200);
digitalWrite(Relay6, HIGH);
delay(200);
 digitalWrite(Relay7, HIGH);
delay(200);
 digitalWrite(Relay8, HIGH);
delay(200);
digitalWrite(Relay9, HIGH);
delay(200);
digitalWrite(Relay10, HIGH);
delay(200);
 digitalWrite(Relay11, HIGH);
delay(200);   
 digitalWrite(Relay12, HIGH);
delay(200);
    }
 
int D2 = Ultrasonic(T2, E2);   
 
  if(D2 > 0 && D2 < 80)         
 {
digitalWrite(Relay12, LOW);
delay(800);
   digitalWrite(Relay11, LOW);
delay(800);
digitalWrite(Relay10, LOW);
delay(800);
digitalWrite(Relay9, LOW);
delay(800);
digitalWrite(Relay8, LOW);
delay(800);
   digitalWrite(Relay7, LOW);
delay(800);
digitalWrite(Relay6, LOW);
delay(800);
digitalWrite(Relay5, LOW);
delay(800);
digitalWrite(Relay4, LOW);
delay(800);
digitalWrite(Relay3, LOW);
delay(800);
digitalWrite(Relay2, LOW);
delay(800);
digitalWrite(Relay1, LOW);
delay(8000);      
}
{
digitalWrite(Relay12, HIGH);
delay(200);
digitalWrite(Relay11, HIGH);
delay(200);
digitalWrite(Relay10, HIGH);
delay(200);
digitalWrite(Relay9, HIGH);
delay(200);
digitalWrite(Relay8, HIGH);
delay(200);
digitalWrite(Relay7, HIGH);
delay(200);
digitalWrite(Relay6, HIGH);
delay(200);
digitalWrite(Relay5, HIGH);
delay(200);
digitalWrite(Relay4, HIGH);
delay(200);
digitalWrite(Relay3, HIGH);
delay(200);
digitalWrite(Relay2, HIGH);
delay(200);
digitalWrite(Relay1, HIGH);
delay(200);
 
 }
 
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;
 
}
Olegumar
Offline
Зарегистрирован: 03.03.2020

Всем привет.

Еще не зная какие бывают подсветки лестницы и из чего их делают, собрал свою. ( https://github.com/olegumar/Smart-Stairs )

Пока собирал ее, задавал себе много вопросов ( не буду обо всем ), в итоге пришел к тому, что нужно 3 датчика. Так же как у всех один внизу, другой вверху. А 3-й поставил посредине, датчик движения, т е пока есть какое-либо движение на лестнице, она будет светиться. Пришел к этому, так : в доме семья большая, постоянно кто то ходит, не только на встречу, могут остановиться на лестницы что б обмолвиться словечком, кто пошел и передумал, вернулся ... вообщем много чего, задержку тут ни как не запрограммируешь. Ни где в других проектах этого не вижу, потому мне они не нравятся.

Выключается лестница в направлении, где последний раз сработал SR04, а не как у других по направлению.

Еще, не стал добавлять режим плавного включения, так как вся лестница загорается быстро (2-3 сек), эффект почти не виден, по этой же причине не стал делать встречное включение. Когда кто то пошел на встречу, свет к нему уже прибежит. Первая и последния ступень у меня не светиться в режиме ожидания, хотя в скетч предусмотрено. Подумал, всю ночь будет гореть, зачем это надо. Если даже кто и встанет, до нее в потемках не пойдет, вкл какой-нибудь свет.

Предусмотрел включение света комнаты с телефона. Удобно когда спустился вниз, а свет забыл вверху выключить. Оказалось еще удобно когда ложишься спать, выкл свет. Так через телефон есть пару настроек, хочу их модернизировать для лестницы.

qbit
Offline
Зарегистрирован: 18.03.2019

Olegumar пишет:

...собрал свою...

А зачем измерять влажность и температуру?

Вот интересная статья есть:

Olegumar
Offline
Зарегистрирован: 03.03.2020

qbit пишет:

А зачем измерять влажность и температуру?

Вот интересная статья есть:

Влажность и температура  - для вкл вытяжки, это надо весь проект смотреть.

Ссылку которую дал, там ни чего нового, так же 2 датчика, знакомая схема и т д.

qbit
Offline
Зарегистрирован: 18.03.2019

Olegumar пишет:

Удобно когда спустился вниз, а свет забыл вверху выключить. Оказалось еще удобно когда ложишься спать, выкл свет. Так через телефон есть пару настроек, хочу их модернизировать для лестницы.

С телефоном спать ложитесь? А просто таймер на выключение или не хотите как у всех?

qbit
Offline
Зарегистрирован: 18.03.2019

Olegumar пишет:

Влажность и температура  - для вкл вытяжки, это надо весь проект смотреть.

Зачем ужа с ежом скрещивать? Если проект называете "Подсветка лестницы. 16 ступенек.", т.е. чисто освещение, причем, именно освещение для лестницы, то зачем ещё управление вытяжкой?

Olegumar пишет:

Ссылку которую дал, там ни чего нового, так же 2 датчика, знакомая схема и т д.

Согласен, для новезны L298N - самое то! А почему не использовать как выше рекомендуют, например, IRF7314?

qbit
Offline
Зарегистрирован: 18.03.2019

rHOM пишет:

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

В Вашем случае это естественно, т.к. понатыкано куча delay.

Olegumar
Offline
Зарегистрирован: 03.03.2020

qbit пишет:

С телефоном спать ложитесь? А просто таймер на выключение или не хотите как у всех?

Многие пользуются телефон как будильником, потому он всегда рядом.

qbit пишет:

Зачем ужа с ежом скрещивать? Если проект называете "Подсветка лестницы. 16 ступенек.", ...

Если ардуинка еще может что делать одновременно , почему и нет ... Экономия не только финансовая

qbit пишет:

Согласен, для новезны L298N - самое то! А почему не использовать как выше рекомендуют, например, IRF7314?

Еще раз напишу, когда начинал собирать, не знал из чего. Понимал что из транзисторов лучше и дешевле, но как подобрать не знаю, плюс ко всему надо еще под них плату лудить, что ни разу не делал.

Искал модули под ардуино, единственное что нашел это 520 транзистор, но он меня не устроил. До кучи из начально хотел делать из RGB ленты, для нее 298 отлично подходят. Управляя плюсом, на выходе можно получить либо плюс, либо минус. Мой скетч и сейчас не сложно доделать и он будет светить разными цветами, как я и хотел. После каждого срабатывания датчика меняется цвет.

В итоге у меня получилось минимум пайки. Даже из сдвиг регистров сделал модуль.

И это еще не все что может мой скетч. Предусмотрена передача данных другой ESP (другой проект). Вообщем автоматизирую дом, типа "умный дом"

Olegumar
Offline
Зарегистрирован: 03.03.2020

Вообще сюда заглянул, потому что мало инфы в инете про М5450. Интересует как лучше подключить 2шт. Могут ли они работать как сдвиг регистры в цепочке? И вообще принцеп их работы. Везде только и дают ссылку на даташе на анг, для меня это ни о чем.

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

Olegumar пишет:

Везде только и дают ссылку на даташе на анг, для меня это ни о чем.

а что, гугл транслейт отменили? - там всего-то 2-3 странички текста крупным щрифтом

Olegumar
Offline
Зарегистрирован: 03.03.2020

rHOM пишет:

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

digitalWrite(Relay2, HIGH);
delay(200);
digitalWrite(Relay3, HIGH);
delay(200);
digitalWrite(Relay4, HIGH);
delay(200);
У тебя идет постоянное выкл, и как уже сказали, с задержкой delay(200);. Пока они все не сработают, датчик не сработает.
12*200=2400мс, т е почти 2,5 сек задержка А если учесть что будет выкл в одну сторону, а потом в другую, то это уже 5сек.
Olegumar
Offline
Зарегистрирован: 03.03.2020

b707 пишет:

а что, гугл транслейт отменили? - там всего-то 2-3 странички текста крупным щрифтом

Есть переводчик, но этого для полного понимания мне мало. Не такой уж я и спец ...

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

Olegumar пишет:

Есть переводчик, но этого для полного понимания мне мало. Не такой уж я и спец ...

ну тогда вам и перевод не пришлдился бы.

просмотрел по диагонали, возможности каскадного соединения нескольких драйверов не обнаружил.

Olegumar
Offline
Зарегистрирован: 03.03.2020

то бишь каждый нужно цеплять отдельно и для каждого писать код ?

ghost13_2000
Offline
Зарегистрирован: 19.03.2021

есть у кого нибудь плата в SprintLayout . скиньте пожалуйста

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

ghost13_2000 пишет:

есть у кого нибудь плата в SprintLayout . скиньте пожалуйста

зачем она вам? проект давно устарел, сейчас такое делается в 10 раз проще на одной ленте адресных диодов

ghost13_2000
Offline
Зарегистрирован: 19.03.2021

лень заказывать. а под этот все есть

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

а плату не лень делать? и потом собирать? - в старой схеме раз в десять больше деталей, чем в новой

Silver-HaOS
Offline
Зарегистрирован: 06.02.2017

b707 пишет:

проект давно устарел, сейчас такое делается в 10 раз проще на одной ленте адресных диодов

Уважаемый B707, ссылку на новый проект не подскажете. Вариант с этой темы я уже сделал, но, возможно, нужен будет еще один. С этим действительно много возни, особенно с платой.

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

Silver-HaOS пишет:

Уважаемый B707, ссылку на новый проект не подскажете.

ишите у Гайвера, у него на форуме этих лестниц три или четыре варианта

Silver-HaOS
Offline
Зарегистрирован: 06.02.2017

  Доброго времени, Уважаемые. Как я писал ранее, всё было уже сделано и проверено на столе, но ждало своего часа для установки. В прошлую субботу установил уже на лестницу и настроил расстояния и освещение. И тут вылезла одна хрень - самопроизвольное срабатывание датчиков движения... В мониторе порта: всё нормально, расстояния до ближайшего препятствия указываются корректно (120см верх  и 261см низ), затем резко 0см и пошла работать подсветка... Провода к верхнему датчику длиной ~ 2.5 - 3м (6 проводов в одном кабеле без экрана): 4 - на датчик движения + 2 - на фоторезистор), Провода к нижнему датчику идут вместе с проводами ступеней в одном жгуте 7 метров - использован телефонный кабель https://datastream.by/25_parnyy_telefonnyy_neekranirovannyy_utp_kabel/ , изоляция и экран убраны, пересажен в термоизоляцию с отводами на каждую ступеньку и датчик движения. 

Пробовал корректировать расстояния срабатывания типа if(D2 > 10 && D2 < 100), if(D1 > 40 && D1 < 100)...

В доме светодиодный свет - некоторые светильники диммируемые - отключал полностью... Ничего не помогло.

Большинство ложных срабатываний приходится на нижний датчик (отношение с верхним ~ 20:1).

Есть ли какое решение? Может у кого такое было? Как решили? Спасибо.

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

Решение подтянуть выходы датчиков к плюсу или к минусу ( зависит от датчика)

Silver-HaOS
Offline
Зарегистрирован: 06.02.2017

b707 пишет:
Решение подтянуть выходы датчиков к плюсу или к минусу ( зависит от датчика)

 

Спасибо! Как сделаю - отпишусь.

Bierman
Offline
Зарегистрирован: 13.05.2014

Господа, в новых билдах я выкинул 5450... и начал использовать адрессные ленты. очень советую, облегчает сборку и экономит время.

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

Bierman пишет:

 начал использовать адрессные ленты. очень советую, облегчает сборку и экономит время.

у гайвера этих подмветок на сайте на любые хотелки