RDC1-0009, Цифровое сердце

Только в рознице. Цена, возможность и сроки поставки потребуют уточнения
719.20 руб. × = 719.20 руб.

Спецификация набора

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

НаименованиеЦенаКол-во
Печатная плата rdc1-0009 h, Печатная плата с разводкой, FR4 56.9х54.2мм (1.5мм, 18мкм) 150 руб. 1
ATmega168PA-AU, Микроконтроллер 8-Бит, picoPower, AVR, 20МГц, 16КБ Flash [TQFP-32] 140 руб. 1
MCP73831T-2ACI/OT, Контроллер заряда батарей Li-Ion/Li-Pol 15mA to 500mA 4.2V [SOT-23-5] 28 руб. 1
Кер.ЧИП конд. 0.1 мкФ Y5V 50В,+80-20%, 0805 0.90 руб. 3
0.125Вт 0805 360 Ом, 1%, Чип резистор (SMD) 0.90 руб. 22
0.125Вт 0805 10 кОм, 1%, Чип резистор (SMD) 0.90 руб. 2
0.125Вт 0805 2 кОм, 1%, Чип резистор (SMD) 0.90 руб. 1
BSS138, Транзистор, N-канал 50В 220мА [SOT-23] 4 руб. 1
KPT-2012SURCK, Светодиод красный 150мКд SMD 13 руб. 22
MiniUSB-A, Розетка 5-контактная SMD на плату 21 руб. 1
SS12F27, Переключатель движковый (0.3A 125VAC) (B3033) 5 руб. 1
VIBRATING-MOTOR, Плоский вибромотор 10мм 3В для Arduino проектов 60 руб. 1

Описание

Это цифровое, светодиодное сердце будет отличным подарком девушке ко Дню Влюбленных, 8 Марта, или на День рождения.
21 светодиод расположены по периметру печатной платы в виде сердца. Все они управляются микроконтроллером ATmega328. В демонстрационном скетче прописаны несколько эффектов оживляющих сердце. Скетч загружается с помощью любого контроллера Arduino. Но главная изюминка это вибромоторчик от смартфона расположенный на тыльной стороне. Он создает эффект бьющегося в такт световым эффектам сердца. Скетч легко изменить, если вы придумаете новые световые эффекты и частоту стука сердца.
На тыльной стороне сердца есть зарядное устройство для Li-ion аккумуляторов, которое будет подзаряжать ваше сердце через порт Mini USB. Схема зарядного устройства собрана на микросхеме MCP73831T. Схема включения стандартная из описания на микросхему.
Все детали проекта открыты для свободного использования. Проект созданный в KiCAD можно скачать в приложении. Программу скачивайте в разделе «Скетч – код программы».

Внешний вид устройства

Внешний вид

Внешний вид

Технические параметры

Размер - 50 х 50 мм.
Источник питания – Li-Ion или Li-Pol аккумулятор 3,7В

Электрическая схема

Электрическая схема

Это открытый проект! Лицензия, под которой он распространяется – Creative Commons - Attribution - Share Alike license. Проект выполнен в KiCad. Любые файлы доступны для скачивания.

Скетч. Код программы

