Автоматическая подсветка лестницы и 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 аватар
Онлайн
Зарегистрирован: 25.01.2017

MocArt пишет:

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

в delay-ях.