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

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

dimanok88 пишет:

Все это я совместил в один код, сейчас кинуть не могу свой код какой у меня получился, т.к. на работе нахожусь. Если кому нужно могу скинуть вечером, но код  еще не оптимизирован :-)

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

dimanok88
Offline
Зарегистрирован: 04.03.2014

Вечером, как буду дома, скину :-)

Для фоторезистора можно использовать следующий код:

sensorValue = analogRead(sensorPin);  // считываем значение с фоторезистора
if(sensorValue<500) digitalWrite(13, HIGH);   // включаем
else digitalWrite(13, LOW);   // выключаем
   
 // Для отладки 
Serial.println(sensorValue, DEC);     // вывод данных с фоторезистора (0-1024)
delay(500);  

Все очень просто.

Для меня самая сложность это схема ) с кодом гораздо проще разобраться )

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

dimanok88 пишет:

Вечером, как буду дома, скину :-)

Для меня самая сложность это схема ) с кодом гораздо проще разобраться )

Буду признателен.

У меня всё с точность до наоборот, схемы я ещё в детстве рисовал и паял. Правда с тех пор была пауза в 25 лет :)) , но как выяснилось руки помнят :)

А вот програмирование приходится с нуля осваивать сейчас.  

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

dimanok88, фоторезистор на 13 вход включен????Я правильно понял???

dimanok88
Offline
Зарегистрирован: 04.03.2014

YRA пишет:

dimanok88, фоторезистор на 13 вход включен????Я правильно понял???

Нет, не правильно.

вот тут cxem.net/arduino/arduino10.php пример посмотрите пожалуйста. Будут вопросы, задавайте. :)

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

Ну да, тогда надо добавлять, как я понимаю, веcь блок c 6 по 22 включительно, вот только 8 строка и 14 пустые, если их уразднить????

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
 
 
 
 
int sensorPin = A0;            // устанавливаем входную ногу для АЦП
unsigned int sensorValue = 0;  // цифровое значение фоторезистора
 
void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);        // старт последовательного вывода данных (для тестирования)
}
 
void loop()
{
  sensorValue = analogRead(sensorPin);  // считываем значение с фоторезистора
  if(sensorValue<500) digitalWrite(13, HIGH);   // включаем
  else digitalWrite(13, LOW);   // выключаем
  Serial.print(sensorValue, DEC);     // вывод данных с фоторезистора (0-1024)
  Serial.println("");                 // возврат каретки 
  delay(500); 

и вход A0

dimanok88
Offline
Зарегистрирован: 04.03.2014

Ну зачем вам целый блок? Это просто пример с одним фоторезистором. Если вы хотите сделать автоматическую подсветку лестницы, то тут не нужно вставлят ьвесь код а только с 17 по 19 строчку + в условие If нужно будть вписать свой код вместо digitalWrite(13, HIGH) , который будет выполняться если  фоторезистор выдает большее или меньшее значение. И прописать соответсвенно пины на которые будет подклоючен фоторезистор. это строка 6. строка 7 нужна для указания первоначального значения.

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

Понятно, спасибо. Завтра буду пробывать. 

dimanok88
Offline
Зарегистрирован: 04.03.2014

Как и обещал выкладываю код, но он не оптимизирован и без комментариев, поэтому что будет не понятно спрашивайте :-)


#include <Wire.h>
#include <math.h> 

int myClockPin = 7;             // Arduino pin that goes to M5451 clock
int mySerDataPin = 6;           // Arduino pin that goes to M5451 data
int br = 9;
long duration, inches, cm;

int BH1750address = 0x23; //setting i2c address
byte buff[2];

#define M5451_NUMOUTS 35
#define M5451_CLK 0
#define MaxBrightness 4096  //256

#define echoPin 2 // Echo Pin
#define trigPin 3 // Trigger Pin


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


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


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

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 M5451::setBrightness(byte b)
{
  if (brightPin < 0xff)
    analogWrite(brightPin,b);
}

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

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 60;
} 

