Простое засыпание attiny

Всем привет!
Возник еще вопрос. Сразу кладу схему:


И код:

#include "TM1637.h"   // Подключаем библиотеку для работы с модулем
#include <OneWire.h>
#include <DallasTemperature.h>
#define F_CPU 1200000UL // Частота МК в герцах;
#include <avr/io.h>
#include <avr/sleep.h> // здесь описаны режимы сна;
#include <util/delay.h>
//#include <TickerScheduler.h>

//int8_t DispMSG[2];   // Настройка символов для последующего вывода на дислей
//Определяем пины для подключения к плате Arduino
//#define CLK 3  //Arduino UNO
//#define DIO 2  //Arduino UNO
#define CLK 0  //Attiny25
#define DIO 2  //Attiny25
//Создаём объект класса TM1637, в качестве параметров
//передаём номера пинов подключения
TM1637 tm1637(CLK, DIO);

// Номер пина Arduino с подключенным датчиком
//#define PIN_DS18B20 4  //Arduino UNO
#define PIN_DS18B20 4  //Attiny25
// Создаем объект OneWire
OneWire oneWire(PIN_DS18B20);
// Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire.
DallasTemperature dallasSensors(&oneWire);
// Специальный объект для хранения адреса устройства
DeviceAddress sensorAddress;
//TickerScheduler ts(1);

//char temperatureCString[6];
byte d0, d1, d3;
bool znak;
unsigned long interval = 0;

void setup() {
  //Serial.begin(115200);
  //Инициализация модуля
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);
  dallasSensors.begin();
  /*ts.add(0, 5000, [&](void*) {
    GettOut();
    if (znak == 0) tm1637.point(POINT_OFF);
    else tm1637.point(POINT_ON);
    tm1637.display(0,d0); 
    tm1637.point(POINT_ON);
    tm1637.display(1,d1);
    tm1637.point(POINT_OFF);
    tm1637.display(2,d3);

    //Serial.print("Temperature is: ");
    //Serial.print(d0);
    //Serial.print(d1);
    //Serial.println(d3);
  }, nullptr, true);*/
}

void loop() {  
  //ts.update();
  int i;
  if (millis() - interval >= 2000) {
    interval = millis();
    i++;
    GettOut();
    if (znak == 0) tm1637.point(POINT_OFF);
    else tm1637.point(POINT_ON);
    tm1637.display(0,d0); 
    tm1637.point(POINT_ON);
    tm1637.display(1,d1);
    tm1637.point(POINT_OFF);
    tm1637.display(2,d3);
  }
  if (i >= 600) {
    system_sleep();
  }
}

void ds18b20_init() {
  dallasSensors.begin();
  GettOut();
}

char* GettOut() {
  float tempC;
  int tempCI;
  byte d1t;
  dallasSensors.requestTemperatures(); 
  tempC = dallasSensors.getTempCByIndex(0);
  if (tempC < 0) znak = true;
  else znak = false;
  tempCI = tempC * 10;
  //Serial.println(znak);
  //Serial.println(tempC);
  //Serial.println(tempCI);
  d0 = abs(tempCI) / 100;
  d1t = abs(tempCI) % 100;
  d1 = d1t / 10;
  d3 = d1t % 10;
}

void system_sleep() { // Функция сна;
ADCSRA &= ~(1 << ADEN); // Отключаем АЦП;
ACSR |= (1 << ACD); // Откл. компаратор;
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Самый глубокий сон;
sleep_enable(); // Разрешаем сон;
sleep_cpu(); // Спим;
}

Вся схема питается от двух батареек ААА. Соответственно хочется, чтобы они дольше работали. Для этого поставил кнопку. Если не забыл, выключил. А вот если забыл, хочу чтоб устройство заснуло намертво. Пробуждение отключением питания кнопкой и по новой его включение. Нашел код на форуме. И вроде он работает. Датчик на изменение температуры не реагирует. Но вот индикаторы не гаснут! Может надо им какую команду дать?

Этот код не может быть скомпилирован, я без компилятора это вижу. Не свисти и выложи тот код (реальный) с которым работаешь.

