Энергосбережение ардуино (МЕТЕОСТАНЦИЯ), помогите новичку

recer1q1
Offline
Зарегистрирован: 24.11.2018

Всем добрый день, задача заводить метеостанцию по кноке в режим енергосбережения, и по кнопке выводить ее из нее, может и глупый вопрос, но уже в течении несколько дней не могу побороть, в режим енергосбережения заводить а из него выходить не хочет. Нашел хороший рабочий скетч но к своей системе применить не могу, прошу помощи как сопоставить эти два скетча в один что бы всё работало. 

КОД МОЕЙ МЕТЕОСТАНЦИИ

#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT11
 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
int val; // змінна для зберігання значення датчика температури
int tempPin = 0; // аналоговий вхід 0 для підключення датчика температури
 
int vall;
#include <SoftwareSerial.h>   
SoftwareSerial mySerial(10, 11);
 
DHT dht(DHTPIN, DHTTYPE);
 
const int LED1 = 6; // Контакт 8 для підключення світлодіода
const int DTH = 8; // Контакт 8 для підключення датчика
const int BT = 9; // Контакт 9 для підключення блютуз
const int BUTTON = 2; // Контакт 2 для підключення кнопки
boolean lastButton = LOW; // Змінна для збереження попереднього стану кнопки
boolean currentButton = LOW; // Змінна для збереження поточного стану кнопки
boolean ledOn = false; // Поточний стан світлодіода
// (Включений / виключений)
 
void setup()
{
  lcd.init();                     
  lcd.noBacklight();// Виключаем подсветку дисплея
  
  dht.begin();
 
  mySerial.begin(9600);
 
  pinMode (LED1, OUTPUT); // Конфігурувати контакт світлодіода як вихід
  pinMode (DTH, OUTPUT); // Конфігурувати контакт датчика як вихід
  pinMode (BT, OUTPUT); // Конфігурувати контакт блютуз як вихід
  pinMode (BUTTON, INPUT); // Конфігурувати контакт кнопки як вхід
  
 
}
 
/*
* Функція згладжування брязкоту
* Приймає в якості аргументу попередній стан кнопки
* І видає фактичне
*/
boolean debounce (boolean last) // debounce - брязкіт
{
boolean current = digitalRead (BUTTON); // змінній current присвоюється
//значення стану кнопки (HIGH =1=кнопка натиснута, LOW=0= кнопку не
//натиснуто)
if (last!= current) // якщо змінився стан кнопки
delay (5); // чекаємо 5 мс
current = digitalRead (BUTTON); // читаємо стан кнопки
return current; // повертаємо стан кнопки
}
 
void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
  
val = analogRead(tempPin); // отримуємо аналогове значення і присвоюємо його змінній 
float mv = ( val/1023.0)*4500; // перетворення цифрового сигналу (val ) в температуру
float cel = mv/10;
float farh = (cel*9)/5 + 32; // перетворення цифрового сигналу (val ) в температуру
 
  
  if (mySerial.available())
  {
    vall = mySerial.read();
    if (vall == 't')
    {
 
      mySerial.print(t);
    }
    if ( vall == 'h')
    {
      mySerial.print(h);
    }
  }
  
  currentButton = debounce (lastButton);
  if (lastButton == LOW && currentButton == HIGH) // Якщо натискання
  {
   ledOn = !ledOn; // Інвертувати значення стану світлодіода
  }
  lastButton = currentButton;
  digitalWrite (DTH, ledOn); // Змінити статус датчика
  digitalWrite (BT, ledOn); // Змінити статус стану блютуз
  digitalWrite (LED1, ledOn); // Змінити статус стану світлодіоду
 
if (ledOn == HIGH){
  lcd.setCursor(0, 0);
  lcd.print("H = ");
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0, 1);
  lcd.print("T = ");
  lcd.print(t);
  lcd.print(" *");
  lcd.backlight();
}
else {
lcd.noBacklight();
lcd.clear();
}
 
}

КОД ВВОД_ВЫВОД режим енергосбережения

 

#include <avr/sleep.h>

#include <avr/power.h>
#include <avr/interrupt.h>
#include <util/delay.h>
 
#define BUTTON_PIN 3
#define LED_PIN    5
 
void m_sleep();
void m_wake_up();
 
volatile bool flag = false;
 
int main() 
{
  // все пины на выход и в низкий уровень
  for (byte i = 0; i <= A7; i++) {
    pinMode(i, OUTPUT);    
    digitalWrite(i, LOW);
  }
 
  // установливаем на пине с кнопкой подтяжку к VCC
  pinMode(BUTTON_PIN, INPUT);
  digitalWrite(BUTTON_PIN, HIGH);
  
  // устанавливаем обработчик прерывания INT0
  attachInterrupt(0, m_wake_up, FALLING);
 
  // аналог loop()
  while(true) {
    // светим светодиодом 10 секунд
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH);
    
    // теперь функция _delay_ms() работает нормально
    // Ждем 10 секунд
    _delay_ms(10000);
    digitalWrite(LED_PIN, LOW);  
 
    // и засыпаем
    m_sleep();
    
    // отсюда выполнения программы продолжится при пробуждении
    // то есть снова светим 10 секунд и засыпаем
  }
}
 