int BH1750_Read(int address) //
{
  int i=0;
  Wire.beginTransmission(address);
  Wire.requestFrom(address, 2);
  while(Wire.available()) //
  {
    buff[i] = Wire.read();  // receive one byte
    i++;
  }
  Wire.endTransmission();  
  return i;
}

void BH1750_Init(int address) 
{
  Wire.beginTransmission(address);
  Wire.write(0x10);//1lx reolution 120ms
  Wire.endTransmission();
}



FlickerBrightness leds(myClockPin, mySerDataPin, br);
const uint32_t mask = 0b11111111111111111111;
void setup()                    // run once, when the sketch starts
{
  Wire.begin();
  Serial.begin(9600); 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  //leds.setBrightness(255);
}

void loop()                     // run over and over again
{
  //int i;
  uint16_t val=0;
  BH1750_Init(BH1750address);
  delay(200);
  
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH); 
  
  cm = microsecondsToCentimeters(duration);
  if(2==BH1750_Read(BH1750address))
  {  
    val=((buff[0]<<8)|buff[1])/1.2;
    
    Serial.print(val,DEC);    
    Serial.println("[lx]");
    
    if(val <=70){
      if(cm <= 15){
        leds.setBrightness(255);
        for (char j = 35; j >= 0; j--)
        {           
          //for(int i =0; i<=255; i++){
          // leds.setBrightness(i);        
          // delay(1);
          //}
          leds.set(mask << j, 0);
          delay(100);
        }
        delay(1000);
        for (char j = 0; j <= 35; j++)
        {
          leds.set(mask >> j, 0);
          delay(100);
        }
        delay(1000);
      }
    }
    delay(150);
  }
}


 

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Если я правильно понял у Вас ВН1750 это датчик освещённости, а Pin 2 и Pin 3 это один ультрозвуковой датчик и второго ультрозвукового датчика нет?

Какие функции реализованы в Вашем скетче?

dimanok88
Offline
Зарегистрирован: 04.03.2014

kruzhnoff пишет:

Если я правильно понял у Вас ВН1750 это датчик освещённости, а Pin 2 и Pin 3 это один ультрозвуковой датчик и второго ультрозвукового датчика нет?

Какие функции реализованы в Вашем скетче?

 Да все верно, второго датчика движения я пока не подключал :-) НО это не так сложно.

ВН1750 - да это датчик освещености.

Вот эта функция задает яркость светодиода leds.setBrightness(255); от 0 до 255.   

leds.set(mask >> j, 0); - это передвижение по светодиодам. В этой теме подсказали ранее как включить определенный светодиод- это для того чтобы включить первый и последний светодиоды с определенной яркостью.

Я сейчас застрял со схемой. вы сказали что uln2003A не подойдет, вот тепреь думю как с новыми трназисторами (irf7314) быть не пойму что-то. По дата шиту написано что нужно 20В а для драйвера нужно максимум 15В. вот теперь думаю как это все подключать.

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

Да 12 вольт подавай -это ж предельная напруга 20 и точок там не хилый, а тразисторы как ключ используются. Я вчере заказал через Радиолавку к 19 обещают привезти ну не хило  по 70 деревянных корпус.

Вот 185 пост, за основу.

http://forum.amperka.ru/threads/Автоматическая-подсветка-лестницы.1930/page-10

придут сборки- буду лепить по схеме с емкостями - вчера в SDM корпусах все приобрел.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA пишет:
 Я вчере заказал через Радиолавку к 19 обещают привезти ну не хило  по 70 деревянных корпус. 

А что так дорого?! Я в чип и дип за 20 рублей за штуку брал (через инет магазин).

Это мой пост и мои фотки. :))

Там только я немного в схеме ошибся. У меня выходы с микросхемы (М5450) получились в середине с 6 по 17-й. Надо как то скетч подправить, чтобы не с 1-го, а с 6-го начинало работать. А как пока не знаю.  

Щас схему и плату перерисовал с 1 по 14-й и чуть уменьшил габариты. Буду ещё одну делать, а ту соседу по даче отдам.

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

Нарисуешь брось ссылку,если не лом. Я  в Lauyote 6.0 добавлю емкости и прибудет счастье мне. Я изучал внимательно сею вот даташит IRF7314 изучаю чуть-чуть. Да у китайцев надо бы заказывать, но с почтой России -просто беда.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA пишет:

