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

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
Sev4ick
Сообщения: 2
Зарегистрирован: 24 июн 2015, 13:03

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

Сообщение Sev4ick »

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

Код: Выделить всё

const int RED_PIN = 9;
const int GREEN_PIN = 10;
const int BLUE_PIN = 11;
const int buttonPin = 2;

int buttonState = 0; 
 
void setup()
{
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  pinMode(buttonPin, INPUT); 
}
 
void loop(){
   
  buttonState = digitalRead(buttonPin);
 
  if (buttonState == HIGH) {   
     
  digitalWrite(RED_PIN, LOW);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, LOW);
 
  delay(1000);
 
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, LOW);
 
  delay(1000);
 
  digitalWrite(RED_PIN, LOW);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, HIGH);
 
  delay(1000);
 
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, LOW);
  digitalWrite(BLUE_PIN, HIGH);
 
  delay(1000);
 
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, HIGH);
 
  delay(10);
  }
  
  else {
   
  digitalWrite(RED_PIN, HIGH);
  digitalWrite(GREEN_PIN, HIGH);
  digitalWrite(BLUE_PIN, HIGH);
  }

}
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

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

Сообщение Mr.Kubikus »

Привет!

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

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

Кстати, исходные коды в постах можно заворачивать в тег code. Исправил в вашем посте.
С уважением, Григорий
GitHub FB ВК
Sev4ick
Сообщения: 2
Зарегистрирован: 24 июн 2015, 13:03

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

Сообщение Sev4ick »

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

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

Сообщение enastoyashchiy »

Есть реализация переключения светодиодов ардуиной с более коротким кодом

Код: Выделить всё

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); }//гасим все светодиоды

  }

}
Ответить