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

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 19 сен 2013.

  1. ИгорьК

    ИгорьК Давно здесь Команда форума

    ... а, вы тут о своем...
    Платить бабки будете за предоставленное рекламное поле?
     
  2. Aivaredze

    Aivaredze Нерд

    да не Игорь,я свой.
    собрал себе сам,заказал себе у китайцев платку,их пришло 10 штук, осталось 8, тк одну
    спалил,5штук раздарил,три целый год на полке провалялись..щас на ебэе.осталась одна.
     
  3. Aivaredze

    Aivaredze Нерд

    все файлы предоставил,если есть желание повозиться,можно собрать самому.
     
    ИгорьК нравится это.
  4. Здравствуйте, у меня есть такой скетч
    #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);
    }

    но при закачке в ардуино он у меня выбивает ошибку, ошибка компиляции скетча, если кто может помочь разобраться буду очень благодарен
     
  5. ИгорьК

    ИгорьК Давно здесь Команда форума

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

    Указанный код не компилировался и ранее. Именно это подвигло меня написать свой и создать эту тему.
     
  6. Вы верно подметили, идея проекта хорошая, респект вам, но у вас заточена под мегу, а можно обойтись и нано или мини.
     
  7. ИгорьК

    ИгорьК Давно здесь Команда форума

    Можно. А зачем? Вы все ещё старый черно-белый телевизор смотрите? Им тоже можно обойтись. Но цветной удобнее.

    https://ru.aliexpress.com/item/MEGA...lgo_pvid=0c90f8b4-a5ef-44bc-8269-e7795b3b1708
     
  8. Нет, телевизор у меня цветной, просто все компоненты уже преобретены, хотелось бы их использовать, вот и я поднял эту тему
     
  9. ИгорьК

    ИгорьК Давно здесь Команда форума

    В теме Лукьянова до сих пор (сколько лет) этот код не исправлен. Думаю, Вы зря надеетесь что кто-то возьмется его править.
     
  10. Да новерно я поспешил с покупкой
     
  11. Aivaredze

    Aivaredze Нерд

    все будет офигенно...непоспешили.
    любая ардуинка +шифт регистор74HC595 = огромное количество шим ступеней.
    скеч ниже.

    #define SHIFTPWM_NOSPI // Uncomment this part to NOT use the SPI port and change the pin numbers. This is 2.5x slower Do not change!!!
    const int ShiftPWM_dataPin = 6;
    const int ShiftPWM_clockPin = 7;
    const int ShiftPWM_latchPin = 8;
    #include <ShiftPWM.h>
    const bool ShiftPWM_invertOutputs = false;
    const bool ShiftPWM_balanceLoad = false;
    #define sensorLight_PIN A0
    #define sensorBottom_PIN A1
    #define sensorUpper_PIN A2
    unsigned char maxBrightness = 100; // Here you set the number of brightness levels. Adjust(0-255)!!
    unsigned char pwmFrequency = 75; // These values affect the load of ShiftPWM
    unsigned int numRegisters = 3; // Number of shift registers Do not change!!!
    unsigned int numOutputs = numRegisters * 8;
    unsigned int numRGBLeds = numRegisters * 8 / 3;
    unsigned int fadingMode = 0; // start with all LED's off.
    boolean sensorUpperActive;
    boolean sensorBottomActive;
    byte numberOfstairs=24; // Setup Number of Your stairs. Adjust up to 24 !!!!
    int pause=100; // Setup delay ON/OFF Adjust!!!
    byte faidoutSpeed=5; // How fast to fadeout Adjust!!!
    byte faidinSpeed=5; // How fast to fadein Adjust!!!
    int val;

    void setup() {


    ShiftPWM.SetAmountOfRegisters(numRegisters);
    ShiftPWM.Start(pwmFrequency, maxBrightness);
    pinMode(sensorBottom_PIN, INPUT);
    pinMode(sensorUpper_PIN, INPUT);
    pinMode(sensorLight_PIN, INPUT);
    Serial.begin(9600);
    }



    void loop() {

    val = analogRead(5); //Checking light level
    if (val <= 10) { // Adjust photocell cencivity. (val<10 dark.....val>800 bright..) !!!!!!!!

    BottomTriggerFire(); //Checking bottom sensor
    UpperTrigerFire(); //Checking upper sensor
    switchONOFFfromdown(); //Stairs on/off from down to up
    switchONOFFfromUp(); //Stairs on/off from up to down
    }
    }

    void BottomTriggerFire() {

    if (analogRead (sensorBottom_PIN) >= 550 ) { //Depands of the sensor tipe, if 0 when triggered ,than change the comparation to opposide value.
    sensorBottomActive = true;
    }
    }

    void UpperTrigerFire() {

    if (analogRead(sensorUpper_PIN) >= 550) {
    sensorUpperActive = true;
    }
    }


    void switchONOFFfromdown() {
    if (sensorBottomActive==true && sensorUpperActive==false){


    for(int i=0; i<numberOfstairs; i++){
    for(int a=0; a<maxBrightness; a++){
    ShiftPWM.SetOne(i,a);
    delay(faidoutSpeed);
    }
    }

    delay(pause);

    for(int i=0; i<numberOfstairs; i++){
    for(int a=maxBrightness;a>=0;a--){
    ShiftPWM.SetOne(i,a);
    if(a==0){
    ShiftPWM.SetOne(i,0);
    }
    delay(faidinSpeed);
    }
    }
    sensorBottomActive = false ;
    }
    }

    void switchONOFFfromUp () {
    if ( sensorUpperActive==true && sensorBottomActive==false) {


    for(int i=numberOfstairs; i>=0; i--){
    Serial.print(i);
    for(int a=0; a<maxBrightness; a++){
    ShiftPWM.SetOne(i,a);
    delay(faidoutSpeed);
    }
    }

    delay(pause);


    for(int i=numberOfstairs; i>=0; i--){
    //Serial.print(i);
    for(int a=maxBrightness;a>=0;a--){
    ShiftPWM.SetOne(i,a);
    if(a==0){
    ShiftPWM.SetOne(i,0);
    }
    delay(faidinSpeed);
    }
    }
    sensorUpperActive= false ;
    }
    }
     
  12. ZAZ-965

    ZAZ-965 Гуру

    Поправил библиотеки для сборки в IDE 1.8.2 (ZIP архивы во вложении, распаковать в папку libraries ).
    Скетч собрался, пробуйте (остались предупреждения в библиотеке lightuino3, с ними тоже можно будет разобраться )
    Код (C++):
    #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<9;j++) {
        ledState[j] = B00000000;
      }
      //Зажигаем
      for (int k=1;k>=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<9;j++) {
        ledState[j] = B00000000;
      }
    //Зажигаем
      for (int k=0;k<=1;k++)
      {
      for (int j=0;j<9;j++)  
      {
        ledState[k]=(ledState[k] << 1) + 1;
        sinks.set(ledState);        
         delay(lightSpacing);
      }    }
      delay(lightHold);
      for (int k=0;k<=1;k++)
      {
      for (int j=0;j<9;j++)  
      {
        ledState[k]=(ledState[k] << 1);
        sinks.set(ledState);        
         delay(lightSpacing);
      }  
    }
    delay(pingReadDelay);
    }
     

    Вложения:

    krauzor нравится это.
  13. Shadow2091

    Shadow2091 Нуб

    Получил плату, дошла нормально. Ардуинки Нано пока нет, только Уно, так что проверить пока не могу (с переопределением ног не разбирался). За скетч с софтварным ШИМ спасибо, принцип понял. Но, судя по коду, если одновременно сработают и верхний и нижний сенсор, то МК перестанет реагировать на сенсоры вообще.
     
  14. Aivaredze

    Aivaredze Нерд

    добрый,давайте в личку перейдем,а то опять пивас кое-кто требовать начнет.. :)
     
  15. ИгорьК

    ИгорьК Давно здесь Команда форума

    Вишь какая тема хорошая... и аффтара пнуть можно и рекламной площадкой воспользоваться и денежку зажать - самому срубить :)
     
  16. Aivaredze

    Aivaredze Нерд

    ну вот , началось....
    не дремлет сторожила... :)
     
  17. krauzor

    krauzor Нуб

    Можно TRIG_PIN и ECHO_PIN заменить на один.
    Я HC-SR04 подключил как тут (стр 4, рис 2):
    http://smartstair.ru/upload/smartstair24_hm_1705.pdf
    Там надо один резюк 620 Ом потавить между Trig и Echo и получиться одна линия.
    А кто подскажем зачем его надо ставить?
     
  18. Ivanenkoav

    Ivanenkoav Нуб

    Вопрос к автору. Почему у меня после заливки скетча для ПИР инвертировались сигналы. То есть 255 диод выключен, 0 диод горит на полную мощность. Может мега китайская кривая? Перепроверил подключение раз 10. Почти все в скетче заменил окромя выключения после подсветки. Не пойму где надо поменять с 0 на 255...
    У меня ULN2803APG. При подключении начинают гореть и мерцать все диоды, как будто пробой где-то. Может тоже китайская фигня. Неделю копаюсь, не могу сделать. Руки опускаются. Готов сам код уже написать и на мосфетах сделать.
    Не первый мой проект...
    Не подскажете куда копать???
     
  19. Ivanenkoav

    Ivanenkoav Нуб

    Почти разобрался. Изменил скетч, на светодиодах заработало. Для ULN необходима общая земся и для платы и для диодов с лентами. Подключил ленты, скетч менять не надо (котия скетча ИгоряК), только вноси свои корректировки и установливай на лестницу, не надо голову ломать с программой. ИгорьК СПАСИБО!!!
    П.С. с инверсией сигнала так и не разобрался... Почему при 255 выключен диод (только на диодах, на ленте все окей), а при 0 горит...
     
  20. Slaiterx

    Slaiterx Гик

    uln2003 инвертирует сигнал поэтому и в скетче наоборот