Звезда или снежинка

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Не утерпел, создаю тему на момент задумки. ) Просьба не цитировать первое сообщение, оно будет дополняться.

 

На носу у нас что? Нет не бородавка, и даже не Масленица. На носу у нас Новый год, а это повод весело помигать диодами.

Используя случай скажу, этот форум мне интересен, он строг, но и справедлив и в лучших традициях Open Source.  Поздравляю с наступающим Новым годом всех форумчан и в особенности старожилов, админов и модераторов.

Теперь по теме, к Новому году надо бы сделать какую-нибудь «моргающую» поделку,  пошукал я по сусекам, адресных лент никогда не заказывал, трёхцветных диодов тоже не обнаружил, нашёл пять диодов (два красных, два синих и один жёлтый). В комплекте к ним шли резисторы на 220 Ом, их и буду применять при подключении. Так же есть в наличии ардуино нано, блок питания AC 100-240V в DC 5V на 0,6A и цифровой модуль с фоторезистором. Буду использовать ШИМ выходы нанки.

Продолжение следует...

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Первые результаты:

Разорился на 300 рублей ради корпуса, в итоге будет ёлочка с пятью светодиодами. Светодиоды встают в отверстия как родные. Плюс выключатель в корпусе. Нанка и блок питания в корпус не влезут. Но пока ещё не монтировал.

Схема банальна, пять светодиодов через резисторы 220 Ом к портам с поддержкой ШИМ. Не стал рисовать, у меня и красивой рисовалки пока нет.

/*
Класс LedBlink, написан AndreyD, ссылка на первое размещение кода с примером использования http://arduino.ru/forum/proekty/zvezda-ili-snezhinka сообщение #1
Использует порты с поддержкой ШИМ для управления светодиодами. 
leds[] - массив светодиодов (объекты класса)
Функцию leds[0].goLed() необходимо использовать в цикле с задержкой 125 миллисекунд.
value - яркость светодиода от 0 до 255
stepValue - изменение яркости за цикл от -255 до 255
timeStep - время таймера от 0 до 4 294 967 295 с шагом 125 миллисекунд (указанных в цикле).
Примеры использования на одном светодиоде (объекте класса):
1. leds[0].GetValue(); // считывание текушей яркости
2. leds[0].SetValue(100); // установка яркости на 100 (яркость от 0 до 255)
3. led[0].GetTimeStop; // флаг окончания заданного ранее интервала времени
4. leds[0].goLed(0,0,0); // рандомный режим
5. leds[0].goLed(1,3,0); // растущая яркость c шагом 3 (шаг от 1 до 255)
6. leds[0].goLed(2,3,0); // убывающая яркость c шагом 3 (шаг от 1 до 255)
7. leds[0].goLed(3,0,900); // устанавливает таймер на гашение светодиода через 900 миллисекунд.
*/

class LedBlink {
  bool timeStop=1;
  uint8_t pin, value=0, mode=0;
  int16_t stepValue=0;
  uint32_t timeStep=0, ms=0;

public:
  LedBlink(uint8_t valPin) {
    pin = valPin;
    pinMode(pin, OUTPUT);
    analogWrite(pin, value);
  }

  uint8_t GetValue() {return value;}
  void SetValue(uint8_t value) {this -> value = value;}
  bool GetTimeStop() {return timeStop;}
   
  void goLed(uint8_t mode, int16_t stepValue, uint32_t timeStep) {
    this -> mode = mode;
    this -> stepValue = stepValue;
    if (timeStop) this -> timeStep = timeStep;
    switch (mode) {
      case 0: {
        if (( millis() - ms) >= timeStep){
          ms = millis();
          timeStep = random(1000,3000);
          stepValue = random(-10, 10);
        }
        if (((value + stepValue) >= 0) && ((value + stepValue) <= 255)) value = value + stepValue;
        break;
      }
      case 1: {
        if ((value + stepValue) <= 255) value = value + stepValue; else value = 0;
        break;
      }
      case 2: { 
        if ((value - stepValue) >= 0) value = value - stepValue; else value = 255;
        break;
      }
      case 3: { 
        if (( millis() - ms) >= timeStep){
           ms = millis();
           value = 0;
           timeStop = 1;
        } else timeStop=0;
        break;
      }
    
    }
    analogWrite(pin, value);
  }  
};