Нарисуешь брось ссылку,если не лом. Я  в Lauyote 6.0 добавлю емкости и прибудет счастье мне. Я изучал внимательно сею вот даташит IRF7314 изучаю чуть-чуть. Да у китайцев надо бы заказывать, но с почтой России -просто беда.

Да я уже нарисовал, осталось перенести на плату и вытравить. Я в Eagle рисовал.

Куда кидать? Здесь как я понял некуда фаил прикрепить.

А зачем конденсаторы то? Они там не нужны.

У китайцев дорого из-за доставки. В чип и дип самая адекватная цена на irf7314, http://www.chipdip.ru/product/irf7314/ от 3 шт.- 20 рублей. 

denyang
Offline
Зарегистрирован: 05.08.2013

Если не сложно еще мне схемку киньте. denyang@yandex.ru

dimanok88
Offline
Зарегистрирован: 04.03.2014

Я бы тоже не отказался от проекта в виде схемы я как раз пользуюсь Eagle )) Файлы можно выложить на яндекс диск или на любое облачное хранилище и сюда вставить ссылку

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

Ну уже поздно- днюжка заплачена. Да рисовать тогда сам буду,но для образца . Да как и я сделел на Яндекс диск и ссылку сюда положи. Думать то все равно меньше прийдется разводку повторю. Дая вот и сам думаю, там емкость и резистор вреоде как интегриующая цепочка, но порою еще. Мне 

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Непроблема могу выложить могу скинуть кому нужно. Только скажу сразу, что я не профисионал и делал для себя, так что сильно не судите. В библиотеке игло irf7314 не было поэтому поставил в схему другой элемент в том же фомате (SO-08). для меня главное было, что бы печатная плата была правильной. Если кто найдет библионеку для Eagle с irf7314 то можно будет сделать всё красиво.

Ну, собственно вот: https://yadi.sk/d/18b-hhlcedA8Q

 

dimanok88
Offline
Зарегистрирован: 04.03.2014

ООО спасибо тебе огромное, добрый человек :-)

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

denyang пишет:

Если не сложно еще мне схемку киньте. denyang@yandex.ru

Выложил в теме.

У Вас получилось добиться плавного поочерёдного розжига ступенек?

dimanok88
Offline
Зарегистрирован: 04.03.2014

kruzhnoff пишет:

У Вас получилось добиться плавного поочерёдного розжига ступенек?

