ATtiny13A 101 применение

NikitaS
Offline
Зарегистрирован: 22.10.2016

andycat пишет:

а зачем питать Attiny от сетевого источника питания? они как бы и предназначены для компактных устройств с автономным питанием...

Следить за зарядом батарей, менять их - дополнительное дело. А если у проекта есть мотор, питающийся от 12В, то запитал от 12В и Attiny, через стабилизатор 78L05, естественно, и забыл. Удобнее, имхо.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

andycat пишет:

pittyalex пишет:

Если только RFмодуль (какой, кстати) и ds18, то наверное можно и от cr2032 напрямую (полностью заряженная 3.1-3.4 вольта.

можно, но если посмотреть на графики зависимости напряжения от минусовой температуры - на CR2032 при морозе сильно меньше 3 вольт.

заказал на Ali маломощный DC1.8-5V to 3.3 V  - придут - посмотрим как сильно меняется потребление с ним.

Собрал окончательно на батарейке cr2032 - потребление всего 6мкА, вытащил модуль на улицу (+2 градуса) - за 10 минут напряжение батарейки упало с 3.05 до 3.0 вольт. Жду прихода стабилизатора - надеюсь сильно не поднимется потребление. Мини 2 в 1 DC-DC 1.8 В-5 В до 3.3 В Мощность Модуль Шаг Пух Step Up конвертер wi-Fi Bluetooth ESP8266 HC-05 CC1101 http://s.aliexpress.com/VJviiUB7 (from AliExpress Android)

P.S. Засунул модуль в морозилку - не передает данные :(

Как только вытаскиваю из морозилки - передача пошла, от 0 градусов.

Нужен стабилизатор.

 

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

andycat пишет:

P.S. Засунул модуль в морозилку - не передает данные :(

Как только вытаскиваю из морозилки - передача пошла, от 0 градусов.

Нужен стабилизатор.

Мошт холодильник экранирует просто?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

DetSimen пишет:

Мошт холодильник экранирует просто?

тоже мысль возникла.... попозже попробую сами часы (приемник) в холодильник засунуть

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

купил 100штук ,могу продать по 17р  )) и выслать  конвертом

думаю и внукам хватит :)

Ненашёл список  101  применения,где он ?

Joiner
Offline
Зарегистрирован: 04.09.2014

selevo пишет:

купил 100штук ,могу продать по 17р  )) и выслать  конвертом

думаю и внукам хватит :)

Ненашёл список  101  применения,где он ?

Купите еще одну, а то на 101 применение может не хватить :)

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

не

stm8s003f3p6  дешевле получается и в целом выгоднее.

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

selevo пишет:
stm8s003f3p6  дешевле получается и в целом выгоднее.

Это выходит далеко за рамки хобби, те контроллеры для инженеров на ставке, которым работу оплацивает заказчик, очень сложные, мало информации, для домашнего применения вообще ни как. Хуже только Z80 какой-нибудь ))

Если не хватает тинек, мег и Arduino Due, можно сразу смотреть на STM32F7, повеселее будут, если осваивать что-то новое, то приниципиально иное что-то.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

andycat пишет:

DetSimen пишет:

Мошт холодильник экранирует просто?

тоже мысль возникла.... попозже попробую сами часы (приемник) в холодильник засунуть

да, дело было в экранировании, но все равно стабилизатор нужен, по ДШ DS18B20 и передатчику напряжение нужно от 3 вольт, а внутрь морозилки засовываю, он мне какую то ересь шлет, то минус 200 то нормально минус 19, а на батарейке около 2.6 вольт - сильно просаживается.

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

литиевая батарейка не любит мороз.  Надо устройство - в морозильник, а батарею снаружи оставить.  И проверить еще раз.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

DetSimen пишет:

литиевая батарейка не любит мороз.  Надо устройство - в морозильник, а батарею снаружи оставить.  И проверить еще раз.

а что мне даст эта проверка? не пойму....

реальное то устройство все равно будет от батарейки питаться

P.S. Устройство уже спаяно, честно говоря лень провода напаивать чтоб батарейку снаружи прилепить, дождусь стабилизатора.

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

дак китайский стабилизатор на холоде тоже неизвестно как себя поведет.... 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

DetSimen пишет:

дак китайский стабилизатор на холоде тоже неизвестно как себя поведет.... 

согласен, но вариантов то не много - буду экспериментировать.....

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

andycat пишет:

а что мне даст эта проверка? не пойму....

реальное то устройство все равно будет от батарейки питаться

