Обсуждаем цифровые устройства...
Ответить

Re: Большие плавные часы Arduino & WS2812 flowing clock

Сб дек 12, 2020 20:19:59

Поделитесь пожалуйста исходником с целью получения возможности по подключению датчиков, изменению настроек, для понимания процесса в конце концов, что на что влияет. Ну не могу я тупо залить прошивку и пользоваться, хочется поковыряться в "потрохах" с целью изучения влияющих параметров, HEX залить любой "инженер" может, а прикинуть что на что влияет, добавить по такому ж принципу еще два разряда для отобраения секунд, процентов, градусов, (ед. изм) да и не помешало бы ознакомиться с влияющим параметром на подключение ленты в направлении от часов к секундам и наоборот, опять же большинство изобретателей придерживаются последовательности соединения сегментов C,D,E,F,A,B,G у в Вашей версии порядок подключения сегментов G,C,D,E,F,A,B, тут тоже хотелось бы разобраться почему. В общем преследую цель собрать макетку из 6-ти восьмерок, и попытаться доработать Ваш скетч под свои хотелки. Прошу Вас, поделитесь пожалуйста скетчем. Да и большая просьба сочинить подробный мануал по настройкам, а то видео в ютубе смотрел так и ничего те понял. Как у нас на заводе говорят: -"техпроцесс должен быть написан так, чтобы можно было посадить за рабочее место ребенка умеющего читать, и читая техпроцесс даже ребенок должен суметь без единой ошибки изготовить изделие для нужд министерства обороны".

Re: Большие плавные часы Arduino & WS2812 flowing clock

Вс дек 13, 2020 05:29:22

