#ifndef _MY_DRAW_H #define _MY_DRAW_H #define NOLOGO -1 #define SUN 0 #define SUN_CLOUD 1 #define CLOUD 2 #define RAIN 3 #define THUNDER 4 #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- #ifdef ARDUINO_ESP8266_WEMOS_D1MINI //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- #include #ifdef U8X8_HAVE_HW_SPI #include #endif #ifdef U8X8_HAVE_HW_I2C #include #endif #define SCROLL_Y 10 #define T_FONTSZ 18 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2); //https://github.com/olikraus/u8g2/wiki/fntlistall //https://github.com/olikraus/u8g2/wiki/setup_tutorial void drawScreenReset() { pinMode(2, OUTPUT); // Initialize the LED_BUILTIN pin as an output } void drawInit() { drawScreenReset(); u8g2.begin(); u8g2.enableUTF8Print(); } void drawWeatherSymbol(u8g2_uint_t x, u8g2_uint_t y, uint8_t symbol) { // fonts used: // u8g2_font_open_iconic_embedded_6x_t // u8g2_font_open_iconic_weather_6x_t // encoding values, see: https://github.com/olikraus/u8g2/wiki/fntgrpiconic switch(symbol) { case SUN: u8g2.setFont(u8g2_font_open_iconic_weather_6x_t); u8g2.drawGlyph(x, y, 69); break; case SUN_CLOUD: u8g2.setFont(u8g2_font_open_iconic_weather_6x_t); u8g2.drawGlyph(x, y, 65); break; case CLOUD: u8g2.setFont(u8g2_font_open_iconic_weather_6x_t); u8g2.drawGlyph(x, y, 64); break; case RAIN: u8g2.setFont(u8g2_font_open_iconic_weather_6x_t); u8g2.drawGlyph(x, y, 67); break; case THUNDER: u8g2.setFont(u8g2_font_open_iconic_embedded_6x_t); u8g2.drawGlyph(x, y, 67); break; default: break; } } void drawWeather(uint8_t symbol, float degree, float humidity) { drawWeatherSymbol(0, 48, symbol); //u8g2.setFont(u8g2_font_logisoso32_tf); u8g2.setFont(u8g2_font_logisoso18_tf ); //u8g2.setCursor(48+3, 50); if(-1 != degree) { u8g2.setCursor(60, T_FONTSZ+SCROLL_Y+9); u8g2.print((float)((int)(10*degree+0.5))/10); u8g2.print("°"); // requires enableUTF8Print() } if(-1 != humidity) { u8g2.setCursor(0, 60); u8g2.print((float)((int)(10*humidity+0.5))/10); u8g2.print("%"); // requires enableUTF8Print() } } /* Draw a string with specified pixel offset. The offset can be negative. Limitation: The monochrome font with 8 pixel per glyph */ void drawScrollString(int16_t offset, const char *s) { static char buf[36]; // should for screen with up to 256 pixel width size_t len; size_t char_offset = 0; u8g2_uint_t dx = 0; size_t visible = 0; u8g2.setDrawColor(0); // clear the scrolling area u8g2.drawBox(0, 0, u8g2.getDisplayWidth()-1, SCROLL_Y); u8g2.setDrawColor(1); // set the color for the text len = strlen(s); if ( offset < 0 ) { char_offset = (-offset)/8; dx = offset + char_offset*8; if ( char_offset >= u8g2.getDisplayWidth()/8 ) return; visible = u8g2.getDisplayWidth()/8-char_offset+1; strncpy(buf, s, visible); buf[visible] = '\0'; u8g2.setFont(u8g2_font_8x13_mf); //u8g2.drawStr(char_offset*8-dx, 62, buf); u8g2.drawStr(char_offset*8-dx, SCROLL_Y, buf); } else { char_offset = offset / 8; if ( char_offset >= len ) return; // nothing visible dx = offset - char_offset*8; visible = len - char_offset; if ( visible > u8g2.getDisplayWidth()/8+1 ) visible = u8g2.getDisplayWidth()/8+1; strncpy(buf, s+char_offset, visible); buf[visible] = '\0'; u8g2.setFont(u8g2_font_8x13_mf); u8g2.drawStr(-dx, SCROLL_Y, buf); } } void draw(const char *s, uint8_t symbol, float degree, float humidity) { int16_t offset = -(int16_t)u8g2.getDisplayWidth(); int16_t len = strlen(s); u8g2.clearBuffer(); // clear the internal memory drawWeather(symbol, degree, humidity); // draw the icon and degree only once drawScrollString(0, s); u8g2.sendBuffer(); // transfer internal memory to the display } void displaySetStatus(int state) {} //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- #elif ARDUINO_ESP8266_WEMOS_D1R1 //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- #include // Only needed for Arduino 1.6.5 and earlier #include "SSD1306.h" // alias for `#include "SSD1306Wire.h"` SSD1306 display(0x3c, 5, 4);//d1 d2 #define SCROLL_Y 10 #define T_FONTSZ 18 void drawScreenReset() { } void drawInit() { // Initialising the UI will init the display too. display.init(); display.flipScreenVertically(); } void drawWeatherSymbol(uint8_t x, uint8_t y, uint8_t symbol) {} void drawWeather(uint8_t symbol, float degree, float humidity) { display.setFont(ArialMT_Plain_24); if(-1 != degree) { char myString[8]=""; sprintf(myString,"%2.1f°",(float)((int)(10*degree+0.5))/10); display.drawString(60, T_FONTSZ-4, myString ); } if(-1 != humidity) { char myString[8]=""; sprintf(myString,"%2.0f%%",(float)((int)(10*humidity+0.5))/10); display.drawString(0,2*T_FONTSZ, myString ); } } void drawScrollString(int16_t offset, const char *s) { display.setFont(ArialMT_Plain_10); display.drawString(0, offset, s ); } void draw(const char *s, uint8_t symbol, float degree, float humidity) { display.setTextAlignment(TEXT_ALIGN_LEFT); display.clear(); drawWeather(NOLOGO, degree, humidity); drawScrollString(0, s); display.display(); } void displaySetStatus(int state) { if( 0 == state ) { display.displayOff(); } else { display.displayOn(); } } #endif // #endif //_MY_DRAW_H