mirror of https://github.com/lumapu/ahoy.git
lumapu
2 years ago
4 changed files with 294 additions and 6 deletions
@ -0,0 +1,237 @@ |
|||
#ifndef __MONOCHROME_DISPLAY__ |
|||
#define __MONOCHROME_DISPLAY__ |
|||
|
|||
#ifdef ENA_NOKIA |
|||
#include <U8g2lib.h> |
|||
#define DISP_PROGMEM U8X8_PROGMEM |
|||
#else // ENA_SSD1306
|
|||
/* esp8266 : SCL = 5, SDA = 4 */ |
|||
/* ewsp32 : SCL = 22, SDA = 21 */ |
|||
#include <Wire.h> |
|||
#include <SSD1306Wire.h> |
|||
#define DISP_PROGMEM PROGMEM |
|||
#endif |
|||
|
|||
|
|||
#include "../../utils/helper.h" |
|||
#include "../../hm/hmSystem.h" |
|||
|
|||
static uint8_t bmp_arrow[] DISP_PROGMEM = { |
|||
B00000000, B00011100, B00011100, B00001110, B00001110, B11111110, B01111111, |
|||
B01110000, B01110000, B00110000, B00111000, B00011000, B01111111, B00111111, |
|||
B00011110, B00001110, B00000110, B00000000, B00000000, B00000000, B00000000} ; |
|||
|
|||
#if defined(ENA_NOKIA) || defined(ENA_SSD1306) |
|||
template<class HMSYSTEM> |
|||
class MonochromeDisplay { |
|||
public: |
|||
#if defined(ENA_NOKIA) |
|||
MonochromeDisplay() : mDisplay(U8G2_R0,5,4,16) { |
|||
mNewPayload = false; |
|||
mExtra = 0; |
|||
} |
|||
#else // ENA_SSD1306
|
|||
MonochromeDisplay() : mDisplay(0x3c, SDA, SCL) { |
|||
mNewPayload = false; |
|||
mExtra = 0; |
|||
mRx = 50; |
|||
mUp = 1; |
|||
} |
|||
#endif |
|||
|
|||
void setup(HMSYSTEM *sys, uint32_t *utcTs) { |
|||
mSys = sys; |
|||
mUtcTs = utcTs; |
|||
#if defined(ENA_NOKIA) |
|||
mDisplay.begin(); |
|||
ShowInfoText("booting..."); |
|||
#else |
|||
mDisplay.init(); |
|||
mDisplay.flipScreenVertically(); |
|||
mDisplay.setContrast(63); |
|||
mDisplay.setBrightness(63); |
|||
|
|||
mDisplay.clear(); |
|||
mDisplay.setFont(ArialMT_Plain_24); |
|||
mDisplay.setTextAlignment(TEXT_ALIGN_CENTER_BOTH); |
|||
|
|||
mDisplay.drawString(64,22,"Starting..."); |
|||
mDisplay.display(); |
|||
mDisplay.setTextAlignment(TEXT_ALIGN_LEFT); |
|||
#endif |
|||
} |
|||
|
|||
void loop(void) { |
|||
|
|||
} |
|||
|
|||
void payloadEventListener(uint8_t cmd) { |
|||
mNewPayload = true; |
|||
} |
|||
|
|||
void tickerSecond() { |
|||
if(mNewPayload) { |
|||
mNewPayload = false; |
|||
DataScreen(); |
|||
} |
|||
} |
|||
|
|||
private: |
|||
#if defined(ENA_NOKIA) |
|||
void ShowInfoText(const char *txt) { |
|||
/* u8g2_font_open_iconic_embedded_2x_t 'D' + 'G' + 'J' */ |
|||
mDisplay.clear(); |
|||
mDisplay.firstPage(); |
|||
do { |
|||
const char *e; |
|||
const char *p = txt; |
|||
int y=10; |
|||
mDisplay.setFont(u8g2_font_5x8_tr); |
|||
while(1) { |
|||
for(e=p+1; (*e && (*e != '\n')); e++); |
|||
size_t len=e-p; |
|||
mDisplay.setCursor(2,y); |
|||
String res=((String)p).substring(0,len); |
|||
mDisplay.print(res); |
|||
if ( !*e ) |
|||
break; |
|||
p=e+1; |
|||
y+=12; |
|||
} |
|||
mDisplay.sendBuffer(); |
|||
} while( mDisplay.nextPage() ); |
|||
} |
|||
#endif |
|||
|
|||
void DataScreen(void) { |
|||
String timeStr = ah::getDateTimeStr(*mUtcTs).substring(2, 22); |
|||
IPAddress ip = WiFi.localIP(); |
|||
float totalYield = 0.000, totalYieldToday = 0.000, totalActual = 0.0; |
|||
char fmtText[32]; |
|||
int ucnt=0; |
|||
|
|||
for (uint8_t id = 0; id < mSys->getNumInverters(); id++) { |
|||
Inverter<> *iv = mSys->getInverterByPos(id); |
|||
if (NULL != iv) { |
|||
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); |
|||
uint8_t pos; |
|||
uint8_t list[] = {FLD_PAC, FLD_YT, FLD_YD}; |
|||
|
|||
if ( !iv->isProducing(*mUtcTs,rec) ) |
|||
continue; |
|||
|
|||
ucnt++; |
|||
|
|||
for (uint8_t fld = 0; fld < 3; fld++) { |
|||
pos = iv->getPosByChFld(CH0, list[fld],rec); |
|||
|
|||
if(fld == 1) |
|||
totalYield += iv->getValue(pos,rec); |
|||
if(fld == 2) |
|||
totalYieldToday += iv->getValue(pos,rec); |
|||
if(fld == 0) |
|||
totalActual += iv->getValue(pos,rec); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* u8g2_font_open_iconic_embedded_2x_t 'D' + 'G' + 'J' */ |
|||
mDisplay.clear(); |
|||
#if defined(ENA_NOKIA) |
|||
mDisplay.firstPage(); |
|||
do { |
|||
if(ucnt) { |
|||
mDisplay.drawXBMP(10,0,8,17,bmp_arrow); |
|||
mDisplay.setFont(u8g2_font_logisoso16_tr); |
|||
mDisplay.setCursor(25,16); |
|||
sprintf(fmtText,"%3.0f",totalActual); |
|||
mDisplay.print(String(fmtText)+F(" W")); |
|||
mDisplay.drawHLine(2,20,78); |
|||
mDisplay.setFont(u8g2_font_5x8_tr); |
|||
mDisplay.setCursor(5,29); |
|||
sprintf(fmtText,"%4.0f",totalYieldToday); |
|||
mDisplay.print(F("today ")+String(fmtText)+F(" Wh")); |
|||
mDisplay.setCursor(5,37); |
|||
sprintf(fmtText,"%.1f",totalYield); |
|||
mDisplay.print(F("total ")+String(fmtText)+F(" kWh")); |
|||
} |
|||
else { |
|||
mDisplay.setFont(u8g2_font_logisoso16_tr); |
|||
mDisplay.setCursor(30,30); |
|||
mDisplay.print(F("off")); |
|||
mDisplay.setFont(u8g2_font_5x8_tr); |
|||
} |
|||
if ( !(mExtra%20) ) { |
|||
mDisplay.setCursor(5,57); |
|||
mDisplay.print(ip); |
|||
} |
|||
else { |
|||
mDisplay.setCursor(0,47); |
|||
mDisplay.print(timeStr); |
|||
} |
|||
|
|||
mDisplay.sendBuffer(); |
|||
} while( mDisplay.nextPage() ); |
|||
mExtra++; |
|||
#else // ENA_SSD1306
|
|||
if(ucnt) { |
|||
mDisplay.setBrightness(63); |
|||
mDisplay.drawXbm(10,5,8,17,bmp_arrow); |
|||
mDisplay.setFont(ArialMT_Plain_24); |
|||
sprintf(fmtText,"%3.0f",totalActual); |
|||
mDisplay.drawString(25,0,String(fmtText)+F(" W")); |
|||
mDisplay.setFont(ArialMT_Plain_16); |
|||
sprintf(fmtText,"%4.0f",totalYieldToday); |
|||
mDisplay.drawString(5,22,F("today ")+String(fmtText)+F(" Wh")); |
|||
sprintf(fmtText,"%.1f",totalYield); |
|||
mDisplay.drawString(5,35,F("total ")+String(fmtText)+F(" kWh")); |
|||
mDisplay.drawLine(2,23,123,23); |
|||
} |
|||
else { |
|||
if(mUp) { |
|||
mRx += 2; |
|||
if(mRx >= 70) |
|||
mUp = 0; |
|||
} else { |
|||
mRx -= 2; |
|||
if(mRx <= 50) |
|||
mUp = 1; |
|||
} |
|||
mDisplay.setBrightness(1); |
|||
mDisplay.setFont(ArialMT_Plain_24); |
|||
mDisplay.drawString(mRx, 10, F("off")); |
|||
mDisplay.setFont(ArialMT_Plain_16); |
|||
} |
|||
if (!(mExtra % 20)) { |
|||
mDisplay.drawString(5, 49, ip.toString()); |
|||
} else { |
|||
int w = mDisplay.getStringWidth(timeStr.c_str(), timeStr.length(), 0); |
|||
if (w > 127) { |
|||
String tt=timeStr.substring(9, 17); |
|||
w=mDisplay.getStringWidth(tt.c_str(),tt.length(), 0); |
|||
mDisplay.drawString(127 - w, 49, tt); |
|||
} else |
|||
mDisplay.drawString(0, 49, timeStr); |
|||
} |
|||
|
|||
mDisplay.display(); |
|||
mExtra++; |
|||
#endif |
|||
} |
|||
|
|||
// private member variables
|
|||
#if defined(ENA_NOKIA) |
|||
U8G2_PCD8544_84X48_1_4W_HW_SPI mDisplay; |
|||
#else // ENA_SSD1306
|
|||
SSD1306Wire mDisplay; |
|||
int mRx; |
|||
char mUp; |
|||
#endif |
|||
int mExtra; |
|||
bool mNewPayload; |
|||
uint32_t *mUtcTs; |
|||
HMSYSTEM *mSys; |
|||
}; |
|||
#endif |
|||
|
|||
#endif /*__MONOCHROME_DISPLAY__*/ |
Loading…
Reference in new issue