Как запустить скетч на период (например, 1 минуту), а затем attiny85 автоматически перейдет в режим ожидания?

Еще один новичок в устройстве arduino. Мои знания в программировании очень слабы. Как я уже упоминал в названии, мне бы хотелось, чтобы вы помогли. Я просто хочу запустить этот простой скетч в attiny85, скажем, на 1 минуту, а затем чип сам перейдет в спящий режим. Мой код приведен ниже, но мне не удается достичь того, чего я хочу. Большое спасибо.

void setup() {

  pinMode(0, OUTPUT); 
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);    
  
  
}

void loop() {
  
                              // put your main code here, to run repeatedly:
  pinMode(0, OUTPUT); 
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);

  
  digitalWrite(0, HIGH);
  digitalWrite(1, LOW);  // 1
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);   // 2
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);      //3
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);   //4
  digitalWrite(2, INPUT);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);   //5
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);   //4
  digitalWrite(2, INPUT);
  digitalWrite(3, HIGH);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);     //3
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, LOW);
  digitalWrite(1, HIGH);   // 2
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  delay(180);
  digitalWrite(0, HIGH);
  digitalWrite(1, LOW);  // 1
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);

  
}   

, 👍0

Обсуждение

Я бы начал с того, что превратил ваши наборы из пяти "digitalWrite" в вызов одной функции, которая принимает номер, указанный в комментарии., @timemage

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

Здравствуйте,спасибо вам обоим за ваши ответы. Это мой основной код скетча. Пока никаких попыток перевести чип в спящий режим. Тогда лучше прочитать больше о командах, попробуйте перевести attiny в режим сна и вернуться. Может быть, рановато для вопросов. спасибо, ребята., @GEORGE BOULIS

@GEORGEBOULIS Я думаю, что видел несколько учебных пособий о режимах сна ATtiny85 ... возможно, это может стать вашим началом, @jsotola

Еще раз спасибо., @GEORGE BOULIS


2 ответа


-2

Ваши задержки кажутся очень короткими. delay()=Параметры. мс: количество миллисекунд для паузы (unsigned long). Пример: delay(1000) равна 1 секунде, поэтому 60 * 1000 = 1 минута.

ты можешь это сделать,

for(count = 0; count < 60 ; count++)
{
delay(1000);
}

//  Эта функция называется George
//Каждый раз, когда вы хотите, чтобы он включался, введите эту строку George(); и он сделает свое дело.
void George {
 digitalWrite(0, HIGH);
 digitalWrite(1, LOW);  // 1
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
}

По мере вашего прогресса в изучении millis() это сделает вещи намного приятнее, и это не блокирует. Когда ваш код нажимает delay(), он больше ничего не делает, пока не истечет время. Это должно помочь вам начать:

,

Дорогой Юрай, речь идет не о задержках в скетче, а о глубоком сне после того, как скетч выполняется в течение определенного периода времени. Я использовал millis () в конце всего моего скетча. это действительно прогресс. Спасибо., @GEORGE BOULIS


3

Вы можете написать в конце цикла (): “если прошла одна минута, то ложитесь спать”. В C++ это было бы:

if (millis() >= 60000)  // прошло 60 секунд
    sleep_mode();

Вам нужно будет включить <avr/sleep.h><avr/sleep.h>, чтобы получить доступ к функции sleep_mode (). Сон, скорее всего, будет очень коротким, хотя, вероятно, менее миллисекунды, так как ATtiny будет разбужен следующим прерыванием таймера.

Если вы хотите более глубокого и продолжительного сна, вы можете выбрать другой режим сна в настройках():

set_sleep_mode(SLEEP_MODE_PWR_DOWN);

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

В качестве альтернативы, если вы хотите, чтобы ATtiny спал вечно (до следующего цикла питания), вызовите cli (), чтобы отключить прерывания, прямо перед вызовом sleep_mode().

,

Дорогой Эдгар , я пытаюсь делать то, что ты говоришь, и у меня хороший результат. Скетч выполняется в течение периода, заданного в millis(), а затем останавливается. Проблема в том, что светодиод в pin-режиме 0 остается высоким навсегда. Теперь я пытаюсь понять, что я делаю не так. Обычно я хочу, чтобы все контакты были низкими после активации режима сна. я вернусь. Еще раз спасибо., @GEORGE BOULIS

Привет, я думаю, что решил эту проблему. Это оказалось проще, чем я думал. После команды millis я установил все контакты на низкий цифровой код(0, ВЫСОКИЙ); Цифровая запись(0, НИЗКИЙ); Цифровая запись(1, НИЗКИЙ); // 1 Цифровая запись(2, НИЗКАЯ); Цифровая запись(3, НИЗКИЙ); digitalWrite(4, НИЗКИЙ); после этого утверждения я продолжаю выполнять команды режима сна, и вот мы начинаем. Все светодиоды перестают мигать, и ток от батареи не проходит. Для меня это маленькая победа. Большое всем вам спасибо., @GEORGE BOULIS