Отключение OLED дисплея на PowerBank

Alex178
Offline
Зарегистрирован: 06.03.2018

Собираю потихоньку повербанк на 9 или 12 литиевых акуммов 3S3P или 3S4P (буду решать после приобретения ящика). Далее dc-dc преобразователь повышающий с 12 на 48 (250w), параллельно dc-dc понижайка на 5в для зарядки телефона. Тумблер включения и кнопка для пробуждения дисплея или всей ардуины. Далее хочу добавить ардуину для мониторинга заряда акуммов (два резистора, делитель), для мониторинга выходного напряжения ina226 (можно еще добавить выходной ток, но незнаю насколько ina226 будет прожорливой) , термистор для мониторинга температуры на преобразователе, и все выводить на OLED SH1106 или SSD1306 (SH1106 предпочтительнее). Нужна помощь с куском скетча или мини скетч, который при включении повербанка (всей системы) тумблером включает дисплей на 20 сек потом тушит, при нажатии на кнопку рядом с дисплеем  включает дисплей на 20 сек, потом тушит. Я так понимаю delay не проканает, так как тормозит выполнение вычислений с датчиков. Пробовал кидать vcc дисплея на пин мк, и включать дисплей как светодиод, не помогло. Повербанк собираю для шашлычного сезона, запитать акустику (40w) или акустику (60w), можно будет и для ноута его юзать. Буду благодарен за помощь. Ну или у кого советы будут, как лучше реализовать и критику тоже принимаю.

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

А где скетч как пытались сделать ?

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

Alex178
Offline
Зарегистрирован: 06.03.2018

andycat пишет:

А где скетч как пытались сделать ?

Спасибо за ответ, неравнодушный человек. Я новичок. Умею только копипастить нужные куски из скетча если по честноку.  В школе учил басик и паскаль, поэтому представляю, что такое прерывание. Скетч, пока в разработке. Затычка только в библиотеке Ina226(он не такой распространенный как INA219). Получил из Китая SH1106 он мне болше по душе, так как 1,3" кошернее смотрится чем 0,96". Графо библы выжирают память очень сильно, для SSD1306 перепробовал кучу: Adafruit, u8glib, oledI2C, SSD1306Ascii, SSD1306 Lexus2k. Оптимальными оказались u8glib, и SSD1306 Lexus2k так как подходят и для SH1106.  Библиотека Лексуса отлично выключает дисплей, кастомные шрифты. Проблема в другом. Есть стенд кнопка и дисплей. Нажал на кнопку, дисплей ON, на 20 сек, потом OFF, а вычисления идут в режиме офф дисплея, или полностью ардуину лучше оффать?. Как этот кусочек реализовать.

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

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

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

Даже наверное начните с кнопки и светодиода чтоб горели по нужной логике

Alex178
Offline
Зарегистрирован: 06.03.2018

andycat пишет:
Даже наверное начните с кнопки и светодиода чтоб горели по нужной логике

шеф, это пройдено. При нажатии кнопки светодиод горит, но тормозит начало вычислений с датчиков. Буду выкладывать фото кухни по мере сборки  программинга.

5N62V
Offline
Зарегистрирован: 25.02.2016

Alex178 пишет:

 Буду выкладывать фото кухни по мере сборки  программинга.

Че-та я упустил, нафига нам фото Вашей кухни? Программинг на кухне собираете, что ли?

Alex178
Offline
Зарегистрирован: 06.03.2018

Заменил делитель напряжения на Ina219 для контроля напряжения на акб. Вопрос как сделать так, чтобы при включении повербанка дисплей горел 20 сек потом тух, а при нажатии на кнопку (допустим 6 выход ардуины) дисплей он - на 20 сек. Комманды для дисплея ssd1306_displayOff / ssd1306_displayOn. Код:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <INA219.h>
#include <INA226.h>
#include "ssd1306.h"
#include "bat100.h"
#include "bat80.h"
#include "bat60.h"
#include "bat40.h"
#include "bat20.h"
#include "tutorial.h"
#include "Tahoma10x14.h"

INA219 Ina219;
INA226_Class Ina226;
#define ONE_WIRE_BUS 7

float Ubat = 0;
float Udcdc = 0;
char UdcdcOut[5];
float Tempdcdc =0;
char TempdcdcOut[5];
uint8_t devicesFound = 0;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
 Ina219.begin();

 devicesFound = Ina226.begin(1,100000);                                      
 Ina226.setAveraging(4);                                                     
 Ina226.setBusConversion(7);                                                 
 Ina226.setShuntConversion(7);                                               
 Ina226.setMode(INA_MODE_CONTINUOUS_BOTH);   

 sensors.begin();
   
 sh1106_128x64_i2c_init();
 ssd1306_fillScreen(0x00);
 ssd1306_setFixedFont(Tahoma10x14);   

}

void loop()
{
  ssd1306_drawBitmap(0, 0, 31, 64, tutorial);
 
  Ubat = Ina219.busVoltage();

   if(Ubat>=11.8)      {
          ssd1306_drawBitmap(94, 0, 128, 64, bat100);
      }
      
   if(Ubat>=10.9 && Ubat<11.8)  {
          ssd1306_drawBitmap(94, 0, 128, 64, bat80);
      }
   if(Ubat>=10.0 && Ubat<10.9)  {
          ssd1306_drawBitmap(94, 0, 128, 64, bat60);
      }   
   if(Ubat>=9.1 && Ubat<10.0)  {
          ssd1306_drawBitmap(94, 0, 128, 64, bat40);
      }      
   if(Ubat<9.1)  {
          ssd1306_drawBitmap(94, 0, 128, 64, bat20);
      }      

   Udcdc = Ina226.getBusMilliVolts();
   Udcdc = Udcdc /1000.0;  
   dtostrf(Udcdc, 5, 2, UdcdcOut);   
  ssd1306_printFixed (36, 8, UdcdcOut, STYLE_NORMAL);

   sensors.requestTemperatures();
   Tempdcdc = (sensors.getTempCByIndex(0));
   dtostrf(Tempdcdc, 5, 2, TempdcdcOut);   
  ssd1306_printFixed (36, 47, TempdcdcOut, STYLE_NORMAL);
  delay(50);
};

 

И фото кухни http://uploads.ru/LERhC.jpg