Официальный сайт компании Arduino по адресу arduino.cc
Энергосбережение ардуино (МЕТЕОСТАНЦИЯ), помогите новичку
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 24/11/2018 - 19:42
Всем добрый день, задача заводить метеостанцию по кноке в режим енергосбережения, и по кнопке выводить ее из нее, может и глупый вопрос, но уже в течении несколько дней не могу побороть, в режим енергосбережения заводить а из него выходить не хочет. Нашел хороший рабочий скетч но к своей системе применить не могу, прошу помощи как сопоставить эти два скетча в один что бы всё работало.
КОД МОЕЙ МЕТЕОСТАНЦИИ
#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(); }
Прошу прощения что не обрамил второй код
1. Dht не очень хорошие датчики
2. Не очень понятно смысл засыпать по кнопке - сделайте тупо при включении получение всех данных и вывод на дисплей, потом выключить устройство.
ЗЫ. Или я не понял задачи (
1. Просто такой только есть,
Хочу реализовать, что бы включалась система, выводила даные, затем чере 10 секунд переходила в енергосбережение. Главная задача что бы затем по нажатию кноки система снова просыпалась. Т.к. Уже пробовал много раз, после перехода в спящий режим система не может из него выйти.
recer1q1, а почему Вы не пытаетесь написать скетч что бы Ардуина генерировала энергию. Ведь здорово было бы отрубилась электроэнерия , включил Ардуину и энергии навалом. Дикость. Так и у Вас Дикость в режим энергосбережение может входить только процессор. А все остальное будет жрать энергию как не в себя.
recer1q1 - что-то я в вашем первом коде вообще не вижу попыток добавить энергосбережение. Тем, кто не пытается решить задачу, у нас тут помогать не принято. Может вы думаете, что прилетит волшебник и обьединит два ваши скетча? Не надейтесь.
recer1q1
Уже 100500 раз писали, что энергосбережение и ардуина вещи несовместимые. Надо либо использовать отдельный "голый" микроконтроллер с минимум обвязки, либо убирать с платы линейный стабилизатор, светодиоды, USB-UART мост.
Так я попытался обьеденить, в режим енергосбережения заходит, а из него не выходит, вот код:
Самое простое и надежное решение в данной ситуации:
Очень остроумные шутки у всех тут, но я обратился за помощью.
Прошу помочь, так как стоит задача ложить систему в этот режим енергосбережения, а вывести из него не удается. Прошу подправить код, что бы по кнопке система просыпалась.
СПАСИБО!
Мы тебе и помогаем! Потому што ты сейчас голову себе об это сломаешь, а батарейка как садилась, так и будет садится. Думаешь, что ты первый с такой идеей тут?
Ты уже выполнил рекомендации из сообщения #6 ? Иначе всё это энергосбережение бессмысленно.
Понимаю что это может и бессмыслено, даже если ток упадет на 1 микроампер. Это существенно играет роль в исследовании. И именно по этой причине у меня такой тупоголовий скетч. (просто я новичок). Благодаря второму скетчу ток падает на 2 микроампера, по нажатию на кнопку система просыпается. Тот скетч который я переделал ложит систему спать, ток падает на 1-2 микроампера, но уже не просыпается. Мне нужно что бы аналогично второму скетчу система просыпалась. Прошу помочь с этим.
http://www.gammon.com.au/power
Вот тут есть Example: https://playground.arduino.cc/Learning/arduinoSleepCode
Берете его, пробуете. Если всё ок, начинаете вычислять ошибку в своей реализации. Например, ей может быть неправильно указанный режим attachInterrupt()
Тот скетч который я переделал ложит систему спать.
Господи, оффтоп конечно, но укладывает, укладывает!!!!! Сорри, не сдержался.((((
По пунктам: рожают как и всех, шарят вполне, поп-ть за счастье, а ложить тебя будут, вернее мужеложить. Дурень, необразованный.
думаю, на этом мы с ТС распрощаемся.
Последнее сообщение предлагаю удалить, автора в бан...
думаю, на этом мы с ТС распрощаемся.
Последнее сообщение предлагаю удалить, автора в бан...
По мне, так пускай резвиться, я на дурачков и собачек тявкающих не обижаюсь.