Вам нужна литий-железная батарейка, работает до -40 и малый ток саморазряда

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sim31 пишет:

Вам нужна литий-железная батарейка, работает до -40 и малый ток саморазряда

 

спасибо, знаю,

но что то не хочеться, это и зарядное устройство нужно, да и цена и размеры не маленькие.

опять же интересно поэкспериментировать и понять что из этой затеи выйдет

pittyalex
Offline
Зарегистрирован: 09.11.2016

Если у тини остались свободные ноги, можно попробовать сделать повышающий преобразователь, который будет работать только тогда, когда надо. Точность, как я понимаю, высокая не нужна.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

а вот это уже интересно.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Свободные ноги есть, как сделать?

pittyalex
Offline
Зарегистрирован: 09.11.2016

Стандартная схема повышающего dc/dc преобразователя на индуктивности, ключевом транзисторе и диоде шоттки. Обратная связь ч/з АЦП, но высокой точности не получится.
Можно еще умножитеоь на конденсаторах сделать, если потребляемый ток мизерный.

Serik
Offline
Зарегистрирован: 14.11.2017

Всем доброго времени суток.

Помогите пожалуйста начинающему.Нужна программа для Attiny13a на языке С.

Вот такой алгоритм:

Нажимают кнопку и начинают мигать светодиоды типа "Бегущие огни", при отпускании остается светится один из четырех, причем в случайном порядке как в рулетке.Нажимают и снова начинают бежать- отпускают остается гореть один.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

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

Serik
Offline
Зарегистрирован: 14.11.2017

В случайном.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

pittyalex пишет:
Стандартная схема ....

Спасибо, но конкретики хотелось бы с точной схемой повышалки от 2 до 3.3 В потребление в пике 6мА,

и например для меня проще все таки готовый купить,

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

