Тел. (495) 972-27-12

Помогите новичку

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY

Помогите новичку

Сообщение Sev4ick » 24 июн 2015, 13:29

Привет! Буквально вчера приобрел Arduino Uno, потихонечку разбираюсь. Покупал для двух несложных проектов. До второго проекта пока не дошел, а вот с первым нужна помощь. Что имеем - есть Ардуино Уно, RGB светодиод, батарейка типа Крона и тактовая кнопка чтобы все это запустить. Цель такая: после нажатия кнопки RGB светодиод загорается поочередно 4-мя разными цветами. Во время выполнения программы кнопка не активна. После выполнения алгоритма Ардуино отключается (чтобы не жрать батарейку). Для того чтобы разбудить Ардуино и снова запустить цикл, нужно вновь нажать на кнопку. И так далее. С первой частью я справился - нажимаем кнопку, светодиод мигает 4 раза, далее чтобы снова замигал опять нажимаем кнопку. Но как перевести Ардуино в спящий режим, ведь продолжают гореть светодиоды на самой плате? Много они конечно не кушают, но все же кушают. Прошу помощи у знающих людей, желательно поподробней, тк это для меня темный лес. На данный момент алгоритм выглядит так:

Code: [Выделить всё] [Expand/Collapse]
  1. const int RED_PIN = 9;
  2. const int GREEN_PIN = 10;
  3. const int BLUE_PIN = 11;
  4. const int buttonPin = 2;
  5.  
  6. int buttonState = 0;
  7.  
  8. void setup()
  9. {
  10.   pinMode(RED_PIN, OUTPUT);
  11.   pinMode(GREEN_PIN, OUTPUT);
  12.   pinMode(BLUE_PIN, OUTPUT);
  13.   pinMode(buttonPin, INPUT);
  14. }
  15.  
  16. void loop(){
  17.    
  18.   buttonState = digitalRead(buttonPin);
  19.  
  20.   if (buttonState == HIGH) {  
  21.      
  22.   digitalWrite(RED_PIN, LOW);
  23.   digitalWrite(GREEN_PIN, HIGH);
  24.   digitalWrite(BLUE_PIN, LOW);
  25.  
  26.   delay(1000);
  27.  
  28.   digitalWrite(RED_PIN, HIGH);
  29.   digitalWrite(GREEN_PIN, HIGH);
  30.   digitalWrite(BLUE_PIN, LOW);
  31.  
  32.   delay(1000);
  33.  
  34.   digitalWrite(RED_PIN, LOW);
  35.   digitalWrite(GREEN_PIN, HIGH);
  36.   digitalWrite(BLUE_PIN, HIGH);
  37.  
  38.   delay(1000);
  39.  
  40.   digitalWrite(RED_PIN, HIGH);
  41.   digitalWrite(GREEN_PIN, LOW);
  42.   digitalWrite(BLUE_PIN, HIGH);
  43.  
  44.   delay(1000);
  45.  
  46.   digitalWrite(RED_PIN, HIGH);
  47.   digitalWrite(GREEN_PIN, HIGH);
  48.   digitalWrite(BLUE_PIN, HIGH);
  49.  
  50.   delay(10);
  51.   }
  52.  
  53.   else {
  54.    
  55.   digitalWrite(RED_PIN, HIGH);
  56.   digitalWrite(GREEN_PIN, HIGH);
  57.   digitalWrite(BLUE_PIN, HIGH);
  58.   }
  59.  
  60. }
GeSHi © Codebox Plus
Sev4ick
 
Сообщения: 2
Зарегистрирован: 24 июн 2015, 13:03

Re: Помогите новичку

Сообщение Mr.Kubikus » 24 июн 2015, 14:03

Привет!

У микроконтроллера AVR ATmega328P, который используется в Arduino UNO, есть несколько режимов пониженного энергопотребления. Они отличаются друг от друг перечнем отключаемых функциональных блоков и соответственно уровнем снижения энергопотребления. Самый экономный режим в документации называется - Power-down Mode. После перехода в "спячку" контроллер можно разбудить внешним прерыванием путем изменения уровня на ногах INT0, INT1 или PCINT0-PCINT2.

Для углубленного изучения вопроса рекомендую к прочтению статью о спящем режиме в микроконтроллере ATmega328P. Там же есть и пример для Arduino.

Кстати, исходные коды в постах можно заворачивать в тег code. Исправил в вашем посте.
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 880
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва

Re: Помогите новичку

Сообщение Sev4ick » 26 июн 2015, 01:19

А можете ли вы примерно оценить время работы батареи если вводить Ардуино в спящий режим? Скажем, планирую нажимать на кнопку раз 15 в сутки. Мне подсказали, что если вообще ничего не трогать и оставить все как есть, то обыкновенная 9-вольтовая крона сядет примерно за сутки. На сколько эффективным будет режим Power-down Mode, сможет ли он растянуть заряд, скажем, на неделю?
Sev4ick
 
Сообщения: 2
Зарегистрирован: 24 июн 2015, 13:03

Re: Помогите новичку

Сообщение enastoyashchiy » 11 дек 2015, 15:47

Есть реализация переключения светодиодов ардуиной с более коротким кодом
Code: [Выделить всё] [Expand/Collapse]
int first_out = 11; //первый дискретный выход

int last_out = 13; //последний дискретный выход

int t;

int i;



//блок для инициализации входо-выходов и других исходных данных

void setup() {

  last_out = last_out + 1; //добавляем единицу для корректного использования в циклах

  //определение 11-го, 12-го и 13-го дискретных выводов платы Ардуино как выходы

  for (i = first_out; i < last_out; i++) { pinMode(i, OUTPUT); }

}



void loop() {

  for (t = first_out; t < last_out; t++) { //перебираем номера дискретных выходов 11,12,13 поочереди

    digitalWrite(t, HIGH); //зажигание следующего светодиода

    delay(500); //задержка 500мсек

    for (i = first_out; i < last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

  }

}
GeSHi © Codebox Plus
enastoyashchiy
 
Сообщения: 1
Зарегистрирован: 11 дек 2015, 15:43


Вернуться в Arduino и Ко. ♥♥♥



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron