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

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

Вот повторил схемку Лукьянова В. С. http://lukjanow.ru/2012/04/automatic-illumination-stairs-arduino/

Все заработало, но проблема в колличестве загораемых светодиодов: по скетчу автора их загораеться 16, а мне нужно 20 (так как у меня 20 ступенек). С паяльником и схемотехникой дружу, а вот с прогрпммированием, к сожалению, нет :(. Пробовал разобраться сам, изучал http://code.google.com/p/arduino-m5451-current-driver/ но так и не допер, что нужно поменять, что бы засветились 20 светиков , а не 16. Буду ОЧЕНЬ благодарен за подсказку ! Ато каждый вечер, при подъеме в темноте на 2 этаж, вспоминаю, что лежит не доделанная подсветка. Автор, к сожалению не ответил на письмо :(

Скетч автора выглядит так:

#include "lightuino3.h"
#include "Ultrasonic.h"

//Устанавливаем контакты для первого датчика
#define  TRIG_PIN  12
#define  ECHO_PIN  13
//Устанавливаем контакты для второго датчика
#define  TRIG2_PIN  10
#define  ECHO2_PIN  11
//Определяем первый датчик
Ultrasonic OurModuleUp(TRIG_PIN, ECHO_PIN);
//Определяем второй датчик
Ultrasonic OurModuleDown(TRIG2_PIN, ECHO2_PIN);
// pins 0, 1 used by Serial
const unsigned char DataPin = 6;
const unsigned char clockPin = 7;

// задержка между ступеньками
const long lightSpacing = 280;
//задержка свечения всей лестницы
const long lightHold = 10000;
//задержка выстрела сенсоров
const long pingReadDelay = 50;

// Диапазон при котором сработает сенсор
const float minBottomIn = 33.0f;
const float minTopIn = minBottomIn;

LightuinoSink sinks(clockPin, DataPin, 100, 4);

boolean bClimbStarted = false;
boolean bDescentStarted = false;

int val;
void setup() {
  Serial.begin(9600);
  pinMode(DataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  delay(1000);
  sinks.set(0,0,0);
}

void loop() {
   val = analogRead(0);
   //Проверяем освещенность в помещении
   if (val>=1020){

 UltrasonicDownFire();//Выстрел нижнего датчика
  if(bClimbStarted) {
    bClimbStarted = false;
    bDescentStarted = false;
    climbLightSequence();
  }
  else {
    // Выстрел верхнего датчика
    UltrasonicUpFire();
    if(bDescentStarted) {
      bClimbStarted = false;
      bDescentStarted = false;
      descentLightSequence();
    }
  }
  delay(pingReadDelay);
  }
}

//Обработка верхнего датчика
void UltrasonicUpFire() {

if((OurModuleUp.Ranging(INC) < minTopIn) && (OurModuleUp.Ranging(INC) > 0))
{
Serial.println("Top sensor tripped.");
bDescentStarted = true;
}
}

//Обработка нижнего датчика]
void UltrasonicDownFire() {

    if((OurModuleDown.Ranging(INC) < minTopIn) && (OurModuleDown.Ranging(INC) > 0)) {
      Serial.println("Bottom sensor tripped.");
      bClimbStarted = true;
    }
}

void climbLightSequence(){
LedsOnDown();
}
void LedsOnDown(){
  //Обнуляем
   byte ledState[9];
  for (int j=0;j=0;k--)
  {
  for (int j=8;j>=1;j--)
  {
   ledState[k] = (ledState[k] >> 1) + 128;
    sinks.set(ledState);
    delay(lightSpacing);
  }
     }
//Задержка
  delay(lightHold);
//Гасим
  for (int k=1;k>=0;k--)
  {
  for (int j=8;j>=1;j--)
    {
    ledState[k] = (ledState[k] >> 1);
    sinks.set(ledState);
    delay(lightSpacing);
    }
  }
 delay(pingReadDelay);
}

void descentLightSequence(){
  LedsOnUp();
}

void LedsOnUp(){
 //Обнуляем
  byte ledState[9];
  for (int j=0;j    ledState[j] = B00000000;
  }
 //Зажигаем
  for (int k=0;k  {
  for (int j=0;j  {
    ledState[k]=(ledState[k] << 1) + 1;
    sinks.set(ledState);
     delay(lightSpacing);
  }    }
  delay(lightHold);
  for (int k=0;k  {
  for (int j=0;j  {
    ledState[k]=(ledState[k] << 1);
    sinks.set(ledState);
     delay(lightSpacing);
  }
}
 delay(pingReadDelay);
}

 

 

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

Простите не заметил сразу как всавлять программный код в сообщение. А отредактировать сообщение не пойму как :(

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

Рекомендую вам выбросить этот код и написать свой. Не использую этих бесполезных библиотек.

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

maksim пишет:

Рекомендую вам выбросить этот код и написать свой. Не использую этих бесполезных библиотек.

К сожалению, я не силен в написании :( А обидно, работает но не до конца ...

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

Для начала давайте избавимся от бестолковой библиотеки Ultrasonic.h

//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11

void setup() 
{
  Serial.begin(9600);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
}

void loop() 
{
  Serial.print("D1 = ");
  Serial.print(Ultrasonic(T1, E1));
  Serial.print("cm      D2 = ");
  Serial.print(Ultrasonic(T2, E2));
  Serial.println("cm");
  delay(100);
}

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

В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?

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

maksim пишет:

Для начала давайте избавимся от бестолковой библиотеки Ultrasonic.h

//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11

void setup() 
{
  Serial.begin(9600);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
}

void loop() 
{
  Serial.print("D1 = ");
  Serial.print(Ultrasonic(T1, E1));
  Serial.print("cm      D2 = ");
  Serial.print(Ultrasonic(T2, E2));
  Serial.println("cm");
  delay(100);
}

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

В сериал-монитор должны выводиться дистанции с обоих датчиков. Выводятся?

Спасибо за отклик !

нет :( в монитор мусор какойто постоянно сыпет без влияния датчиков даже

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

Не может такого быть. Какой мусор? копируйте и сюда выложите, вы скорость сериал-соединения правильно установили?

Если у вас датчики HC-SR04 и они правильно подключены, то все должно работать. Единственное что может не работать - это 1 датчик из-за того что Е1 на 13 выводе - это я подправил, но никак не мусор.

//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11

void setup() 
{
  Serial.begin(9600);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
}

void loop() 
{
  Serial.print("D1 = ");
  Serial.print(Ultrasonic(T1, E1));
  Serial.print("cm      D2 = ");
  Serial.print(Ultrasonic(T2, E2));
  Serial.println("cm");
  delay(100);
}

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

 

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

Сори, скорость нета действительно стояла

Работает ! Пишет расстояние !

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

Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены  к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  MM5450(0xFFFFFFFF);
  delay(1000);
  MM5450(0x00000000);
  delay(1000);
}

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

 

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

maksim пишет:

Дальше давайте избавимся от еще более бесполезной библиотеки lightuino3.h. Для этого надо заглянуть в даташит ММ5450 из которого после беглого осмотра ясно, что для работы драйвера нужно отправить в него 36 бит, первый бит должен быть 1, а остальные 35 - соответсвуют выводам микрухи, так же там написано ,что после передачи 36 бита защелкнется защелка. Так что если у вас все светодиоды подключены  к выводам от 1 до 20 по порядку, то в следующем примере кода они должны все загораться и тухнуть:

Моргают !

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

Ну а теперь давайте попробуем подвигать их туда - сюда. Туда:

uint32_t mask = 0b11111111111111111111;

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  for(char i = 19; i >= 0; i--)
  {
    MM5450(mask<<i);
    delay(100);
  }
  delay(1000);
  for(char i = 0; i < 20; i--)
  {
    MM5450(mask>>i);
    delay(100);
  }
  delay(1000);
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < 20; i++)
  {
    digitalWrite(DATA, data&(1UL<<i));
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 15; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

Кстати, если двигаются, то куда? снизу-вверх или сверху-вниз?

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

Зажигаеться последовательно только 8 штук Двигаються  от output bit 1

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

Так все загораются?

uint32_t mask = 0b11111111111111111111;

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  MM5450(0xFFFFFFFF);
  delay(1000);
  MM5450(0);
  delay(1000);
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < 20; i++)
  {
    digitalWrite(DATA, data&(1UL<<i));
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 15; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

 

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

maksim пишет:

Так все загораются?

uint32_t mask = 0b11111111111111111111;

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  MM5450(0xFFFFFFFF);
  delay(1000);
  MM5450(0);
  delay(1000);
}

void MM5450(uint32_t data)
{  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for(byte i = 0; i < 20; i++)
  {
    digitalWrite(DATA, data&(1UL<<i));
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for(byte i = 0; i < 15; i++)
  {    
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

Мигает только 8. Не по очереди а все 8 сразу

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

А пример из сообщения #8 ?

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

maksim пишет:

А пример из сообщения #8 ?

там мигают все, только что перепроверил !

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

А так?

uint32_t mask = 0b11111111111111111111;

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  for(char i = 19; i >= 0; i--)
  {
    MM5450(mask<<i);
    delay(100);
  }
  delay(1000);
  for(char i = 0; i < 20; i--)
  {
    MM5450(mask>>i);
    delay(100);
  }
  delay(1000);
}

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

 

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

maksim пишет:

А так?

uint32_t mask = 0b11111111111111111111;

//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
}

void loop() 
{
  for(char i = 19; i >= 0; i--)
  {
    MM5450(mask<<i);
    delay(100);
  }
  delay(1000);
  for(char i = 0; i < 20; i--)
  {
    MM5450(mask>>i);
    delay(100);
  }
  delay(1000);
}

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

 

так все заграются по порядку ! правда у меня 20й (последний) не распаян на плате но думаю и там все ок

Померял на 20м выходе тестором все ОК !

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

Ну и остается объединить в один кода два примера и задать условия:

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

const uint32_t mask = 0b11111111111111111111;

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

void loop() 
{
  if(Ultrasonic(T1, E1) < 100)    // если расстояние первого датчика меньше 100см, то
  {
    for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону
    {
      MM5450(mask<<i);
      delay(100);                 // задержка зажигания
    }
    delay(3000);                  // ждем 3 секунды
    for(char i = 0; i < 20; i--)  // тушим светодиоды 
    {
      MM5450(mask>>i);
      delay(100);                 // задержка затухания
    }
  }
  
  if(Ultrasonic(T2, E2) < 100)    // если расстояние второго датчика меньше 100см, то
  {
    for(char i = 19; i >= 0; i--) // зажигаем светодиоды в другую сторону
    {
      MM5450(mask>>i);
      delay(100);                 // задержка зажигания
    }
    delay(3000);                  // ждем 3 секунды
    for(char i = 0; i < 20; i--)  // тушим светодиоды 
    {
      MM5450(mask<<i);
      delay(100);                 // задержка затухания
    }
  }
  delay(20);
}


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

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

 

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

Зажигаются периодически сами по себе без датчиков и с 1 по 20.

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

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

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

Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.

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

const uint32_t mask = 0b11111111111111111111;

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

void loop() 
{
  int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
  if(D1 > 0 && D1 < 100)          // если расстояние меньше 100см, то
  {
    for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону
    {
      MM5450(mask<<i);
      delay(100);                 // задержка зажигания
    }
    delay(3000);                  // ждем 3 секунды
    for(char i = 0; i < 20; i--)  // тушим светодиоды 
    {
      MM5450(mask>>i);
      delay(100);                 // задержка затухания
    }
  }

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


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

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

 

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

maksim пишет:

Это из-за того что иногда датчики 0 возвращают, когда не могут померить расстояние.

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

const uint32_t mask = 0b11111111111111111111;

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

void loop() 
{
  int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
  if(D1 > 0 && D1 < 100)          // если расстояние меньше 100см, то
  {
    for(char i = 19; i >= 0; i--) // зажигаем светодиоды в одну сторону
    {
      MM5450(mask<<i);
      delay(100);                 // задержка зажигания
    }
    delay(3000);                  // ждем 3 секунды
    for(char i = 0; i < 20; i--)  // тушим светодиоды 
    {
      MM5450(mask>>i);
      delay(100);                 // задержка затухания
    }
  }

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


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

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

 

И так загораются сами по себе с 1 по 20 без влияния датчиков :( И еще у меня в семе есть фоторезистор (для включения светиков только в темное время суток).

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

Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.

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

maksim пишет:

Так не бывает. Значит что-то попадает в зону действия датчика от 1см до 99см, либо датчик подглючивает.

Ок проверю есче. Попробую уменшить расстояние выстрела датчика. Отпишусь.

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

Уменшил расстояние УЗ датчиков до 50 см. В итоге работает вроде как так: при вкл. ждет срабатывания датчика. Срабатывет правильно, тоесть зажигает или снизу или сверху в зависимости от датчика. Но ! после 1 срабатывания работа зацикливаеться - после срабатывания идет -поджих светиков - потухли - снова поджих через паузу - поджиг итд но без ожидания сработки датчика. Нужно, что ли, какоето обнуление схемы, ожидание начального сотояния.... Пр ивкл. схемы ардуина мигает красным, ждет срабатывания датчика, а после первого срабатывания уже не мигает, а просто периодически поочередно засвечивает. Вот как то так.

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

В коде ошибка была - в циклах везде минусы стояли.

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

const uint32_t mask = 0b11111111111111111111;

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

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

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


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

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

 

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

Еще заметил: если при сработке верхнего датчика светики загораются сверху вних  потом тухнут и снова загораются но уже снизу вверх.

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

Почти порядок. При срабатывании светиков от конца в начало не тухнет последний светик. Потом при сработке наоборот он тухнет.

 

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

Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?

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

Я Вам очень признателен и благодпрен Максим !!! Даже и не думал, что кто то так поможет. Думал может разве что подсказочку дадут, а Вы молодец ! Респект !

Еще был бы благодарен за внедрение в скетч работы моего фоторезистора. Может можно просто скопировать кусок из того скетча.

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

maksim пишет:

Подробней, не понятно. При срабатывании какого датчика (D1 или D2) что происходит?

При срабатывании датчика подключенного к контактам 12 и 13 ардуины. Светики загораються по порядку но последний не тухнет. Если идет сработка опять же етого датчика то светик тухнет и засвечиваются сначала и опять последний не тухнет до сработки датчиков.

maksim
Offline
Зарегистрирован: 12.02.2012
//Устанавливаем контакты для первого датчика
#define  T1  12
#define  E1  13
//Устанавливаем контакты для второго датчика
#define  T2  10
#define  E2  11
//Устанавливаем контакты для драйвера
#define  DATA  6
#define  CLOCK 7

const uint32_t mask = 0b11111111111111111111;

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

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

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


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

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

 

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

По поводу фоторезистора - просто обверните в условие кусок кода с 25 по 55 строки. Предварительно посмотрев через стандартный пример AnalogReadSerial какие значения выдает фоторезистор.

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

Вот так все верно загораеться и тухнет! Пасибки ! А регулировать скорость загорания и скорость затухания светиков етим? Тоесть, к примеру, что бы светики загорались медленнее и тухли медленнее. Оно- delay(100); // задержка зажигания и delay(100); // задержка затухания ???

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

Да, плюс еще есть задержка свечения, та что 3 секунды.

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

maksim пишет:

Да, плюс еще есть задержка свечения, та что 3 секунды.

Да да, спасибо, я понял. Еще раз премного Вам благодарен !!! В Вашем скетче хоть немножко и мне понятно ;) Хорошо, что не перевелись еще такие как Вы !

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

Максим помогите еще плз. Попробовал только что выгрызть кусок для фоторезистора но не компилиться :( Нехвтает моих мозгов :) При тех значених вроде нормальн работало.

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

Так покажите что не компилируется.

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

Нужны ети строки или еще что то ? И как ето обернуть в условие ? И куда их впихнуть ? (перед измерением расстоянияили все равно куда). Простите за такие нубские вопросы :) Как я писал, с программированием у меня БЕДА !

// Диапазон при котором сработает сенсор
const float minBottomIn = 33.0f;
const float minTopIn = minBottomIn;
 val = analogRead(0);
   //Проверяем освещенность в помещении
   if (val>=1020){

 

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

Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?

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

maksim пишет:

Вы через стандартный пример AnalogReadSerial смотрели что в мониторе когда темно и когда светло?

Нет не смотрел . Просто у меня на том скетче работало. Когда фоторезистор вниз подстол наклонял-  срабатывала подсветка а подымал вверх на свет - не срабатывала.

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

const uint32_t mask = 0b11111111111111111111;

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

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

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


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

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

 

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

Как видите есть зона нечувствительности

if(analogRead(FOTO) > 1020) state = 1; // порог освещенности включения
if(analogRead(FOTO) < 1000) state = 0; // порог освещенности выключения

то есть включится при значении больше 1020, а выключится только если ниже 1000, можете уменьшить или увеличить зону нечувствительности.

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

Еще раз ОГРОМНОЕ спасибо ! Работает ! Только пришлось фонариком засветить что бы не срабатывал :). Но с этим, благодаря Вам я думаю справлюсь ;)

Может кому еще интересно будет смогу выложить фото или видео (пока только в настольном варианте). И всем буду писать что скомпилировано благодаря хорошему человеку аля  maksim.

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

Увеличте порог выключения if(analogRead(FOTO) < 1015) state = 0; // порог освещенности выключения

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

Пробовал играться значением: 1015 // порог освещенности выключения. Сначала не понял почему разницы особо не было :) , а оказалось етот фоторезистор немного "слеповат" к теплому спектру лучей (мои экономки в люстре).От холодного белого (рядом стоящая настольная лампа) срабатывает. Так что подстрою уж под свое освещение ;)

 

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

У фоторезистора какой номинал подтягивающего резистора?

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

maksim пишет:

У фоторезистора какой номинал подтягивающего резистора?

10к

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

То есть это у резистора номинал 10 кОм, а не фоторезистора, правильно?
То есть подключено так? 

Тогда попробуйте резистор на 20кОм или выше, или вообще уберите его и такой код залейте:

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

const uint32_t mask = 0b11111111111111111111;

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

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

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


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

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

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

#define  FOTO A0

void setup() 
{
  Serial.begin(9600);
  digitalWrite(FOTO, HIGH);
}

void loop() 
{
  Serial.println(analogRead(FOTO));
  delay(100);
}

 

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

Схемка верна. Завтра поробую еще поиграться. Спасибо за советы !!!