P.S. И самая большая проблема вот в чем: на той неделе проводил эксперименты с полудохлой батарейкой CR2032 (специально новую свежую не использую) - при передаче напряжение падает с 3.02 до 2.85 вольт, МК и передатчик работает, а DS18B20 уже нет. Т.е. еще немного упадет напряжение (по ДШ 2.7 В) и МК даже не сможет включить на свободных пинах повышалку напряжения :(

 

pittyalex
Offline
Зарегистрирован: 09.11.2016

andycat пишет:

pittyalex пишет:
Стандартная схема ....

Спасибо, но конкретики хотелось бы с точной схемой повышалки от 2 до 3.3 В потребление в пике 6мА,

и например для меня проще все таки готовый купить,

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

P.S. И самая большая проблема вот в чем: на той неделе проводил эксперименты с полудохлой батарейкой CR2032 (специально новую свежую не использую) - при передаче напряжение падает с 3.02 до 2.85 вольт, МК и передатчик работает, а DS18B20 уже нет. Т.е. еще немного упадет напряжение (по ДШ 2.7 В) и МК даже не сможет включить на свободных пинах повышалку напряжения :(

Ну готового у меня нет, а собирать, чтобы попробовать, что-то времени нет. Тини вроде бы от 1.8 В работает, если мне память не изменяет.

А собрать - поищите в интернете по тегу "Умножитель напряжения на конденсаторах и диодах", а на вход умножителя подайте питание от пина тини, на который надо частоту генерить герц 500 ну или даже не принципиально.

Хотя, в принципе, может действительно проще готовый купить, всё зависит от того, как оно на морозе будет работать и как оно будет потреблять в покое. Когда сделаете замеры, выкладывайте, самому интересно, что за модули такие волшебные, на которых микроамперные токи обещают.

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

pittyalex пишет:
Тини вроде бы от 1.8 В работает, если мне память не изменяет.

С индексом V от 1.8В, остальные - от 2.7В

 

 

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

andycat пишет:
при передаче напряжение падает с 3.02 до 2.85 вольт, МК и передатчик работает, а DS18B20 уже нет.

Не используйте DS1820 при передаче. Через пару минут напряжение на батарейке восстанавливается и можно измерять температуру.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sim31 пишет:

andycat пишет:
при передаче напряжение падает с 3.02 до 2.85 вольт, МК и передатчик работает, а DS18B20 уже нет.

Не используйте DS1820 при передаче. Через пару минут напряжение на батарейке восстанавливается и можно измерять температуру.


Две минуты ждать слишком расточительно для потребления, естественно замер не одновременно с отправкой, сначала замер и напряжение уже падает, потом отправка и напр ещё больше падает

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

всё ещё  жду список  101  применения

Иначе название темы надо изменить, ибо содержанию она несоответсвует.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

selevo пишет:

всё ещё  жду список  101  применения

Иначе название темы надо изменить, ибо содержанию она несоответсвует.

в названии темы список не фигурирует - звездуешь самостоятельно составлять, затем кидать тут тупые предъявы что больше или меньше 101-го. О_О

selevo
selevo аватар
Offline
Зарегистрирован: 21.12.2013

если я о чём-то заявляю я обычно делаю

у автора  же  темы  дяже  списка из 10 применений нет cо ссылками

вот  это действительно тупо.

Раз  вызвался- делай,а так нече  трепать языком.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

pittyalex пишет:

 Когда сделаете замеры, выкладывайте, самому интересно, что за модули такие волшебные, на которых микроамперные токи обещают.

итак пришли стабилизаторы на 3.3 вольта

потребление 562 мкА всей платы в режиме покоя - т.е. в 100!!! раз больше чем МК с передатчиком и DS18B20 без стабилизатора :(

буду искать другой, где то на просторах Али видел стабилизатор с обещанным 8 мкА собственным потреблением

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

UART консоль с экраном без компьютера, скорость делителями установлена в 9600 для МК частотой 8Мгц.

можно больше - быстродействия хватает, но бывают пропуски если прием идет одновременно с выводом на OLED дисплей.

Приемная часть:

#include <TinyOzOLED.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define RX_BUF_SIZE 32

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// PB0 pin 5 - SDA
#define PB0_OUT sbi(DDRB,PB0)
#define PB0_IN cbi(DDRB,PB0)
#define PB0_HIGH sbi(PORTB,PB0)
#define PB0_LOW cbi(PORTB,PB0)
// PB1 pin 6
#define PB1_OUT sbi(DDRB,PB1)
#define PB1_IN cbi(DDRB,PB1)
#define PB1_HIGH sbi(PORTB,PB1)
#define PB1_LOW cbi(PORTB,PB1)
// PB2 pin 7 - SCL
#define PB2_OUT sbi(DDRB,PB2)
#define PB2_IN cbi(DDRB,PB2)
#define PB2_HIGH sbi(PORTB,PB2)
#define PB2_LOW cbi(PORTB,PB2)
// PB3 pin 2 - TxD
#define PB3_OUT sbi(DDRB,PB3)
#define PB3_IN cbi(DDRB,PB3)
#define PB3_HIGH sbi(PORTB,PB3)
#define PB3_LOW cbi(PORTB,PB3)
// PB4 pin 3 - RxD
#define PB4_OUT sbi(DDRB,PB4)
#define PB4_IN cbi(DDRB,PB4)
#define PB4_HIGH sbi(PORTB,PB4)
#define PB4_LOW cbi(PORTB,PB4)
#define PB4_READ bitRead(PINB,PB4)

byte bufPos = 0;
byte RX_BUF[RX_BUF_SIZE];

byte rxbyte;
byte rxbitcount;

byte charPos = 0;
char lastPCINTlevel = -1;

unsigned long showBufTime = 0;
boolean inRX = false;

void setup () {
  OzOled.init();
  OzOled.setNormalDisplay();
  OzOled.setPageMode();
  OzOled.sendCommand(0xA1);
  OzOled.sendCommand(0xC8);
  // -
  PB1_OUT; PB1_LOW;
  PB3_OUT; PB3_LOW;
  PB4_IN; PB4_HIGH;
  printString("Start ");
  // -
  rxbyte = 0x00;
  rxbitcount = 0x09;
  cbi(TCCR0A, COM0A1); cbi(TCCR0A, COM0A0); cbi(TCCR0A, COM0B1); cbi(TCCR0A, COM0B0);
  sbi(TCCR0A, WGM01); cbi(TCCR0A, WGM01); // CTC mode
  cbi(TCCR0B, CS02); sbi(TCCR0B, CS01); cbi(TCCR0B, CS00); // N=8
  OCR0B = 103; // count clock/OCR0A/2/N/9600 -1
  cbi(TIMSK, OCIE0B);
  sbi(GIMSK, PCIE);
  sbi(PCMSK, PCINT4);
}

void loop () {
  //OzOled.setPowerOn();
  unsigned long currMil = millis();
  if ((currMil - showBufTime) >= 1500) {
    showBufTime = currMil;
    if ((rxbitcount == 9) && (!inRX) && (bufPos > 0)) {
      cbi(TIMSK, OCIE0B);
      cbi(GIMSK, PCIE);
      cbi(PCMSK, PCINT4);
      // show buf
      for (int i = 0; i < bufPos; ++i) {
        printChar(RX_BUF[i]);
      }
      printChar(' ');
      bufPos = 0;
      // -
      sbi(GIMSK, PCIE);
      sbi(PCMSK, PCINT4);
    }
  }
  //OzOled.setPowerOff();
}

ISR(TIM0_COMPB_vect) {
  TCNT0 = 0;
  if ((rxbitcount < 9) && (rxbitcount > 0)) {
    if (PB4_READ) {
      bitSet(rxbyte, (8 - rxbitcount));
    }
  }
  if (rxbitcount == 9) {
    cbi(TIMSK, OCIE0B);
    OCR0B = 103;
    sbi(TIMSK, OCIE0B);
  }
  if ((--rxbitcount) == 0) {
    cbi(TIMSK, OCIE0B);
    // - byte to buf
    RX_BUF[bufPos] = rxbyte;
    if ((++bufPos) >= RX_BUF_SIZE) (bufPos = 0);
    rxbitcount = 0x09;
    // -
    sbi(GIMSK, PCIE);
    sbi(PCMSK, PCINT4);
    inRX = false;
  }
}

ISR(PCINT0_vect) {
  if (((lastPCINTlevel == -1) || (lastPCINTlevel == 1)) && (!PB4_READ)) {
    inRX = true;
    rxbitcount = 0x09;
    rxbyte = 0x00;
    cbi(GIMSK, PCIE);
    cbi(PCMSK, PCINT4);
    TCNT0 = 0;
    OCR0B = 154;
    sbi(TIMSK, OCIE0B);
  }
  lastPCINTlevel = PB4_READ;
}

void printChar(byte inByte) {
  if ((inByte < 0x20) || (inByte > 0x7E)) inByte = 0x20;
  OzOled.printChar(inByte, (charPos % 16), (((byte)(charPos / 16)) * 2));
  if ((++charPos) >= 64) {
    clearDisplay();
  }
}

void printString(char *inStr) {
  byte cp = 0;
  while (inStr[cp] > 0) {
    printChar(inStr[cp]); ++cp;
  }
}

void printByteHEX(byte inByte) {
  byte p1 = inByte / 16, p2 = inByte % 16;
  if (p1 > 9) p1 += '7'; else p1 += '0';
  if (p2 > 9) p2 += '7'; else p2 += '0';
  printChar(p1); printChar(p2);
}

void clearDisplay() {
  OzOled.clearDisplay();
  charPos = 0;
}


Передающая часть (для UNO или Мега или USB UART соответственно нафиг не нужно):

#include <avr/io.h>
#include <avr/interrupt.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

// PB0 pin 5
#define PB0_OUT sbi(DDRB,PB0)
#define PB0_IN cbi(DDRB,PB0)
#define PB0_HIGH sbi(PORTB,PB0)
#define PB0_LOW cbi(PORTB,PB0)
// PB1 pin 6
#define PB1_OUT sbi(DDRB,PB1)
#define PB1_IN cbi(DDRB,PB1)
#define PB1_HIGH sbi(PORTB,PB1)
#define PB1_LOW cbi(PORTB,PB1)
// PB2 pin 7
#define PB2_OUT sbi(DDRB,PB2)
#define PB2_IN cbi(DDRB,PB2)
#define PB2_HIGH sbi(PORTB,PB2)
#define PB2_LOW cbi(PORTB,PB2)
// PB3 pin 2 - TxD
#define PB3_OUT sbi(DDRB,PB3)
#define PB3_IN cbi(DDRB,PB3)
#define PB3_HIGH sbi(PORTB,PB3)
#define PB3_LOW cbi(PORTB,PB3)
// PB4 pin 3 - TestLED
#define PB4_OUT sbi(DDRB,PB4)
#define PB4_IN cbi(DDRB,PB4)
#define PB4_HIGH sbi(PORTB,PB4)
#define PB4_LOW cbi(PORTB,PB4)
#define PB4_READ bitRead(PINB,PB4)

byte txbyte;
byte txbitcount;

void setup () {
  PB0_OUT; PB0_LOW;
  PB1_OUT; PB1_LOW;
  PB2_OUT; PB2_LOW;
  PB3_OUT; PB3_HIGH;
  PB4_OUT; PB4_LOW;
  // -
  txbyte = 0xFF;
  txbitcount = 0x00;
  cbi(TCCR0A, COM0A1); cbi(TCCR0A, COM0A0); cbi(TCCR0A, COM0B1); cbi(TCCR0A, COM0B0);
  sbi(TCCR0A, WGM01); cbi(TCCR0A, WGM01); // CTC mode
  cbi(TCCR0B, CS02); sbi(TCCR0B, CS01); cbi(TCCR0B, CS00); // N=8
  OCR0A = 103; // count clock/OCR0A/2/N/9600 -1
  sbi(TIMSK, OCF0A);
  // - test
  uart_send('H'); delay(50); uart_send('i'); delay(50);
  uart_send('!'); delay(50); uart_send(' '); delay(50);
}

void loop () {
}

void uart_send(byte tb) {
  while (txbitcount);
  txbyte = tb;
  txbitcount = 0x09; // 8 bit + start bit;
}

ISR(TIM0_COMPA_vect) {
  TCNT0 = 0;
  if (txbitcount == 9) {
    PB4_HIGH;
    PB3_LOW; // start bit
    --txbitcount;
  } else {
    if (bitRead(txbyte, 0)) PB3_HIGH; else PB3_LOW;
    txbyte = (txbyte >> 1) | 0x80;
    if (txbitcount > 0) (--txbitcount);
    if (txbitcount == 0) PB4_LOW;
  }
}

 

melectro
Offline
Зарегистрирован: 22.12.2017

Всем привет! Как сделать управление RGB светодиодом с управлением двумя кнопками, один режим статический, второй динамический и пару вариантов моргания в динамическом режиме, только без програмного шима, от него в глазах рябит уже. В моем скетче из-за функции delay перестает работать кнопка:

#define BLED 2                                         //2 контакт для синего вывода RGB-светодиода
#define GLED 1                                         //1 контакт для зеленого вывода RGB-светодиода
#define RLED 0                                         //0 контакт для красного вывода RGB-светодиода
#define BUTTON 3                                       //3 контакт для кнопки
#define BUTTON2 4                                      //4 контакт для кнопки
 
boolean lastButton = LOW;                              //предыдущее состояние кнопки
boolean currentButton = LOW;                           //текущее состояние кнопки
int ledMode = 0;                                       //статус  RGB-светодиода
 
void setup()
{
  pinMode (BLED, OUTPUT);                              //Устанавливаем контакт BLED(Blue LED, т.е 2 контакт) как выход
  pinMode (GLED, OUTPUT);                              //Устанавливаем контакт GLED(Green LED, т.е 1 контакт) как выход
  pinMode (RLED, OUTPUT);                              //Устанавливаем контакт RLED(Red LED, т.е 0 контакт) как выход
  pinMode (BUTTON, INPUT);                             //Устанавливаем контакт BUTTON(т.е. 3 контакт) как вход(опционально)
  pinMode (BUTTON2, INPUT);                             //Устанавливаем контакт BUTTON2(т.е. 4 контакт) как вход(опционально)
}
 
void loop()
{
  currentButton = debounce(lastButton);                //считываем состояние кнопки с применением "антидребезга"
  if (lastButton == LOW && currentButton == HIGH)      //если кнопка была нажата
  {
    ledMode++;                                         //инкрементируем значение переменной
  }
  lastButton = currentButton;                          //сохраняем текущее состояние кнопки в предыдущее
 
  if (ledMode == 5) ledMode = 0;                      //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
  setMode(ledMode);                                   //изменить режим светодиода
}
 
/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);             //считываем состояние кнопки
  if (last != current)                               //если есть изменения
  {
    delay(5);                                        //ждем 5мс
    current = digitalRead(BUTTON);                   //считываем состояние кнопки
  }
  return current;                                    //возвращаем, считанное состояние кнопки
}
 
/*
* Выбор режима работы светодиода
* Передача номера режима и его установка
* Функция ничего не возвращает
*/
void setMode(int mode)
{
  //Красный
  if (mode == 1)
  {
    digitalWrite(RLED, HIGH);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
  }
  //Зеленый
  else if (mode == 2)
  {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, HIGH);
    digitalWrite(BLED, LOW);
  }
  //Синий
  else if (mode == 3)
  {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, HIGH);
  }
  //Динамический режим
  else if (mode == 4)
  {
  digitalWrite(RLED, HIGH); // Включаем красный свет
  digitalWrite(GLED, LOW);
  digitalWrite(BLED, LOW);
  
  delay(100); // Устанавливаем паузу для эффекта

  digitalWrite(RLED, LOW); // Выключаем красный свет
  digitalWrite(GLED, LOW);
  digitalWrite(BLED, LOW);
 
  delay(10); // Устанавливаем паузу для эффекта
 
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, HIGH); // Включаем зеленый свет
  digitalWrite(BLED, LOW);
 
  delay(100); // Устанавливаем паузу для эффекта

  digitalWrite(RLED, LOW);
  digitalWrite(GLED, LOW); // Выключаем зеленый свет
  digitalWrite(BLED, LOW);

  delay(10); // Устанавливаем паузу для эффекта
 
  digitalWrite(RLED, LOW);
  digitalWrite(GLED, LOW);
  digitalWrite(BLED, HIGH); // Включаем синий свет

  delay(100); // Устанавливаем паузу для эффекта

  digitalWrite(RLED, LOW);
  digitalWrite(GLED, LOW);
  digitalWrite(BLED, LOW); // Выключаем синий свет
 
  delay(10); // Устанавливаем паузу для эффекта
  }
  //Выключен
  else
  {
    digitalWrite(RLED, LOW);
    digitalWrite(GLED, LOW);
    digitalWrite(BLED, LOW);
  }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Как обычно - millis вас спасёт, в начале цикла lool сохранить значение, потом через некоторое время счётчика зажигать нужные светодиоды по циклу - масса примеров на форуме

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Отсюда например можете взять принцип - каждые 4 секунды режим переключается
http://arduino.ru/forum/proekty/miniatyurnyi-komnatnyi-termometr-na-atti...