1 лайк

Тема перемещена в песочницу.

1 лайк

Этот код записан в Attiny45. Только что залил его туда через UNO. До момента засыпания все прекрасно работает. Да и с засыпанием как-то частично работает.

Ещё раз говорю - не свисти. Выложенный здесь код даже компилироваться не будет!

1 лайк

Чета твоя компетенция вызывает сомнения! Вот зачем мне? Говорю, что я его залил в 45 и он работает. Если уверен, что не работает, проходи мимо. Ну уж очень безапелляционные заявления.

61 строка, убедительно?!
Скопируй выложенный код назад в иде и попробуй скомпилировать, умник.

1 лайк

Тут таких «говорильщиков» на дню - не счесть. Поэтому так как есть.

Петрович петицию готовит )))

1 лайк

И что? Копирование по факсу с перепечатываем делаешь?

1 лайк

Вы ж не выключили TM1637, так с чего им гаснуть?

Есть свободный пин? Тогда питайте драйвер с пина (через транзистор) и когда не нужен - выключайте.

Кроме того, для крепкого сна Вам ещё много кое что сделать:

  1. Выключить всё в регистре PRR (можно функцией power_all_disable(); из <avr/power.h>)
  2. Убедиться, что все пины в стабильном состоянии и на них нет нагрузки;
  3. Выключить BOD (функцией sleep_bod_disable())
  4. Непосредственно перед sleep_cpu() закрыть все прерывания функцией cli()
  5. В принципе можно понизить частоту (функцией clock_prescale_set), Но это паранойя - один хрен в SLEEP_MODE_PWR_DOWN часы выключены.

Это, если я ничего не забыл.

1 лайк

Евгений Петрович, я прям в шоке. Так много написано, но о 61 строке - ни слова. В тоже время всегда первым сообщением от Вас идёт - код компилируется или нет. Неужели у Вас код компилируется?

1 лайк

А что про неё можно сказать, акромя того, что Вы уже сказали? Понятно, что не компилируется, но добавить-то нечего.

1 лайк

Тем не менее - не понятна Ваша логика (в иных подобных темах). На чем основывается «компилируется/не компилируется»? Вы же компилируете перед ответом код? Или выборочно? Или просто сегодня лень?
Просто интересно.

1 лайк

Компилирую, когда нужно убедиться, что нигде не облажался случайно (т.е. чуть реже, чем всегда). А здесь мой ответ был “общие слова”, там невозможно облажаться.

А так, да, иногда резко наезжаю, что не компилируется, что мол “про запускал” - брехня, а иногда нет. Это как вожжа под хвост ляжет.

1 лайк

Вам скучно? Ну не прописалась почему-то точка с запятой, в коде она есть и все прекрасно компилится.
Вообще как-то странно сайт работает при наборе текста. То не печатает букву хоть обнажимайся, а то залипает. Вчера думал к какой у компа. сегодня весь день работал удаленно и все работало. А щас зашел на форум и опять такая хрень.

Спасибо огромное! Я думал раз выключил Attiny все должно погаснуть.
И еще вопрос. Почему-то после выключенияания кнопкой, если сразу ее нажать, ну в течении 10-20 секунт, то тинька не запускается. Надо секунд 30 подождать. Может какую команду при старте давать?

Т.е. в коде все есть, а здесь вы выложили так, приблизительную писульку. А мы по ней гадать должны?

2 лайка

Блин! Ну говорю же! Копировал всё целиком. Почему точка с запятой пропала - не знаю! Ладно бы пол кода не было, а то из-за одной точки с запятой такой шум. Ну понятно что без нее не будет компилиться!

А как это сделать? У меня задействовано 3 пина. Два под индикаторы и один под датчик температуры. Принудительно на всех выходах низкий, а на всех входах высокий? Это я тут в другой теме видел. Типа так?

PB0_OUT; PB0_LOW;
PB2_OUT; PB2_LOW;
PB4_IN; PB4_HIGH;

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

И откуда у нас может быть уверенность, что не хватает ТОЛЬКО точки с запятой?

2 лайка