Люксметр BH1750, ЖКИ 5110, Нано 328, 5В, 16 МГц: проверьте, пожалуйста, скетч на ошибки!

runaway
Offline
Зарегистрирован: 25.09.2012

Сам модуль BH1750 рабочий, исправно шлёт адекватные данные в Монитор. Но я хочу питать свой люксметр от батареек, а данные выводить на ЖКИ 5110. Попытался подключить последний "по образу и подобию" из рабочего скетча, но пока ничего не получается - наблюдаю только, как после загрузки на экране появляется весь растр рабочего поля ЖКИ, причём очень бледный, он еле виден, и только под определённым углом. ЖКИ подключен как написано в рабочем скетче, проверил несколько раз. Пробовал вставить в свой скетч строчки, которые регулируют контрастность, но это ни к чему не привело - всё осталось без изменений (после загрузки появляется и висит еле видимый, равномерно засвеченный растр рабочего поля). Компилируется без замечаний (Нано 328, 5В, 16 МГЦ). Пребываю в тупике...

#include <Wire.h>
#include <BH1750.h>
#include <LCD5110_Graph.h>

BH1750 lightMeter;
LCD5110 myGLCD(3, 4, 5, 6, 7);

extern unsigned char SmallFont[];  
extern unsigned char BigNumbers[];
float lux;

void setup(){
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
  
Wire.begin();
lightMeter.begin(BH1750::ONE_TIME_HIGH_RES_MODE);
}

void loop(){
float lux = lightMeter.readLightLevel();

myGLCD.clrScr(); 
myGLCD.setFont(BigNumbers);
myGLCD.printNumF(lux, 1, LEFT, 35);  
delay(1000);
}
b707
Offline
Зарегистрирован: 26.05.2017

люксометр то здесь причем? Начните с того, что возьмите пример из библиотеки экрана и добейтесь. чтоб на экран выводился текст. Когда заработает - тогда будете люксометр добавлять

runaway
Offline
Зарегистрирован: 25.09.2012

Да, наверное так и буду действовать. Хотел сделать ход конём - по рабочему скетчу всё казалось вполне очевидным... Но вообще есть рабочий прибор, барограф, показания которого выводятся на 5110. Есть его рабочий скетч, уже "подчищенный" под себя, под свой вкус (расположение данных на экране, шрифты, коррекция данных, и т.п.). Вот этот скетч я и использую в качестве "примера из библиотеки", как вы говорите. Т.е. по существу задача сводится к объединению двух скетчей в один, и удалению всего лишнего (того, что относится к барографу). Или наоборот - в библиотечный пример люксметра я вставляю куски из барографа, относящиеся к 5110. Но не получается... Попробую ещё с библиотечными примерами 5110... 

runaway
Offline
Зарегистрирован: 25.09.2012

Я думал, что может вы увидите в моём "скетче" ЯВНЫЙ косяк...

runaway
Offline
Зарегистрирован: 25.09.2012

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

// LCD5110_Sleep_Mode 
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a demo of sleep mode.
//
// This program requires a Nokia 5110 LCD module.
//
// It is assumed that the LCD module is connected to
// the following pins using a levelshifter to get the
// correct voltage to the module.
//      SCK  - Pin 8
//      MOSI - Pin 9
//      DC   - Pin 10
//      RST  - Pin 11
//      CS   - Pin 12
//
#include <LCD5110_Graph.h>

LCD5110 myGLCD(3,4,5,6,7);

extern uint8_t SmallFont[];
extern uint8_t MediumNumbers[];

void setup()
{
  myGLCD.InitLCD();
}

void loop()
{
  myGLCD.setFont(SmallFont);
  myGLCD.clrScr();
  myGLCD.print("Entering", CENTER, 0);
  myGLCD.print("Sleep Mode", CENTER, 8);
  myGLCD.print("in", CENTER, 16);
  myGLCD.print("Seconds", CENTER, 40);
  myGLCD.update();

  myGLCD.setFont(MediumNumbers);
  for (int s=10; s>=0; s--)
  {
    myGLCD.printNumI(s, CENTER, 24, 2, '0');
    myGLCD.update();
    delay(1000);
  }
  
  myGLCD.enableSleep();
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("Awake again!", CENTER, 0);
  myGLCD.print("Text has been", CENTER, 16);
  myGLCD.print("changed while", CENTER, 24);
  myGLCD.print("in Sleep Mode.", CENTER, 32);
  delay(5000);
  myGLCD.disableSleep();
  delay(5000);
}

 

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

а если временно закомментировать обращение к люксометру в луп - экран не оживет, случаем?

runaway
Offline
Зарегистрирован: 25.09.2012

Упс... Добавил 

myGLCD.update();
 
И всё заработало! Хех... А тогда почему этой строчки нет в рабочем скетче, но там всё прекрасно работает??? 
Большое спасибо за помощь!!! Хорошо, всё-таки, когда есть к кому обратиться! )))) +500
runaway
Offline
Зарегистрирован: 25.09.2012

Вот рабочий вариант скетча, может, кому-то знадобится:
 

#include <Wire.h>
#include <BH1750.h>
#include <LCD5110_Graph.h>

BH1750 lightMeter;
LCD5110 myGLCD(3, 4, 5, 6, 7);

extern uint8_t SmallFont[];  
extern uint8_t BigNumbers[];
float lux;

void setup(){
myGLCD.InitLCD();
  
Wire.begin();
lightMeter.begin(BH1750::ONE_TIME_HIGH_RES_MODE);
}

void loop(){
float lux = lightMeter.readLightLevel();

myGLCD.setFont(BigNumbers);
myGLCD.clrScr(); 
myGLCD.printNumF(lux, 1, CENTER, 35);  
myGLCD.update();

delay(1000);
}

 

runaway
Offline
Зарегистрирован: 25.09.2012

Закрываю рукой датчик - всё тикает!!! ))))
Цифры, правда, из-за нижнего среза экрана еле выглядывают, но то уже мелочи - как раз для таких как я ЭКСПЕРТОВ! ))
Ещё раз спасибо за помощь!