Если этот вопрос ко мне, то еще пока даже не садился за код. Времени крайне мало на всё после работы :(

До этого делал только  для одного светодиода плавный розжиг работал отлично, когда сделал такое же, но на  все светодиоды то получалась какая то ерунда мигающая поэтому пока руки не добрались чтоб разобраться. У меня в коде кстати закомментирован этот кусок с 238-241 строках

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

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

Если по схеме или плате какие то вопросы возникнут, спрашивайте.

Там на плате внизу под разъёмами ультрасоника перемычка.

denyang
Offline
Зарегистрирован: 05.08.2013

Нет, не получилось пока :(

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

kruzhnoff, а если  не в лом то фото платы можно на почту кинуть.В Layout60 рисую сижу,но что-то трудно идет.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

denyang пишет:

Нет, не получилось пока :(

А с подсветкой первой и последней ступенек в полнакала?

denyang
Offline
Зарегистрирован: 05.08.2013

с подсветкой первой и последней получилось.

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


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

const uint32_t mask = 0b1111111111111111;
void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
  digitalWrite(FOTO, HIGH);
  pinMode(BR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
}

void loop() 
{

  analogWrite (BR,  25);
 MM5450(0b1000000000000001);

//  static bool state;
//  if(analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
//  if(analogRead(FOTO) < 990) state = 0; // порог освещенности выключения
//  if(state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
    if(D1 > 0 && D1 < 100)          // если расстояние меньше 100см, то
    {
      analogWrite (BR,  brightset);
      for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask<<i);
        delay(200);                 // задержка зажигания
      }
      delay(10000);                  // ждем 3 секунды
      for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
      {
        MM5450(mask>>i);
        delay(200);                 // задержка затухания
      }
    }

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

 

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

denyang, а датчики 4,5 и 2,3 .т.е если мотражка из первого поста то соответсвенно входа надо менять 10,11 и 12,13 ? так верно. Спасибо за работу.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA пишет:

kruzhnoff, а если  не в лом то фото платы можно на почту кинуть.В Layout60 рисую сижу,но что-то трудно идет.

Давай саму прогу Eagle скину, что бы не заморачиваться. 

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

denyang

А не могли бы пояснить как у Вас работает подсветка первой и последней ступений. Я так понял на подсветку отдельный аналоговый канал вывели?

012 //Устанавливаем контакт управления яркостью светодиодов
013 #define  BR  9
 
038   analogWrite (BR,  25);
039  MM5450(0b1000000000000001);

На контакт 9 что ставить? 

Brutal
Offline
Зарегистрирован: 14.03.2013

denyang пишет:

с подсветкой первой и последней получилось.

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

maksim
Offline
Зарегистрирован: 12.02.2012

denyang пишет:

с подсветкой первой и последней получилось.

Что бы постоянно не "дрочить" MM5450 лучше сделать так:

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

const byte brightset = 255;

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

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
  digitalWrite(FOTO, HIGH);
  pinMode(BR, OUTPUT);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
  FirstLast();
}

void loop() 
{

  int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
  if(D1 > 0 && D1 < 100)          // если расстояние меньше 100см, то
  {
    analogWrite (BR,  brightset);
    for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в одну сторону
    {
      MM5450(mask<<i);
      delay(200);                 // задержка зажигания
    }
    delay(10000);                  // ждем 3 секунды
    for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
    {
      MM5450(mask>>i);
      delay(200);                 // задержка затухания
    }
    FirstLast();
  }

  int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
  if(D2 > 0 && D2 < 100)          // если расстояние меньше 100см, то
  {
    analogWrite (BR,  brightset);
    for(char i = NUM_LEDS-1; i >= 0; i--) // зажигаем светодиоды в другую сторону
    {
      MM5450(mask>>i);
      delay(200);                 // задержка зажигания
    }
    delay(10000);                  // ждем 3 секунды
    for(char i = 0; i <= NUM_LEDS; i++)  // тушим светодиоды 
    {
      MM5450(mask<<i);
      delay(200);                 // задержка затухания
    }
    FirstLast();
  }
  delay(20);
}


void FirstLast()
{
  analogWrite (BR,  25);
  MM5450(0b1000000000000001);
}


int Ultrasonic(byte Trig_pin, byte Echo_pin)
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);   
  return pulseIn(Echo_pin, HIGH, 20000)/29.0/2;
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < NUM_LEDS; i++)
  {
    if(data & (1UL<<i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 35-NUM_LEDS; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

 

denyang
Offline
Зарегистрирован: 05.08.2013

Не успел рассказать как реализован слабое свечение первой и последней ступенек, а  многоуважаемый Maksim успел не только исправить но даже оптимизировать  код :)

9й выход ардуины идет на ножку управления яркость свечения. Соответсвенно когда мы пишем на него 25, светиться слабо. В моем коде была пропущена строчка задающая максимальныю яркость свечения:

const byte brightset = 255;

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

Уважаемый maksim, спасибо огромное Вам за вашу помощь в реолизации и оптимизации этого проекта. И коль уж пошла такая пьянка может поможите нам реализовать последовательный плавный поджиг (ШИМ) подсветки ступений. Самим нам чувствую не справиться. :( 

denyang
Offline
Зарегистрирован: 05.08.2013

Присоеденяюсь к просьбе 

maksim
Offline
Зарегистрирован: 12.02.2012

На MM5450 это врятли получится, скорее всего не хватит ресурсов МК.

denyang
Offline
Зарегистрирован: 05.08.2013

Но ведь в посту 106 представлен код где реализован плавный поджиг, правда не так как нужна в данной задаче

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

maksim пишет:

На MM5450 это врятли получится, скорее всего не хватит ресурсов МК.

Недумаю, что это будет тяжелей для МК чем скетч используемый в проекте по это ссылке http://effluviaofascatteredmind.blogspot.ru/2009/02/arduino-and-m5451-control-35-leds.html

Я тот скетч загружал в свой контроллер всё отлично работает, ресурсов хватает. У меня МК  Atmega328 pro mini 5 В 16 м. 

Давайте попробуем.

maksim
Offline
Зарегистрирован: 12.02.2012

Что у вас отлично работает?

Попробуйте зажечь одновременно, например, 3 светодиод на 20% яркости, а 5 светодиод на 100% яркости. Я в коде автора этотго не увидел. А общей яркостью вы уже и так управлять умеете.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

denyang пишет:
9й выход ардуины идет на ножку управления яркость свечения. Соответсвенно когда мы пишем на него 25, светиться слабо.

Т.е. вместо +12 через резистор 1к на 19-й выход (BRIGHTNESS CONTROL) подаём сигнал с 9-го выхода ардуино. Правильно?

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

maksim пишет:

Что у вас отлично работает?

Попробуйте зажечь одновременно, например, 3 светодиод на 20% яркости, а 5 светодиод на 100% яркости. Я в коде автора этотго не увидел. А общей яркостью вы уже и так управлять умеете.

Спец эфект "комета", как раз там несколько сетодиодов с разной яркостью одновременно горят и двигаются. Там когда хвостом назад она бежит, это думаю то, что нам надо.

maksim
Offline
Зарегистрирован: 12.02.2012

Ну давайте поближе рассмотрим вашу камету

void setup()                    // run once, when the sketch starts
{
}


#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(7, 6 ,9); // CLOCK, DATA, BRIGHT

  leds.setBrightness(255);

  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;

  while(1) leds.loop();
}

 

denyang
Offline
Зарегистрирован: 05.08.2013

Именно так 

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

denyang пишет:

Именно так 

Спасибо. Всё работает.

Я так понял, что можно для этих целей использовать вместо 9-го любой другой свободны выход поддерживающий pwm. К примеру 5-й.

denyang
Offline
Зарегистрирован: 05.08.2013

Да. Просто мне было удобней использовать 9-ю ногу

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

Если использовать не изменяя скетч и 182 поста, то 5-я нога занята, только меняя их местами -это уже от разводки платы зависить, что и где прописывать. Т.е. либо плату рисуешь, а потом под нее скетч правишь, либо наооборт под скетч -плату рисуешь.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

maksim пишет:

На MM5450 это врятли получится, скорее всего не хватит ресурсов МК.

maksim, извеняюсь за назойливость, а на TLC5940NT можно будет воплотить задуманное?

Вот тут http://www.odduino.com/blog/primery_s_tlc5940nt/2011-07-25-2 так сладко её описывают, что я неудержался и заказал одну у катайцев на пробу. :) Тем более цена на тот момент на неё у продавцы былы всего 88 рублей с доставкой, щас смотрю он ещё сотню на доставку накинул. http://ru.aliexpress.com/item/1pcs-for-IC-LED-Driver-PWM-Control-28-DIP-TLC5940NT-TLC5940-Electronic-Component/32219248568.html?recommendVersion=2 Но, всёравно цена остаётся ниже чем на М5450.

kruzhnoff
Offline
Зарегистрирован: 09.02.2015

YRA пишет:

Если использовать не изменяя скетч и 182 поста, то 5-я нога занята, только меняя их местами -это уже от разводки платы зависить, что и где прописывать. Т.е. либо плату рисуешь, а потом под нее скетч правишь, либо наооборт под скетч -плату рисуешь.

У меня одна плата собрана, а другая уже нарисована и мне 5-я нога удобне потому что меньше рисовать.

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

А я вот за основу Вашу платку беру, ну компановку, да и разводку, размеры чуть,наверное, увеличить прийдется, а вот с подсветкой буду думать, как сделеть разводку так, что бы ну, предположим, перемычкой, обойтись, либо есть подсветка- либо нет.

 

denyang
Offline
Зарегистрирован: 05.08.2013

Я сейчас работаю на кодом где все это будет реализовано программно и настраиваться с помощью 2х кнопок