// Массив с портами с поддержкой ШИМ
static LedBlink leds[] = {3, 5, 6, 9, 10};
// Размер массива с портами поддерживаюшими ШИМ, т.е. колличество светодиодов
static constexpr uint8_t totalLeds = sizeof(leds) / sizeof(leds[0]);

void setup() {
  randomSeed(analogRead(A0));
}

// Далее пример использования класса
uint8_t loopMode=0, loopValue=0;
uint32_t loopMs=0, loopTimeStep=0;

void loop() {
  if (( millis() - loopMs) >= loopTimeStep){
    loopMs = millis();
    loopMode = random(0,4);
    loopTimeStep = random(10000,30000);
    if (loopMode == 1) for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(0);
    if (loopMode == 2) for (uint8_t i = 0; i < totalLeds; i++) leds[i].SetValue(255);
    if (loopMode == 3) loopValue = random(100,255);
  }
  
  switch (loopMode) {
      case 0: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(0,0,0);
        break;
      }
      case 1: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(1,3,0);
        break;
      }
      case 2: {
        for (uint8_t i = 0; i < totalLeds; i++) leds[i].goLed(2,3,0);
        break;
      }
      case 3: {
        for (uint8_t i = 0; i < totalLeds; i++) {
          leds[i].goLed(3,0,1000);
          if (leds[i].GetTimeStop()) leds[i].SetValue(loopValue);
        }
        break;
      }
  }
  
  delay(125);
}

Смонтировал в корпус:

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Собираетесь дополнять исходное сообщение темы?

Оптимист...

В свое время, когда вот примерно встал такой же вопрос, купил  ближайшем магазине пару метров светодиодной ленты (не адресной, обычной трехцветной на 12В). Использовал Pro Mini. 18 ног - 6 трехцветных каналов. Отрезал от ленты 18 кусочков, кажется, по 6 диодов. Расположил на диске ок. 30 см в диаметре вдоль лучей. Подключил по 3 в параллель. В качестве усилителей тока кт315. БП 12В 1А. Ну и программку, в которой все это бегает по кругу в различных сочетаниях. ШИМ, естественно, программный (а как иначе, если нужно на всех 18 ногах?) Правда, посчитал проект слишком примитивным для того, чтобы его здесь выкладывать. Может, и ошибся, - из порядка десятка выложенных мной более сложных проектов ни один так и не был повторен. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AndreyD, немного не в тему, но если Вам понравится такие красоты делать, советую обратить внимание на отдельные (не в ленте) адресуемые светодиоды, причём не smd, а большие по 5 или даже по 8 миллиметров. С ними что угодно можно делать. Вот есть пример маленький. Пишу потому, что до недавних пор сам не знал, что такие бывают, подозреваю, что и Вы не знаете.

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП, для сильно ленивых есть ещё и такие варианты с выбором цвета кабеля: https://aliexpress.ru/item/32975332081.html ;) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

ЕвгенийП, для сильно ленивых есть ещё и такие варианты с выбором цвета кабеля: https://aliexpress.ru/item/32975332081.html ;) 

Круто! Мне нравится! 50 штук не беда - в любом месте разрезать можно.

Но вё же одиночные имеют смысл. Их ведь куда хочешь паяешь

v258
Offline
Зарегистрирован: 25.05.2020

sadman41 пишет:

ЕвгенийП, для сильно ленивых есть ещё и такие варианты с выбором цвета кабеля: https://aliexpress.ru/item/32975332081.html ;) 

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

У меня на улице на беседке такие 2х50. К одной тиньке85 в виде дигиспарка. Платка впихнута в 12В БП. На улице не выключается никогда уже три года.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

ЕвгенийП пишет:

Я хочу использовать, то что у меня есть в наличии, не докупая нового. И так сказать совместить приятное с полезным, написать скетч через классы, которые ещё не использовал. Точнее класс будет один и пять объектов.

Моё трёх-летнее старьё, ещё использую, моргание одноканальной лентой 220В с разноцветными диодами через твердотельное реле.

Это подчинённый модуль от другой ардуинки.