melectro
Offline
Зарегистрирован: 22.12.2017

Программист из меня еще тот, получился небольшой код, который занимает 99% памяти Тиньки:

 

//RGB Светодиод, 2 кнопки, моргание без ШИМа

#include <ButtonPULLUP.h>

#define BLED 2                      //2 контакт для синего вывода RGB-светодиода
#define GLED 1                      //1 контакт для зеленого вывода RGB-светодиода
#define RLED 0                      //0 контакт для красного вывода RGB-светодиода
#define BUTTON 3                    //3 контакт для кнопки
#define BUTTON2 4                   //4 контакт для кнопки

Button button1(BUTTON, 15);         // создание объекта для кнопки 1
Button button2(BUTTON2, 15);        // создание объекта для кнопки 2
 
boolean lastButton = LOW;           //предыдущее состояние кнопки
boolean currentButton = LOW;        //текущее состояние кнопки
uint8_t mode = 1;                   // режим: 1-статический 2-динамический
uint8_t color = 0;                  // цвет: 0-красный 1-зеленый 2-синий 3-красный+зеленый 4-красный+Зеленыйсиний 5-зеленый+синий 6-красный+синий 7-
 
void setup()
{
  pinMode (BLED, OUTPUT);           //Устанавливаем контакт BLED(Blue LED, т.е 2 контакт) как выход
  pinMode (GLED, OUTPUT);           //Устанавливаем контакт GLED(Green LED, т.е 1 контакт) как выход
  pinMode (RLED, OUTPUT);           //Устанавливаем контакт RLED(Red LED, т.е 0 контакт) как выход
  pinMode (BUTTON, INPUT);          //Устанавливаем контакт BUTTON(т.е. 3 контакт) как вход
  pinMode (BUTTON2, INPUT);         //Устанавливаем контакт BUTTON2(т.е. 4 контакт) как вход
}
 