void setup()
{ 
  DDRB = 0xFF;
  PORTB = 0xFF;

  DDRC = 0x3F;
  PORTC = 0x3F;

  DDRD = 0xFF;
  PORTD = 0x7F;
}
//------------------------------------------------------
void loop()
{ 
  for (byte j = 0; j < 3; j++)
    Effect_1();
  for (byte j = 0; j < 3; j++)
    Effect_2();
  for (byte j = 0; j < 3; j++)
    Effect_3();
  for (byte j = 0; j < 3; j++)
    Effect_4();
  for (byte j = 0; j < 3; j++)
    Effect_5();
    
  Effect_6();
  
  for (byte j = 0; j < 3; j++)
  {
    for (unsigned int i = 0; i < 30000; i++)
    Effect_7();
  }
  
  for (byte j = 0; j < 3; j++)
    Effect_8();
  for (byte j = 0; j < 3; j++)
    Effect_9();
  for (byte j = 0; j < 3; j++)
    Effect_10();
  for (byte j = 0; j < 3; j++)
    Effect_11();
}
//------------------------------------------------------------
//Эффект 1
void Effect_1()
{
  for (byte j = 0; j <= 7; j++)
  {
    PORTB &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j <= 5; j++)
  {
    PORTC &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j < 7; j++)
  {
    PORTD &= ~(1 << j);
    delay(75);
  }

  for (byte j = 0; j < 2; j++)
  {
    All_OFF();
    delay(150);
    All_ON();
    delay(150);
  }

  All_OFF();
}
//---------------------------------------------------------
//Эффект 2
void Effect_2()
{
  for (byte j = 0; j <= 7; j++)
  {
    PORTB &= ~(1 << j);
    delay(75);
    PORTB |= (1 << j);
  }

  for (byte j = 0; j <= 5; j++)
  {
    PORTC &= ~(1 << j);
    delay(75);
    PORTC |= (1 << j);
  }

  for (byte j = 0; j < 7; j++)
  {
    PORTD &= ~(1 << j);
    delay(75);
    PORTD |= (1 << j);
  }
}
//---------------------------------------------------------
//Эффект 3
void Effect_3()
{
  byte Value;
  boolean ClearFlag;
    
  //включение
  while ((PORTB != 0) || ((PORTC & 0x3F) != 0) || ((PORTD & 0x7F) != 0))
  {
    //PORTB
    if (PORTB != 0)
    {
      Value = random(0, 8);
      ClearFlag = false;
      if ((PORTB & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTB & (1 << j)) == (1 << j))
          {
            PORTB &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTB & (1 << j)) == (1 << j))
            {
              PORTB &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTB &= ~(1 << Value);
      }
    }
    //PORTC
    if ((PORTC & 0x3F) != 0)
    {
      Value = random(0, 6);
      ClearFlag = false;
      if ((PORTC & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTC & (1 << j)) == (1 << j))
          {
            PORTC &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTC & (1 << j)) == (1 << j))
            {
              PORTC &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTC &= ~(1 << Value);
      }
    }
    //PORTD
    if ((PORTD & 0x7F) != 0)
    {
      Value = random(0, 7);
      ClearFlag = false;
      if ((PORTD & (1 << Value)) != (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTD & (1 << j)) == (1 << j))
          {
            PORTD &= ~(1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTD & (1 << j)) == (1 << j))
            {
              PORTD &= ~(1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTD &= ~(1 << Value);
      }
    }

      delay(150);
  }
    
  delay(1000);

  //выключение
  while ((PORTB != 0xFF) || ((PORTC & 0x3F) != 0x3F) || ((PORTD & 0x7F) != 0x7F))
  {
    //PORTB
    if (PORTB != 0xFF)
    {      
      Value = random(0, 8);
      ClearFlag = false;
      if ((PORTB & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTB & (1 << j)) != (1 << j))
          {
            PORTB |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTB & (1 << j)) != (1 << j))
            {
              PORTB |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTB |= (1 << Value);
      }
    }
    //PORTC
    if ((PORTC & 0x3F) != 0x3F)
    {
      Value = random(0, 6);
      ClearFlag = false;
      if ((PORTC & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j <= 7; j++)
        {
          if ((PORTC & (1 << j)) != (1 << j))
          {
            PORTC |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTC & (1 << j)) != (1 << j))
            {
              PORTC |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTC |= (1 << Value);
      }
    }
    //PORTD
    if ((PORTD & 0x7F) != 0x7F)
    {
      Value = random(0, 7);
      ClearFlag = false;
      if ((PORTD & (1 << Value)) == (1 << Value))
      {
        for (byte j = Value; j < 7; j++)
        {
          if ((PORTD & (1 << j)) != (1 << j))
          {
            PORTD |= (1 << j);
            ClearFlag = true;
            break;
          }
        }

        if (!ClearFlag)
        {
          for (byte j = 0; j < Value; j++)
          {
            if ((PORTD & (1 << j)) != (1 << j))
            {
              PORTD |= (1 << j);
              ClearFlag = true;
              break;
            }
          }
        }
      }

      else
      {
        PORTD |= (1 << Value);
      }
    }

    delay(150);
  }
    
  delay(1000);
}
//------------------------------------------------------------
//Эффект 4
void Effect_4()
{ 
  All_ON();
  delay(750);
  All_OFF();
  delay(750); 
}
//---------------------------------------------------------
//Эффект 5
void Effect_5()
{
  PORTB &= ~(1 << 0);
  delay(75);
  
  for (byte i = 1; i <= 7; i++)
  {
    PORTB &= ~(1 << i);
    PORTD &= ~(1 << (7 - i));
    delay(75);
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC &= ~((1 << i) | (1 << (5 - i)));
    delay(75);
  }
  
  delay(750);

  for (byte i = 3; i <= 5; i++)
  {
    PORTC |= ((1 << (5 - i)) | (1 << i));
    delay(75);
  }

  for (byte i = 7; i >= 1; i--)
  {
    PORTB |= (1 << i);
    PORTD |= (1 << (7 - i));
    delay(75);
  }

  PORTB |= (1 << 0);
  delay(75);

  delay(750);
}
//---------------------------------------------------------
//Эффект 6
void Effect_6()
{
  const unsigned int DotUnit = 100;
  const unsigned int DashUnit = 3 * DotUnit;
  const unsigned int WordSpace = 7 * DotUnit;

  //РЇ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);

  //тебя
  //С‚
  // -
  All_ON();
  delay(DashUnit);
  All_OFF();
  //пауЕа между буквами
  delay(DashUnit);
  //Рµ
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  //пауЕа между буквами
  delay(DashUnit);
  //Р±
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 3; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);

  //СЏ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);

  //люблю
  //Р»
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  delay(DotUnit);
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //СЋ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  for (byte i = 0; i < 2; i++)
  {
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //Р±
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 3; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //Р»
  //.
  All_ON();
  delay(DotUnit);
  All_OFF();
  delay(DotUnit);
  //-
  All_ON();
  delay(DashUnit);
  All_OFF();
  delay(DotUnit);
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между буквами
  delay(DashUnit - DotUnit);
  //СЋ
  for (byte i = 0; i < 2; i++)
  {
    //.
    All_ON();
    delay(DotUnit);
    All_OFF();
    delay(DotUnit);
  }
  for (byte i = 0; i < 2; i++)
  {
    //-
    All_ON();
    delay(DashUnit);
    All_OFF();
    delay(DotUnit);
  }
  //пауЕа между словами
  delay(WordSpace - DotUnit);
}
//---------------------------------------------------------
//Эффект 7
void Effect_7()
{
  const byte BrightnessRate = 100;
  const byte Period = 100;
  static byte PeriodCounter = 0;
  static boolean State = false;
  static byte DutyCycle = 0;
  static byte DutyCycleCounter = 0;
  
  delayMicroseconds(200);

  DutyCycleCounter++;
  
  if (DutyCycleCounter == BrightnessRate)
  {
    if (!State)
    {
      DutyCycle++;
      if (DutyCycle == PeriodCounter)
      {
        State = true;
      }
    }
  
    else
    {
      DutyCycle--;
      if (DutyCycle == 0)
      {
        State = false;
      }
    }

    DutyCycleCounter = 0;
  }

  if (PeriodCounter < DutyCycle)
    All_ON();
  else
    All_OFF();
  
  PeriodCounter++;

  if (PeriodCounter == Period)
    PeriodCounter = 0;
}
//----------------------------------------------
//Эффект 8
void Effect_8() 
{
  All_OFF();
  PORTB &= ~((1 << 0) | (1 << 1) | (1 << 3) | (1 << 5) | (1 << 7));
  PORTC &= ~((1 << 1) | (1 << 4));
  PORTD &= ~((1 << 0) | (1 << 2) | (1 << 4) | (1 << 6));
  delay(300);
  All_OFF();
  PORTB &= ~((1 << 0) | (1 << 2) | (1 << 4) | (1 << 6));
  PORTC &= ~((1 << 0) | (1 << 2) | (1 << 3) | (1 << 5));
  PORTD &= ~((1 << 1) | (1 << 3) | (1 << 5));
  delay(300);
}
//----------------------------------------------
//Эффект 9
void Effect_9() 
{
  All_OFF();
  PORTB = 0;
  PORTC &= ~((1 << 0) | (1 << 1) | (1 << 2));
  delay(300);
  All_OFF();
  PORTB &= ~(1 << 0);
  PORTC &= ~((1 << 3) | (1 << 4) | (1 << 5));
  PORTD = 0;
  delay(300);
}
//----------------------------------------------
//Эффект 10
void Effect_10()
{  
  PORTB &= ~(1 << 0);

  for (byte i = 1; i <= 7; i++)
  {
    PORTB &= ~(1 << i);
    if (i < 4)
      PORTC |= (1 << (i + 2));
    else
      PORTD |= (1 << (i - 4));
    delay(150);    
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC &= ~(1 << i);
    PORTD |= (1 << (i + 4));
    delay(150);    
  }

  for (byte i = 7; i >= 1; i--)
  {
    PORTD &= ~(1 << (i - 1));
    if (i > 4)
      PORTC |= (1 << (i - 5));
    else
      PORTB |= (1 << (i + 3));
    delay(150);
  }

  for (byte i = 5; i >= 3; i--)
  {
    PORTC &= ~(1 << i);
    PORTB |= (1 << (i - 2));
    delay(150);    
  }
}
//----------------------------------------------
//Эффект 11
void Effect_11()
{
  PORTB &= ~(1 << 0);
  
  for (byte i = 7; i >= 1; i--)
  {
    PORTD &= ~(1 << (i - 1));
    if (i > 4)
      PORTC &= ~(1 << (i - 5));
    else
      PORTB &= ~(1 << (i + 3));
    delay(150);
  }

  for (byte i = 5; i >= 3; i--)
  {
    PORTC &= ~(1 << i);
    PORTB &= ~(1 << (i - 2));
    delay(150);    
  }

  for (byte i = 1; i <= 7; i++)
  {
    PORTB |= (1 << i);
    if (i < 4)
      PORTC |= (1 << (i + 2));
    else
      PORTD |= (1 << (i - 4));
    delay(150);    
  }

  for (byte i = 0; i <= 2; i++)
  {
    PORTC |= (1 << i);
    PORTD |= (1 << (i + 4));
    delay(150);    
  }

  PORTB |= (1 << 0);
  delay(150);
}
//----------------------------------------------
void All_ON()
{
  PORTB = 0;
  PORTC = 0;
  PORTD = 0x80;
}
//----------------------------------------------
void All_OFF()
{
  PORTB = 0xFF;
  PORTC = 0x3F;
  PORTD = 0x7F;
}

Техническая документация

Комментарии