void m_sleep() {
 
  // отключаем АЦП
  ADCSRA = 0;  
 
  // отключаем всю периферию
  power_all_disable ();
 
  // устанавливаем режим сна - самый глубокий, здоровый сон :)
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
 
  // разрешаем спящий режим
  sleep_enable();
 
  // разрешаем прерывания
  sei();
  
  // собственно засыпаем
  sleep_cpu();              
}
 
void m_wake_up ()
{
  // запрещаем режим сна
  sleep_disable();
  
  // запрещаем прерывания
  cli();
}
recer1q1
Offline
Зарегистрирован: 24.11.2018

Прошу прощения что не обрамил второй код

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

1. Dht не очень хорошие датчики
2. Не очень понятно смысл засыпать по кнопке - сделайте тупо при включении получение всех данных и вывод на дисплей, потом выключить устройство.
ЗЫ. Или я не понял задачи (

recer1q1
Offline
Зарегистрирован: 24.11.2018

1. Просто такой только есть,

Хочу реализовать, что бы включалась система, выводила даные, затем чере 10 секунд переходила в енергосбережение. Главная задача что бы затем по нажатию кноки система снова просыпалась. Т.к. Уже пробовал много раз, после перехода в спящий режим система не может из него выйти.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

recer1q1, а почему Вы не пытаетесь написать скетч что бы Ардуина генерировала энергию. Ведь здорово было бы отрубилась электроэнерия , включил Ардуину и энергии навалом. Дикость. Так и у Вас Дикость в режим энергосбережение может входить только процессор. А все остальное будет жрать энергию как не в себя. 

b707
Offline
Зарегистрирован: 26.05.2017

recer1q1 - что-то я в вашем первом коде вообще не вижу попыток добавить энергосбережение. Тем, кто не пытается решить задачу, у нас тут помогать не принято. Может вы думаете, что прилетит волшебник и обьединит два ваши скетча? Не надейтесь.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

recer1q1

Уже 100500 раз писали, что энергосбережение и ардуина вещи несовместимые. Надо либо использовать отдельный "голый" микроконтроллер с минимум обвязки, либо убирать с платы линейный стабилизатор, светодиоды, USB-UART мост.

recer1q1
Offline
Зарегистрирован: 24.11.2018

Так я попытался обьеденить, в режим енергосбережения заходит, а из  него не выходит, вот код:

#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT11

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
int val; // змінна для зберігання значення датчика температури
int tempPin = 0; // аналоговий вхід 0 для підключення датчика температури

int vall;
#include <SoftwareSerial.h>   
SoftwareSerial mySerial(10, 11);

DHT dht(DHTPIN, DHTTYPE);

const int LED1 = 6; // Контакт 8 для підключення світлодіода
const int DTH = 8; // Контакт 8 для підключення датчика
const int BT = 9; // Контакт 9 для підключення блютуз
const int BUTTON = 2; // Контакт 2 для підключення кнопки
boolean lastButton = LOW; // Змінна для збереження попереднього стану кнопки
boolean currentButton = LOW; // Змінна для збереження поточного стану кнопки
boolean ledOn = false; // Поточний стан світлодіода
// (Включений / виключений)

#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define BUTTON_PIN 3
#define LED_PIN 5
volatile bool flag = false;
void m_sleep() {

  // отключаем АЦП
  ADCSRA = 0;  

  // отключаем всю периферию
  power_all_disable ();

  // устанавливаем режим сна - самый глубокий, здоровый сон :)
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  

  // разрешаем спящий режим
  sleep_enable();

  // разрешаем прерывания
  sei();
  
  // собственно засыпаем
  sleep_cpu();              
}

void m_wake_up ()
{
  // запрещаем режим сна
  sleep_disable();
  
  // запрещаем прерывания
  cli();
}

void setup()
{
  lcd.init();                     
  lcd.noBacklight();// Виключаем подсветку дисплея
  
  dht.begin();
 
  mySerial.begin(9600);
 
  pinMode (LED1, OUTPUT); // Конфігурувати контакт світлодіода як вихід
  pinMode (DTH, OUTPUT); // Конфігурувати контакт датчика як вихід
  pinMode (BT, OUTPUT); // Конфігурувати контакт блютуз як вихід
  pinMode (BUTTON, INPUT); // Конфігурувати контакт кнопки як вхід
  
  // установливаем на пине с кнопкой подтяжку к VCC
  pinMode(BUTTON_PIN, INPUT);
  digitalWrite(BUTTON_PIN, HIGH);
  
  // устанавливаем обработчик прерывания INT0
  attachInterrupt(1, m_wake_up, FALLING);
}

/*
* Функція згладжування брязкоту
* Приймає в якості аргументу попередній стан кнопки
* І видає фактичне
*/
boolean debounce (boolean last) // debounce - брязкіт
{
boolean current = digitalRead (BUTTON); // змінній current присвоюється
//значення стану кнопки (HIGH =1=кнопка натиснута, LOW=0= кнопку не
//натиснуто)
if (last!= current) // якщо змінився стан кнопки
delay (5); // чекаємо 5 мс
current = digitalRead (BUTTON); // читаємо стан кнопки
return current; // повертаємо стан кнопки
}

void loop()
{
float h = dht.readHumidity();
float t = dht.readTemperature();
  
val = analogRead(tempPin); // отримуємо аналогове значення і присвоюємо його змінній 
float mv = ( val/1023.0)*4500; // перетворення цифрового сигналу (val ) в температуру
float cel = mv/10;
float farh = (cel*9)/5 + 32; // перетворення цифрового сигналу (val ) в температуру

  
  if (mySerial.available())
  {
    vall = mySerial.read();
    if (vall == 't')
    {

      mySerial.print(t);
    }
    if ( vall == 'h')
    {
      mySerial.print(h);
    }
  }
  
  currentButton = debounce (lastButton);
  if (lastButton == LOW && currentButton == HIGH) // Якщо натискання
  {
   ledOn = !ledOn; // Інвертувати значення стану світлодіода
  }
  lastButton = currentButton;
  digitalWrite (DTH, ledOn); // Змінити статус датчика
  digitalWrite (BT, ledOn); // Змінити статус стану блютуз
  digitalWrite (LED1, ledOn); // Змінити статус стану світлодіоду

if (ledOn == HIGH){
  lcd.setCursor(0, 0);
  lcd.print("H = ");
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0, 1);
  lcd.print("T = ");
  lcd.print(t);
  lcd.print(" *");
  lcd.backlight();
 
  _delay_ms(10000);
  digitalWrite (LED1, LOW);
  m_sleep();
}
else {
lcd.noBacklight();
lcd.clear();
}

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Самое простое и надежное решение в данной ситуации:

recer1q1
Offline
Зарегистрирован: 24.11.2018

Очень остроумные шутки у всех тут, но я обратился за помощью. 
Прошу помочь, так как стоит задача ложить систему в этот режим енергосбережения, а вывести из него не удается. Прошу подправить код, что бы по кнопке система просыпалась.
СПАСИБО!

sadman41
Offline
Зарегистрирован: 19.10.2016

Мы тебе и помогаем! Потому што ты сейчас голову себе об это сломаешь, а батарейка как садилась, так и будет садится. Думаешь, что ты первый с такой идеей тут? 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Ты уже выполнил рекомендации из сообщения #6 ? Иначе всё это энергосбережение бессмысленно.

recer1q1
Offline
Зарегистрирован: 24.11.2018

Понимаю что это может и бессмыслено, даже если ток упадет на 1 микроампер. Это существенно играет роль в исследовании. И именно по этой причине у меня такой тупоголовий скетч. (просто я новичок). Благодаря второму скетчу ток падает на 2 микроампера, по нажатию на кнопку система просыпается. Тот скетч который я переделал ложит систему спать, ток падает на 1-2 микроампера, но уже не просыпается. Мне нужно что бы аналогично второму скетчу система просыпалась. Прошу помочь с этим. 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
sadman41
Offline
Зарегистрирован: 19.10.2016

Вот тут есть Example: https://playground.arduino.cc/Learning/arduinoSleepCode

Берете его, пробуете. Если всё ок, начинаете вычислять ошибку в своей реализации. Например, ей может быть неправильно указанный режим attachInterrupt()

bwn
Offline
Зарегистрирован: 25.08.2014

recer1q1 пишет:

Тот скетч который я переделал ложит систему спать.

Господи, оффтоп конечно, но укладывает, укладывает!!!!! Сорри, не сдержался.((((

Als
Offline
Зарегистрирован: 17.05.2015
Анекдот:
- Что стало причиной вашего расставания? 
- Ложь. 
- А именно? 
- Я его спросила: "Тебе сахар в кофе положить?", а он ответил: "Ложь".
bwn
Offline
Зарегистрирован: 25.08.2014

По пунктам: рожают как и всех, шарят вполне, поп-ть за счастье, а ложить тебя будут, вернее мужеложить. Дурень, необразованный.

b707
Offline
Зарегистрирован: 26.05.2017

думаю, на этом мы с ТС распрощаемся.

Последнее сообщение предлагаю удалить, автора в бан...

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

думаю, на этом мы с ТС распрощаемся.

Последнее сообщение предлагаю удалить, автора в бан...

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