#include "Arduino.h"
#include "OneButton.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <string.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO_EVERY)
// Example for Arduino UNO with input button on pin 2 and builtin LED on pin 13
#define PIN_INPUT1 2
#define PIN_INPUT2 3
#define PIN_INPUT3 4
#define PIN_LED 13
#elif defined(ESP8266)
// Example for NodeMCU with input button using FLASH button on D3 and using the led on -12 module (D4).
// This LED is lighting on output level LOW.
#define PIN_INPUT1 2
#define PIN_INPUT2 3
#define PIN_INPUT3 4
#define PIN_LED D4
#elif defined(ESP32)
// Example pin assignments for a ESP32 board
// Some boards have a BOOT switch using GPIO 0.
#define PIN_INPUT 0
// Attach a LED using GPIO 25 and VCC. The LED is on when output level is LOW.
#define PIN_LED 25
#endif
OneButton button1(PIN_INPUT1, true);
OneButton button2(PIN_INPUT2, true);
OneButton button3(PIN_INPUT3, true);
//network settings declaration
const int displayoffset_network=42;
const int gap_line=15;
byte screen[4]={1,0,0,0};
const String network_prefix[3]={"IP Adr:","Gate: ","Subnet:"};
byte network_settings[3][4] = {
{192, 168, 1, 1}, //ip
{192, 168, 1, 254}, //gate
{255, 255, 255, 0}, //subnet
};
int currentField = 1; // Pole aktualnie edytowane (1 - IP, 2 - Brama, 3 - Maska)
int currentDigit = 1; // Aktualna cyfra w polu edycji
//end network settings declaration
int pulsesperkwh=1000;
int page=0;
void clearline(int poziom,int szerokosc)
{
for (int y=poziom; y<=(poziom+szerokosc); y++)
{
for (int x=0; x<127; x++)
{
display.drawPixel(x, y, BLACK);
}
}
}
void footer(int page)
{
clearline(50,63-50);
display.writeFastHLine(0,50,127,WHITE);
display.writeFastHLine(0,63,127,WHITE);
display.writeFastVLine(0,50,13,WHITE);
display.writeFastVLine(20,50,13,WHITE);
display.writeFastVLine(107,50,13,WHITE);
display.writeFastVLine(127,50,13,WHITE);
switch (page) {
case 1:
display.setCursor(3,51);
//display.print("down");
display.setCursor(40,53);
display.print("select");
display.setCursor(92,51);
// display.print("up");
break;
case 2:
display.setCursor(8,53);
display.print("+");
display.setCursor(38,53);
display.print("next/save");
display.setCursor(115,53);
display.print("-");
break;
case 3:
break;
}
}
void underline() //
{
int16_t x1,y1;
uint16_t w1,w2,h;
String chars=network_prefix[currentField-1];
for(int c=1;c<currentDigit;c++)
{
chars+=(String)network_settings[currentField-1][c-1];
}
display.getTextBounds(chars,0,0,&x1,&y1,&w1,&h); //w1 - poczatek linii, h - wysokosc czcionki
display.getTextBounds((String)network_settings[currentField-1][currentDigit-1],0,0,&x1,&y1,&w2,&h); //w2 - dlogosc znaku
display.writeFastHLine(w1+(6*(currentDigit-1)),((currentField-1)*gap_line+h),w2,WHITE);
}
void network_set()
{
for(int i=0;i<3;i++)
{
display.setCursor(0,(i*gap_line));
display.print(network_prefix[i]);
display.print(network_settings[i][0]);
display.print(".");
display.print(network_settings[i][1]);
display.print(".");
display.print(network_settings[i][2]);
display.print(".");
display.print(network_settings[i][3]);
}
underline();
display.display();
}
byte incrementDigit(byte digit)
{
digit++;
if (digit > 255) {
digit = 0;
}
return digit;
}
byte decrementDigit(byte digit)
{
digit--;
if (digit < 0) {
digit = 255;
}
return digit;
}
//button 1 functions
void DoubleClick1()
{
//Serial.println("Button1:DoubleClick");
} // doubleClick
void Click1()
{
switch (screen[0]) {
case 1:
switch (screen[1]) {
case 0:
screen[0]=4;
display.clearDisplay();
break;
case 1:
network_settings[currentField-1][currentDigit - 1]=decrementDigit( network_settings[currentField-1][currentDigit - 1]);
clearline((currentField-1)*gap_line,8);
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 0:
screen[0]--;
display.clearDisplay();
break;
case 1:
pulsesperkwh--;
if(pulsesperkwh<1)pulsesperkwh=10000;
clearline(0*gap_line,8);
break;
default:
break;
}
break;
case 3:
screen[0]--;
display.clearDisplay();
break;
case 4:
screen[0]--;
display.clearDisplay();
break;
}
} // Click
void MultiClick1()
{
//Serial.println("Button1:MultiClick");
} // Multi Click
void LongPressStart1()
{
//Serial.println("Button1:LongPressStart");
} // Long Click
void DuringLongPress1()
{
switch (screen[0]) {
case 1:
switch (screen[1]) {
case 1:
network_settings[currentField-1][currentDigit - 1]=decrementDigit( network_settings[currentField-1][currentDigit - 1]);
clearline((currentField-1)*gap_line,8);
clearline(0*gap_line,8);
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 0:
screen[0]--;
display.clearDisplay();
break;
case 1:
pulsesperkwh=pulsesperkwh-50;
if(pulsesperkwh<1)pulsesperkwh=10000;
clearline(0*gap_line,8);
break;
default:
break;
}
break;
case 3:
break;
}
}
void LongPressStop1()
{
// Serial.println("Button1:LongPressStop");
}
//end off button 1 functions
//button 2 functions
void DoubleClick2()
{
} // doubleClick
void Click2()
{
switch (screen[0]) { //obsluga OLED
case 1:
if(screen[1]==0){
screen[1]=1;
display.clearDisplay();
currentField = 1;
currentDigit = 0;
}
switch (screen[1]) {
case 1:
currentDigit++;
clearline((currentField-1)*gap_line,8);
if (currentDigit > 4) {
currentDigit = 1;
currentField++;
if (currentField > 3) {
currentField = 1;
}
}
break;
default:
break;
}
break;
case 2:
if(screen[1]==0){
screen[1]=1;
display.clearDisplay();
}
break;
case 3:
break;
}
} // Click
void MultiClick2()
{
//Serial.println("Button2:MultiClick");
} // Multi Click
void LongPressStart2()
{
switch (screen[0]) {
case 1:
switch (screen[1]) {
case 1:
screen[1]=0;
display.clearDisplay();
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 1:
screen[1]=0;
display.clearDisplay();
break;
default:
break;
}
break;
case 3:
break;
}
} // Long Click
void DuringLongPress2()
{
//Serial.println("Button2:DuringLongPress");
}
void LongPressStop2()
{
//Serial.println("Button2:LongPressStop");
}
//end off button 1 functions
//button 1 functions
void DoubleClick3()
{
//Serial.println("Button3:DoubleClick");
} // doubleClick
void Click3()
{
switch (screen[0]) {
case 1:
switch (screen[1]) {
case 0:
screen[0]++;
display.clearDisplay();
break;
case 1:
network_settings[currentField-1][currentDigit - 1]=incrementDigit( network_settings[currentField-1][currentDigit - 1]);
clearline((currentField-1)*gap_line,8);
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 0:
screen[0]++;
display.clearDisplay();
break;
case 1:
pulsesperkwh++;
if(pulsesperkwh>10000)pulsesperkwh=1;
clearline(0*gap_line,8);
break;
default:
break;
}
break;
case 3:
screen[0]++;
display.clearDisplay();
break;
case 4:
screen[0]=1;
display.clearDisplay();
break;
}
} // Click
void MultiClick3()
{
// Serial.println("Button3:MultiClick");
} // Multi Click
void LongPressStart3()
{
// Serial.println("Button3:LongPressStart");
} // Long Click
void DuringLongPress3()
{
switch (screen[0]) {
case 1:
switch (screen[1]) {
case 1:
network_settings[currentField-1][currentDigit - 1]=incrementDigit( network_settings[currentField-1][currentDigit - 1]);
clearline((currentField-1)*gap_line,8);
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 0:
screen[0]++;
display.clearDisplay();
break;
case 1:
pulsesperkwh=pulsesperkwh+50;
if(pulsesperkwh>10000)pulsesperkwh=1;
clearline(0*gap_line,8);
break;
default:
break;
}
case 3:
break;
}
}
void LongPressStop3()
{
// Serial.println("Button3:LongPressStop");
}
// End of button 1 functions
void setup()
{
//Serial.begin(115200);
//Serial.println("One Button Example with polling.");
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.display();
//button1.attachDoubleClick(DoubleClick1);
button1.attachClick(Click1);
//button1.attachMultiClick(MultiClick1);
//button1.attachLongPressStart(LongPressStart1);
button1.attachDuringLongPress(DuringLongPress1);
//button1.attachLongPressStop(LongPressStop1);
//button2.attachDoubleClick(DoubleClick2);
button2.attachClick(Click2);
//button2.attachMultiClick(MultiClick2);
button2.attachLongPressStart(LongPressStart2);
//button2.attachDuringLongPress(DuringLongPress2);
//button2.attachLongPressStop(LongPressStop2);
//button3.attachDoubleClick(DoubleClick3);
button3.attachClick(Click3);
//button3.attachMultiClick(MultiClick3);
//button3.attachLongPressStart(LongPressStart3);
button3.attachDuringLongPress(DuringLongPress3);
//button3.attachLongPressStop(LongPressStop3);
}
void loop()
{
// keep watching the push button:
button1.tick();
button2.tick();
button3.tick();
switch (screen[0]) { //obsluga OLED
case 1:
switch (screen[1]) {
case 0:
footer(screen[0]);
display.setCursor(0,0);
display.print("> Ustawienia IP");
display.setCursor(0,10);
display.print("Dane miernika");
display.setCursor(0,20);
display.print("Data i czas");
display.setCursor(0,30);
display.print("Informacje");
display.display();
break;
case 1:
network_set();
break;
default:
break;
}
break;
case 2:
switch (screen[1]) {
case 0:
footer(screen[0]);
display.setCursor(0,0);
display.print("Ustawienia IP");
display.setCursor(0,10);
display.print("> Dane miernika");
display.setCursor(0,20);
display.print("Data i czas");
display.setCursor(0,30);
display.print("Informacje");
display.display();
break;
case 1:
footer(screen[0]);
display.setCursor(0,0);
display.print("Pulses per kWh:");
display.print(pulsesperkwh);
display.display();
break;
default:
break;
}
break;
case 3:
display.setCursor(0,0);
display.print("Ustawienia IP");
display.setCursor(0,10);
display.print("Dane miernika");
display.setCursor(0,20);
display.print("> Data i czas");
display.setCursor(0,30);
display.print("Informacje");
display.display();
break;
case 4:
display.setCursor(0,0);
display.print("Ustawienia IP");
display.setCursor(0,10);
display.print("Dane miernika");
display.setCursor(0,20);
display.print("Data i czas");
display.setCursor(0,30);
display.print("> Informacje");
display.display();
break;
default:
break;
}
}