// Массив режимов работы
int modes[] = {
   0B0000000000000000, //00 00
   0B1111111111111111, //01 01
   0B1000000000000000, //02 02
   0B0100000000000000, //03 03
   0B0010000000000000, //04 04
   0B0001000000000000, //05 05
   0B0000100000000000, //06 06
   0B0000010000000000, //07 07
   0B0000001000000000, //08 08
   0B0000000100000000, //09 09
   0B0000000010000000, //10 0A
   0B0000000001000000, //11 0B
   0B0000000000100000, //12 0C
   0B0000000000010000, //13 0D
   0B0000000000001000, //14 0E
   0B0000000000000100, //15 0F
   0B0000000000000010, //16 10
   0B0000000000000001, //17 11
   0B0111111111111111, //18 12
   0B1011111111111111, //19 13
   0B1101111111111111, //20 14
   0B1110111111111111, //21 15
   0B1111011111111111, //22 16
   0B1111101111111111, //23 17
   0B1111110111111111, //24 18
   0B1111111011111111, //25 19
   0B1111111101111111, //26 1A
   0B1111111110111111, //27 1B
   0B1111111111011111, //28 1C
   0B1111111111101111, //29 1D
   0B1111111111110111, //30 1E
   0B1111111111111011, //31 1F
   0B1111111111111101, //32 20
   0B1111111111111110, //33 21

   0B1010101010101010, //34 22
   0B0000101010101010, //35 23
   0B1010000010101010, //36 24
   0B1010101000001010, //37 25
   0B1010101010100000, //38 26
   0B0101010101010101, //39 27
   0B0000010101010101, //40 28
   0B0101000001010101, //41 29
   0B0101010100000101, //42 2A
   0B0101010101010000, //43 2B
   0B1101101101101101, //44 2C
   0B0000101101101101, //45 2D
   0B1101000001101101, //46 2E
   0B1101101100001101, //47 2F
   0B1101101101100000, //48 30

   0B0010010010010010, //49 31
   0B1111010010010010, //50 32
   0B0010111110010010, //51 33
   0B0010010011110010, //52 34
   0B0010010010011111, //53 35
   0B1100110011001100, //54 36
   0B1111110011001100, //55 37
   0B1100111111001100, //56 38
   0B1100110011111100, //57 39
   0B1100110011001111, //58 3A
   0B0011001100110011, //59 3B
   0B1111001100110011, //60 3C
   0B0011111100110011, //61 3D
   0B0011001111110011, //62 3E
   0B0011001100111111, //63 3F

   0B1111000000000000, //64 40 *4
   0B0000111100000000, //65 41
   0B0000000011110000, //66 42
   0B0000000000001111, //67 43
   0B0000111111111111, //68 44 *4
   0B1111000011111111, //69 45
   0B1111111100001111, //70 46
   0B1111111111110000, //71 47
   
   0B1111000011110000, //72 48 *2
   0B0000111100001111, //73 49
   0B1111111100000000, //74 4A *2
   0B0000000011111111, //75 4B

   0B1100000000000000, //76 4C *4
   0B0000110000000000, //77 4D 
   0B0000000011000000, //78 4E
   0B0000000000001100, //79 4F
   0B0011111111111111, //80 50 *4
   0B1111001111111111, //81 51
   0B1111111100111111, //82 52
   0B1111111111110011, //83 53

   0B1100110000000000, //84 54 *2
   0B0000000011001100, //85 55
   0B0011001111111111, //86 56 *2
   0B1111111100110011, //87 57

   0B1000100010001000, //88 58
   0B0100010001000100, //89 59
   0B0010001000100010, //90 5A
   0B0001000100010001, //91 5B
   0B0111011101110111, //92 5C
   0B1011101110111011, //93 5D
   0B1101110111011101, //94 5E
   0B1110111011101110, //95 5F

   0B0110011001100110, //96 60

   0B0110000000000000, //97 61 
   0B0000011000000000, //98 62 
   0B0000000001100000, //99 63
   0B0000000000000110, //100 64
   0B1001111111111111, //101 65
   0B1111100111111111, //102 66
   0B1111111110011111, //103 67
   0B1111111111111001, //104 68

   0B0111100001111000, //105 69
   0B0011110000111100, //106 6A
   0B0001111000011110, //107 6B
   0B0000111100001111, //107 6C
   0B1000011110000111, //109 6D
   0B1100001111000011, //110 6E
   0B1110000111100001, //111 6F
   
   0B0111111110000000, //112 70
   0B0011111111000000, //113 71
   0B0001111111100000, //114 72
   0B0000111111110000, //115 73
   0B0000011111111000, //116 74
   0B0000001111111100, //117 75
   0B0000000111111110 //118 76

};


