Как запустить скетч на период (например, 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);
}
@GEORGE BOULIS, 👍0
Обсуждение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
Вы можете написать в конце цикла ()
: “если прошла одна минута, то
ложитесь спать”. В 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
- Связь последовательного порта Digispark
- Библиотеки I2C для ATTiny85?
- ATtiny85 Digispark clones failing USB handshake - как их запрограммировать?
- длина провода i2c
- Программирование сервопривода на ATtiny85
- Программирование микроконтроллера Attiny85 без arduino
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
Я бы начал с того, что превратил ваши наборы из пяти "digitalWrite" в вызов одной функции, которая принимает номер, указанный в комментарии., @timemage
где ваша попытка перевести устройство в спящий режим? ... вы представили только несвязанный код ... пожалуйста, представьте минимальный код, демонстрирующий проблему ... это означает, что у вас есть код только для одного светодиода, @jsotola
Здравствуйте,спасибо вам обоим за ваши ответы. Это мой основной код скетча. Пока никаких попыток перевести чип в спящий режим. Тогда лучше прочитать больше о командах, попробуйте перевести attiny в режим сна и вернуться. Может быть, рановато для вопросов. спасибо, ребята., @GEORGE BOULIS
@GEORGEBOULIS Я думаю, что видел несколько учебных пособий о режимах сна ATtiny85 ... возможно, это может стать вашим началом, @jsotola
Еще раз спасибо., @GEORGE BOULIS