void loop(){

    if(mode==1){                    // если установлен режим статический
        //Красный
         if (color == 0)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, LOW);
         digitalWrite(BLED, LOW);
         }
         //Зеленый
         else if (color == 1)
         {
         digitalWrite(RLED, LOW);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, LOW);
         }
         //Синий
         else if (color == 2)
         {
         digitalWrite(RLED, LOW);
         digitalWrite(GLED, LOW);
         digitalWrite(BLED, HIGH);
         }
         //Красный+Зеленый
         else if (color == 3)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, LOW);
         }
         //Красный+Синий
         else if (color == 4)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, LOW);
         digitalWrite(BLED, HIGH);
         }
         //Зеленый+Синий
         else if (color == 5)
         {
         digitalWrite(RLED, LOW);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, HIGH);
         }
         //Красный+Зеленый+Синий
         else if (color == 6)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, HIGH);
         }
    }
    if(mode==2){                         // если установлен режим динамический
      if(millis()%50==0){                // если прошла 1 секунда
        color++;
        if (color == 4) color = 0;       //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
      }
      //Красный
         if (color == 0)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, LOW);
         digitalWrite(BLED, LOW);
         }
         //Зеленый
         else if (color == 1)
         {
         digitalWrite(RLED, LOW);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, LOW);
         }
         //Синий
         else if (color == 2)
         {
         digitalWrite(RLED, LOW);
         digitalWrite(GLED, LOW);
         digitalWrite(BLED, HIGH);
         }
         //Красный+ЗеленыйСиний
         else if (color == 3)
         {
         digitalWrite(RLED, HIGH);
         digitalWrite(GLED, HIGH);
         digitalWrite(BLED, HIGH);
         }
    }
    //delay(1);                        // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
  Func_buttons_control();              // передаём управление кнопкам
}
// Функция управления кнопками:
void Func_buttons_control(){
  //  Если нажата кнопка BUTTON
    //if(digitalRead(BUTTON)){
      //mode=mode==1?2:1;              // инверсия режима
    //}
    //  Если нажата кнопка BUTTON2
    //if(digitalRead(BUTTON2)){
      //color++;                       //
    //}
    //if (color == 7) color = 0        //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
  
  button1.filterAvarage();             // вызов метода фильтрации по среднему для кнопки 1
  button2.scanState();                 // вызов метода ожидания стабильного состояния для кнопки 2

  // блок управления светодиодом 1
  if ( button1.flagClick == true ) {
    // был клик кнопки
    button1.flagClick= false;          // сброс признака 
    mode=mode==1?2:1;                  // инверсия режима
    color=0;  
  }
  // блок управления светодиодом 2
  if ( button2.flagClick == true ) {
    // был клик кнопки
    button2.flagClick= false;           // сброс признака 
    color++;
    if (color == 7) color = 0;          //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
  }
  delay(2);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ничего не понимаю зачем 2 кнопки . Хватит 1 и 4 режима по кругу.

melectro
Offline
Зарегистрирован: 22.12.2017

Так интереснее и сложнее и кнопки уже припаяны. При нажатии на первую кнопку меняется режим статический/динамический. При нажатии на вторую кнопку в статическом режиме меняются цвета, а в динамическом меняются разные варианты моргания.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

melectro пишет:

Программист из меня еще тот, получился небольшой код, который занимает 99% памяти Тиньки:

чуток оптимизации Loop()

uint8_t MyColorMode1[7][3] = { 1, 0, 0, //Красный
                               0, 1, 0, //Зеленый
                               0, 0, 1, //Синий
                               1, 1, 0, //Красный+Зеленый
                               1, 0, 1, //Красный+Синий
                               0, 1, 1, //Зеленый+Синий
                               1, 1, 1  //Красный+Зеленый+Синий
                             };
uint8_t MyColorMode2[4][3] = { 1, 0, 0, //Красный
                               0, 1, 0, //Зеленый
                               0, 0, 1, //Синий
                               1, 1, 1, //Красный+Зеленый+Синий
                             };
void loop() {

  if (mode == 1) {                // если установлен режим статический
    digitalWrite(RLED, MyColorMode1[color, 0]);
    digitalWrite(GLED, MyColorMode1[color, 1]);
    digitalWrite(BLED, MyColorMode1[color, 2]);
  }
  if (mode == 2) {                     // если установлен режим динамический
    if (millis() % 50 == 0) {          // если прошла 1 секунда
      color++;
      if (color == 4) color = 0;       //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
    }

    digitalWrite(RLED, MyColorMode2[color, 0]);
    digitalWrite(GLED, MyColorMode2[color, 1]);
    digitalWrite(BLED, MyColorMode2[color, 2]);


    //delay(1);                        // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    Func_buttons_control();              // передаём управление кнопкам
  }
}

т.к. RLED=0, GLED=1, BLED=2 можно еще немного, заменив

    digitalWrite(RLED, MyColorMode1[color, 0]);
    digitalWrite(GLED, MyColorMode1[color, 1]);
    digitalWrite(BLED, MyColorMode1[color, 2]);

на 

    for(uint8_t=0; i<3; i++)  digitalWrite(i, MyColorMode1[color, i]);

и т.д.

melectro
Offline
Зарегистрирован: 22.12.2017

Спасибо, я и сам как раз думал двигаться в сторону массивов и циклов, но почему-то Ваш код выдает ошибку во всех строчках типо этой:

digitalWrite(RLED, MyColorMode1[color, 0]);

invalid conversion from 'uint8_t* {aka unsigned char*}' to 'uint8_t {aka unsigned char}' [-fpermissive]
 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

версия IDE какая, у меня на 1.8.4 без ошибок.

melectro
Offline
Зарегистрирован: 22.12.2017

1,6,13

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

может чего не так скопировали ?

скачал 1.6.13, все норм

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я наверное понял, я для нано компилирую, а надо для тиньки13...

там ядро доугое, ща поставим проверим...

melectro
Offline
Зарегистрирован: 22.12.2017

Если выбрать плату Arduino UNO то ошибки нет, а у меня Attiny13a...

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ндаа, очередной фокус Ардуино

ей хочется чтобы запись для ядра 13тиньки выглядела так

    digitalWrite(RLED, MyColorMode2[color][0]);

хотя функция описана одинакого для обоих ядер

void digitalWrite(uint8_t, uint8_t);

ни хрена не понимаю (((

Евгений Петровичь !!!! хелп !!!

Zahar
Zahar аватар
Offline
Зарегистрирован: 16.11.2013

Здравствуйте.

Задача простейшая, есть два СД, первый "зелёный" должен моргать каждую секунду.

Второй "красный", в начале программы должен включиться, по истечении 10 минут должен выключиться и больше не включатся.

С зелёным всё в порядке а вот красный почему то не выключаеться.

Помогите найти ошибку.

#include <util/delay.h>
boolean ledState = LOW;             // этой переменной устанавливаем состояние светодиода 
long previousMillisGREEN = 0;        // храним время последнего переключения светодиода
long previousMillisRED=0;
long intervalGREEN = 1000;           // интервал между включение/выключением светодиода (1 секунда)
long intervalRED = 600000;
void setup() {
  DDRB |= (1<<0);     // устанавливаем вывод PB0 как выход
  DDRB |= (1<<4);     // устанавливаем вывод PB4 как выход
  PORTB &= ~(1<<4);  //Зеленый вкл (инверстный)
  PORTB |= (1<<0);   //Красный вкл
  _delay_ms(500);
}
void loop()
{
  unsigned long currentMillisGREEN = millis();
  unsigned long currentMillisRED = millis();
  
  if(currentMillisRED - previousMillisRED > intervalRED) {//интервал для красного леда, если прошел то
    previousMillisRED = currentMillisRED; 
    PORTB &= ~(1<<0);//Красный выкл
  }
  
  if(currentMillisGREEN - previousMillisGREEN > intervalGREEN) {//интервал для зелёного леда, если прошел то
    previousMillisGREEN = currentMillisGREEN;  // сохраняем время последнего переключения
    if (ledState == LOW){
      PORTB &= ~(1<<4);
      ledState = HIGH;
    }
    else{
      PORTB |= (1<<4);
      ledState = LOW;
    }
  }
}

 

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Zahar, почему вы все тащите в одну кучу. Или все же принцип разделяй и властвуй уже отменили

ggarry
Offline
Зарегистрирован: 21.01.2016

А что, с Новым годом поздравлять уже не принято? Ауууу. С Новым годом, ребята!

Есть вопросик, леплю высоковольтный генератор, точнее два генератора, работающих поочередно, управление напряжением изменением частоты, с выходов таймера, все просто. Фишка в том, что один генератор делает плюс, второй минусовой, работают поочередно. Для контроля выходного напряжения задействован один вход АЦП, на который планирую завести сигналы с делителей выходного напряжения обеих генераторов, напоминаю, работают поочередно. Как красиво измерять минус, без инвертирования и прочих усложнений? Хочу красивую минималистическую схему. Как вариант, высокоомный делитель в половину опорного и его смещать в плюс и минус. Прокатит?

 

ggarry
Offline
Зарегистрирован: 21.01.2016

А что, с Новым годом поздравлять уже не принято? Ауууу. С Новым годом, ребята!

Есть вопросик, леплю высоковольтный генератор, точнее два генератора, работающих поочередно, управление напряжением изменением частоты, с выходов таймера, все просто. Фишка в том, что один генератор делает плюс, второй минусовой, работают поочередно. Для контроля выходного напряжения задействован один вход АЦП, на который планирую завести сигналы с делителей выходного напряжения обеих генераторов, напоминаю, работают поочередно. Как красиво измерять минус, без инвертирования и прочих усложнений? Хочу красивую минималистическую схему. Как вариант, высокоомный делитель в половину опорного и его смещать в плюс и минус. Прокатит?