uint32_t ms, ms1 = 0, ms2 = 0, tim=0;
uint16_t  blink_loop = 0;
uint16_t  blink_mode1 = 0;
byte len;
byte mode = 0;


void setup() {

  randomSeed(analogRead(0));
  pinMode(2, OUTPUT); digitalWrite(2, HIGH);
  pinMode(6,INPUT);
  
  blink_mode1 = modes[1]; 
  len = sizeof(modes)/2;

}
 
 
void loop() {

   ms = millis();

   if( ( ms - ms1 ) > 125|| ms < ms1 ){
       ms1 = ms;
     
       if( blink_mode1 & 1<<(blink_loop&0xF) ) digitalWrite(2, HIGH); 
       else  digitalWrite(2, LOW);
       blink_loop++;

    }

   if (mode == 0) {
       blink_mode1 = modes[1]; 
   } 
   else if  (mode==1) {
     if( ( ms - ms2 ) > tim || ms < ms2 ){
       ms2 = ms;
       blink_mode1 = modes[random(0,len)]; 
       tim = random(10000,60000);
     }
   }

   if (digitalRead(6)) mode = 1; else mode = 0;
  

}

 

В поисках информации про ООП в С++ набрёл на ютуб канал, вроде годнота и "всё на пальцах". Буду смотреть и изучать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

AndreyD пишет:

На носу у нас что? Нет не бородавка, и даже не Масленица. На носу у нас Новый год, а это повод весело помигать диодами.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

По мультикам в ООП не въедешь. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

DetSimen пишет:

По мультикам в ООП не въедешь. 

Ну я смотрю и одновременно делаю свой проект.

sadman41
Offline
Зарегистрирован: 19.10.2016

v258 пишет:

sadman41 пишет:

ЕвгенийП, для сильно ленивых есть ещё и такие варианты с выбором цвета кабеля: https://aliexpress.ru/item/32975332081.html ;) 

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

На моей уже год четвертый или около того. Наверное всё это время у меня короновирус был - ничего не чуял. 

А так-то, они, outdoor, как понимаю. Монтируются в специальную панель - на корпусах рассеивателей специальные защёлки отлиты даже.

 

kolyn
Offline
Зарегистрирован: 18.01.2019

DetSimen пишет:

По мультикам в ООП не въедешь. 

Не знаю, на мой вкус неплохой сериал. Если перед сном посмотреть  пару серий, а с утра полистать Страуструпа (или наоборот) - в голове кое-что остается:). Ну и да - "Чтобы научиться программировать надо..."

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сериал не смотрел, ничего сказать не могу. Но, если умеете не только смотреть видео, а ещё и читать, то очень рекомендую блог вот этой девочки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

v258
Offline
Зарегистрирован: 25.05.2020

sadman41 пишет:

На моей уже год четвертый или около того. Наверное всё это время у меня короновирус был - ничего не чуял. 

Может быть повезло, может быть раньше делали из другого пластика. Брал здесь в июне, в отзывах о запахе упоминают часто. Ну и мои тоже поначалу пованивали довольно сильно. И неприятно ))

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

andriano пишет:

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

1. сумбурно, т.е. хаотично? Там, вроде, все серии со своей темой. Или в другом порядке нужно ООП изучать?

2. растянуто по времени. Ну, думаю, это специально сделано для лучшего усвоения материала новичками.

3. неконкретно?

4. неудачные примеры и аналогии. Тоже, думаю, приведены для новичков, которые в программировании и схемотехнике мало разбираются.

 

PS. Первые "успехи" выложил в сообщении #1.

kolyn
Offline
Зарегистрирован: 18.01.2019

andriano пишет:

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

Это  "вводная лекция" - она всегда "вода". Было бы полезнее, если бы Вы, как опытный товарищ, посмотрели какую - либо серию из середины плейлиста и высказали свое мнение о наличии-отсутствии ляпов в стиле а-ля Гивер. 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Обновил код в сообщении #1.