Поделитесь пожалуйста исходником с целью получения возможности по подключению датчиков, изменению настроек, для понимания процесса в конце концов, что на что влияет.
Скетч я жму.
Могу дать только в обмен на разводку платы и то с условием, что он нигде в сети не всплывёт.
Описание настроек в теме есть.
в видео совсем старая версия туда смотреть не надо.
Основные настройки (время дата, будильники достаточно интуитивны.
Номерные описаны тоже боле-менее понятно. С этим у людей трудностей не возникает. Даже у моей мамы 70+.
Ну не могу я тупо залить прошивку и пользоваться, хочется поковыряться в "потрохах" с целью изучения влияющих параметров

Залейте. посмотрите и пишите своё.
Уверен, что через полгодика поймёте, что написали то же самое.
добавить по такому ж принципу еще два разряда для отобраения секунд, процентов, градусов, (ед. изм)

Каждая фигня в проекте очень жестко обоснована.
Даже анимация нужна не для красоты, а чтобы глаза "не дёргало", особенно по ночам.
Добавление ещё двух разрядов делают девайс громоздким и перегруженным.
Когда смотришь секунды, не нужны часы.
Особенно это напрягает когда начинаешь продумывать корпус.
Жирная строка через полкомнаты в прямоугольном ящике, как у большинства это не эстетично. Даже из отдельных воздушных сегментов и то "тяжеловато"
Процентов нет. Согласен, Если надо добавлю ещё пару светиков под это дело.
Но уверен, что не надо.
Я эти часы "вылизываю" второй год.
Когда есть готовый вариант, то появляется понимание, что реально нужно добавить, а что не нужно. А пока нет - одни фантазии.
Первые 4 варианта отличались друг от друга довольно сильно.
Теперь даже фантазии не хватает, чего можно такого впендюрить хоть сколь-нибудь обоснованного.
да и не помешало бы ознакомиться с влияющим параметром на подключение ленты в направлении от часов к секундам и наоборот, опять же большинство изобретателей придерживаются последовательности соединения сегментов C,D,E,F,A,B,G у в Вашей версии порядок подключения сегментов G,C,D,E,F,A,B, тут тоже хотелось бы разобраться почему.
Так вышло случайно.
В прочем это легко переделывается.
Я одно время пытался сопровождать прошивки на оба варианта схемы.
Была даже прошивка под 6 разрядов.
Но поскольку мишаниного железа у меня нет, то нет гарантии, что оно заработает на последней версии моей прошивки.
В общем преследую цель собрать макетку из 6-ти восьмерок
Есть более интересные задачи, на которые можно потратить время.
У меня есть практически готовый проект девайса "Сталкер"
Таймер-градусник-фонарик-лазер-УФ-люксметр-звонок
с промежуточными функциями типа
"включить звонок при снижении/повышении освещенности
или температуры."
"выключить/включить фонарик по времени"
"включить звонок при обрыве шлейфа или лазерного луча"
"термостатировать"
и т.п.
Есть реальный прототип, которым я активно пользуюсь уже почти год.
Реально полезнейший девайс хоть для дома хоть для дачи хоть для гаража, хоть в походе !
ПРОВЕРЕНО !
Чаще всего нужен таймер, фонарик и лазер.
Таймер сделан как на современных микроволновках. Без лишних кнопок и без лишних касаний. Интервал устанавливается вообще не глядя в 1-3 касания
Вот этот скетч я не прячу.
Проекту нужна плата и корпус. И возможно ещё какие-то фишки прошивки.
Скажем не плохо-бы добавить магнитометр, выносную сирену и сервопривод.

Есть мечта сделать миниатюрный вариант. скажем поясной.
Там вес набирается не более 150-200 граммов
А то сейчас такая "дубинка" 20 см из профильной трубы 25х50
весом чуть не килограмм.
https://radiokot.ru/forum/viewtopic.php ... 9#p3562319

Есть ещё проект "Портативный монитор СО2 температуры и сквозняка"
Весьма полезная штучка. Тоже работает у меня второй год.
Нужно развести плату. Корпус шикарный уже есть.
https://radiokot.ru/forum/viewtopic.php ... 3#p3796213

Re: Большие плавные часы Arduino & WS2812 flowing clock

Вс дек 13, 2020 10:28:10

Скетч я жму. -А в чем проблема?
Могу дать только в обмен на разводку платы -А чего там разводить? Там же сплошной навесной монтаж, ленты приклеены и между собой соединяются проводами, датчики все висят на кабелях и закреплены вне корпуса, что бы нагрев содержимого не влиял на точность измерений, и противоположные концы припаяны к разъемам, ответные части которых закреплены на корпусе и опять же при помощи проводов припаяны к ардуине, и то с условием, что он нигде в сети не всплывёт. А это что занаезд, обоснуйте, Вы где то видели что я выдавал чьито разработки за свои???, Вы вообще гдето видели мои видео в ютюбе с жаждой прославиться и заработать себе "лайков", Вы на каком то форуме вообще видели что бы я вроде Вас выеживался, гнул пальцы и выдавал чьито идеи за свои, требую обосновать наезд!!! Даже анимация нужна не для красоты -детский сад. А как же например заменить bmp280 на bme280 и реализовать измерение относительной влажности, ведь это дело все меняется и добавляется в скетче, прописываются порты прочее, разве не так, что Вы тут мне голову морочите, у самого небось и нет скетча, стырил небось готовый HEX у коллеге по радиоклубу 145.500, ведь если бы скетч был бы то какая проблема им поделиться, тем более при жажде по выпендриваться, какой типа ты крутой аньжинер?
Последний раз редактировалось 67RUS Вс дек 13, 2020 16:04:28, всего редактировалось 1 раз.

Re: Большие плавные часы Arduino & WS2812 flowing clock

Вс дек 13, 2020 15:41:24

я крутой аньжинер
Когда делаешь единственный макет, согласен достаточно макетки
Но когда собираешь 8-ой экземпляр то возиться целый день с этой долбаной макеткой, мягко говоря, не хочется.
требования к платке имеются.
На ней кроме ардуины и модулей времени и давления
должен быть
Разъём для перешивания
Разъём для внешних градусников
Для питания
двойной эмиттерный повторитель(УНЧ)
И пара мощных мосфетов для управления светильниками (мощными лентами)
(я сделал большое зеркало с подсветкой)
Кнопочки и контакты для припаивания внешних кнопок
Свободные ноги ардуины тоже вывести на контактные площадки
Вообщем в плате ЕСТЬ смысл.

Вариант прошивки есть и под BMP и под BME

Re: Большие плавные часы Arduino & WS2812 flowing clock

Вс дек 13, 2020 16:17:06

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

Re: Большие плавные часы Arduino & WS2812 flowing clock

Вс дек 13, 2020 16:56:35

ухожу от сюда.
и зря
Тебе предлагают сотрудничество, а ты за мелкий "велосипед" ухватился.
Когда я начинал, я тоже взял чью-то схему чью-то прошивку в 30 строк кода.
Тогда просто не было готовых продвинутых решений.
Ну поиграешься маленько со скетчем. Ведь ничего сколь-нибудь значимого не изменишь. Ну датчик там шило на мыло переправишь.
Всё равно что брать жигули и ОТТЮНИНГОВАТЬ чтобы "летала".
Это ведь всё равно будут всё те же жигули.

Предложи что-то реально интересное.

Добавлено after 10 minutes 26 seconds:
PS
Так между прочим вот погляди это основа анимации
может пригодится
Спойлер
Код:
void convert() { //готовить пиксели к зажиганию
  uint8_t pix;
  uint16_t tripix;
  if (obnovitTablo) {
    obnovitTablo = false;
    pereliv = true;
    //сначала заполняем табло посегментно
    #ifdef _b612
    for (razryad = 0; razryad < 4; razryad++) //переберём разряды
    #endif //#ifdef _b612
    #ifdef _Mishany
      for (razryad = 0; razryad < 6; razryad++) //переберём разряды
    #endif //#ifdef _Mishany   
      { razryadx21 = razryad * _LEDNASEGMENT * 7; //чтобы 21 раз не перемножать, перемножимо 1 раз и сохраним в переменную
        switch (rejin) { //в зависимости от режима
          case  AdjChasy://VremyaToDIG();
          case  AdjMinuty://VremyaToDIG();
          case  ChasyMinuty: {
              VremyaToDIG();
              break;
            }
          case  AdjDenNedeli://DayToDIG();
          case  DenMesyzaINedeli: {
              DayToDIG();
              break;
            }
          case  AdjSekundy://VremyaMMSSToDIG();
          case  MinutyISekundy: {
              VremyaMMSSToDIG();
              break;
            }
          case  AdjGod://YearToDIG();
          case  God: {
              YearToDIG();
              break;
            }
          #ifdef _BMPBME
          case  Davlenie: {
              Davlenie_ToDIG();
              break;
            }
          #ifdef _BME280
          case  Vlajnost: {
              VlajnostToDIG();
              break;
            }
          #endif//#ifdef _BME280         
          #endif//#ifdef _BMPBME
          case  RejOsveshennost: {
              Osveshennost_ToDIG();
              break;
            }
          case  AdjDenMesyza://DateToDIG();
          case  AdjMesyz://DateToDIG();
          case  MesyazIDenMesyaza: {
              DateToDIG();
              break;
            }
          case  RejinSettingsIndex:
          case  RejinSettings: {
              Set_ToDIG();
              break;
            }
          case  Temperatura0:
          case  Temperatura1:
          case  Temperatura2:
          case  Temperatura3:
          case  Temperatura4: {
              TermToDIG();
              break;
            }
          case  AdjAvtomat: {
              A_ToDIG();
              break;
            }
          #ifdef _Budilniki
          case    AdjBudilnikIndex: {
              BudilnikIndex_ToDIG();
              break;
            }
          case    AdjBudilnikChasy://{BudilnikVremya_ToDIG();break;}
          case    AdjBudilnikMinuty: {
              BudilnikVremya_ToDIG();
              break;
            }
          case    AdjBudilnikWDIndex:
          case    AdjBudilnikWD: {
              BudilnikWD_ToDIG();
              break;
            }
          #endif//#ifdef _Budilniki
          #ifdef _Timer
          case    RejTimer: {
              Timer_ToDIG();
              break;
            }
          #endif//#ifdef _Timer
          default: {
              ;
            }
        }
        //if ((rejin >= Temperatura0) && (rejin <= Temperatura9)) {TermToDIG();}
        //     Serial.print("rejim.");
        //     Serial.println(rejin,DEC);
        //     Serial.print("cvet.");
        //     Serial.println(Cvet,DEC);
        #ifdef _Mishany
        //добавим смещение, возникающее из за точек
        if (razryad >= 2) {
          razryadx21 = razryadx21 + 2;
        }
        if (razryad >= 4) {
          razryadx21 = razryadx21 + 2;
        }
        #endif //#ifdef _Mishany
        for (uint8_t segment = 0; segment < 7; segment++) {//переберём сегменты
          segmentx3 = segment * _LEDNASEGMENT; //перемножим и сохраним, чтобы потом 7 раз не перемножать
          tagmask = pgm_read_byte(&digits[(DIG * 7) + 6 - segment]) * Cvet;
          for (pix = 0; pix < _LEDNASEGMENT; pix++) //переберём пиксели в сегментах
          {
            Tag[razryadx21 + segmentx3 + pix] = tagmask;
            //pixels.setPixelColor(razryadx21+segmentx3+pix, r,g,b);
          }
        }
      }
    //потушим прибамбасные (не сегментные) пиксели
    #ifdef _b612
    for (pix = pixTochkaVerh; pix < NUMPIXELS; pix++) {
      Tag[pix] = 0;
    }
    #endif //#ifdef _b612
    #ifdef _Mishany
    Tag[pixTochkaVerh23] = 0;
    Tag[pixTochkaNiz23] = 0;
    Tag[pixTochkaVerh45] = 0;
    Tag[pixTochkaNiz45] = 0;
    #endif //#ifdef _Mishany
    //дорабатываем поточечно
    switch (rejin) { //в зависимости от режима
      case  AdjChasy://VremyaPix();
      case  AdjMinuty://VremyaPix();
      case  ChasyMinuty: {
          VremyaPix();
          break;
        }
      case  AdjDenNedeli:{
          DayToPix(CvetBelyj);
          break;
        }
      case  DenMesyzaINedeli: {
          DayToPix(CvetDnyaNedeli);
          break;
        }
      case  AdjSekundy://VremyaMMSSToPix();
      case  MinutyISekundy: {
          VremyaMMSSToPix();
          break;
        }
      case  AdjGod://YearToPix();
      case  God: {
          YearToPix();
          break;
        }
      case  RejOsveshennost: {
          Osveshennost_ToPix();
          break;
        }
      case  AdjDenMesyza://DateToPix();
      case  AdjMesyz://DateToPix();
      case  MesyazIDenMesyaza: {
          DateToPix();
          break;
        }
      case  RejinSettingsIndex:
      case  RejinSettings: {
          Set_ToPix();
          break;
        }
      #ifdef _BMPBME
      case  Davlenie: {
          Davlenie_ToPix();
          break;
        }
      #endif//#ifdef _BMPBME
      case  Temperatura0:
      case  Temperatura1:
      case  Temperatura2:
      case  Temperatura3:
      case  Temperatura4:
        {
          TermToPix();
          break;
        }
      #ifdef _DublScrToUART
      case  AdjAvtomat: {
          A_ToPix();
          break;
        }
      #endif//#ifdef _DublScrToUART
      #ifdef _Budilniki
      case  AdjBudilnikIndex: {
          BudilnikIndex_ToPix();
          break;
        }
      case  AdjBudilnikChasy: {
          BudilnikVremya_ToPix();
          break;
        }
      case  AdjBudilnikMinuty: {
          BudilnikVremya_ToPix();
          break;
        }
      case  AdjBudilnikWDIndex:
      case  AdjBudilnikWD: {
          BudilnikWD_ToPix();
          break;
        }
      #endif//#ifdef _Budilniki       
      #ifdef _Timer
      case  RejTimer: {
          Timer_ToPix();
          break;
        }
      #endif//#ifdef _Timer
      default: {
          ;
        }
    }
    #ifdef _DublScrToUART
    if (tabloToUART)
    { for (uint8_t i = 0; i <= 6; i++)
      {
        Serial.write(DIGstr[i]);
      }
      Serial.write(0x0D);
    }
    #endif//#ifdef _DublScrToUART     
  }//obnovitTablo
  //приблизим на шаг старую картинку к новой
  LocalFlajok = true;//сбрасывается при любом непоследнем сдвиге
  for (pix = 0; pix < NUMPIXELS; pix++)  {
    if ((!VremennoNeSpim) & Spim & (VsegdaDen | (!DenNoch)) ) //будем спать когда пора если всегда день или темно
      //соответственно если пора спать но датчик активен и светло, то не спим
    { //если спим то любой базовый цвет будет черный CvetChernyj
      basColorR = 0;
      basColorG = 0;
      basColorB = 0;
    }
    else
    {
      basColorR = Palitra[Tag[pix]][0];
      basColorG = Palitra[Tag[pix]][1];
      basColorB = Palitra[Tag[pix]][2];
    }
    switch (DelitelYarkosti)//в зависимости от режима
    {
      case 8: {
          basColorR = basColorR / 256;
          basColorG = basColorG / 256;
          basColorB = basColorB / 256;
          //spd = 1;
          break;
        }
      case 7: {
          basColorR = basColorR / 128;
          basColorG = basColorG / 128;
          basColorB = basColorB / 128;
          //spd = 1;
          break;
        }
      case 6: {
          basColorR = basColorR / 64;
          basColorG = basColorG / 64;
          basColorB = basColorB / 64;
          //spd = 1;
          break;
        }
      case 5: {
          basColorR = basColorR / 32;
          basColorG = basColorG / 32;
          basColorB = basColorB / 32;
          //spd = 1;
          break;
        }
      case 4: {
          basColorR = basColorR / 16;
          basColorG = basColorG / 16;
          basColorB = basColorB / 16;
          //spd = 1;
          break;
        }
      case 3: {
          basColorR = basColorR / 8;
          basColorG = basColorG / 8;
          basColorB = basColorB / 8;
          //spd = 3;
          break;
        }
      case 2: {
          basColorR = basColorR / 4;
          basColorG = basColorG / 4;
          basColorB = basColorB / 4;
          //spd = 5;
          break;
        }
      case 1: {
          basColorR = basColorR / 2;
          basColorG = basColorG / 2;
          basColorB = basColorB / 2;
          //spd = 10;
          break;
        }
    }
    xTag[1] = basColorR;
    xTag[0] = basColorG;
    xTag[2] = basColorB;
    //переберём цвета (RGB)
    #ifdef __NeoPixel
    tripix = pix * 3;
    CurPix = Cur + tripix;

    for (uint8_t i = 0; i < 3; i++)
    { if ((CurPix[i]) < (xTag[i])) //определимся надо уменьшать или увеличивать
        //если до цели больше чем один шаг, делаем шаг
      { if (((xTag[i]) - (CurPix[i])) > (shagx[i])) {
          CurPix[i] = (CurPix[i]) + (shagx[i]);
          LocalFlajok = false;
        }
        //если до цели меньше чем один шаг, приравниваемся к цели
        else if (((xTag[i]) - (CurPix[i])) > 0) {
          CurPix[i] = xTag[i];
        }
      }
      else
        //если до цели больше чем один шаг, делаем шаг
      { if (((CurPix[i]) - (xTag[i])) > shagx[i]) {
          (CurPix[i]) = (CurPix[i]) - (shagx[i]);
          LocalFlajok = false;
        }
        //если до цели меньше чем один шаг, приравниваемся к цели
        else if (((CurPix[i]) - (xTag[i])) > 0) {
          CurPix[i] = xTag[i];
        }
      }
    }
    //перенесём в табло
    //pixels.setPixelColor(pix, CurPix[1], CurPix[0], CurPix[2]);
    #endif

  }
  if (LocalFlajok) {
    pereliv = false; //перелив закончился
  }

#ifdef _Zajcy
  //зайчики
  if (ZajcyOnOFF != 0)
  {
    //зайцы бегают только когда день и не спим
    if (!Spim && DenNoch)
    {
      uint8_t yark;//яркость зайца
      for (pix = 0; pix < 3; pix++) //переберём трёх зайцев
      { if (Tag[zayats[pix][0]] != 0) {
          yark = 35; //если бежит по включенному яркоссть одна
        }
        else {
          yark = 6; //если бежит по выключенному яркость другая
        }
        //Запомним цвет полянки на которой будет сидеть заяц
        PolyankaIsporxhena = true;
        CurPix = Cur + ((zayats[pix][0]) * 3);
        zayats[pix][2] = CurPix[0];
        zayats[pix][3] = CurPix[1];
        zayats[pix][4] = CurPix[2];
        zayats[pix][5] = zayats[pix][0];
        switch (pix)
        {
          case  0: {
#ifdef __NeoPixel
              pixels.setPixelColor(zayats[pix][0], yark * 2, 0, 0);  //красный
#endif
              //spd = spd * 2;
              break;
            }
          case  1: {
#ifdef __NeoPixel
              pixels.setPixelColor(zayats[pix][0], 0, yark, 0);  //зеленый
#endif
              //spd = spd * 3;
              break;
            }
          case  2: {
#ifdef __NeoPixel
              pixels.setPixelColor(zayats[pix][0], 0, 0, yark);  //синий
#endif
              //spd = spd * 4;
              break;
            }
        }
      }
    }
  }
  #ifdef __NeoPixel
    pixels.show();
  #endif
  //после того как вывели массив в реальные светики
  //восстановим исходные цвета всех полянок
  if (PolyankaIsporxhena)
  { for (pix = 0; pix < 3; pix++) //переберём трёх зайцев
    { CurPix = Cur + ((zayats[pix][5]) * 3);
      CurPix[0] = zayats[pix][2];
      CurPix[1] = zayats[pix][3];
      CurPix[2] = zayats[pix][4];
    }
    PolyankaIsporxhena = false;
  }
#else//#ifdef _Zajcy
#ifdef __NeoPixel
  pixels.show();
#endif
#endif//#ifdef _Zajcy
}
#ifdef _Zajcy

Re: Большие плавные часы Arduino & WS2812 flowing clock

Сб июн 11, 2022 13:05:10

Дошли руки до ESP32

В связи с этим может быть у кого есть код, как выводить звук через ШИМ на ESP-хе ?
Ответить