#include <SPI.h>
#include <Adafruit_GFX.h>
#include <MD_Parola.h>
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CS_PIN 21
#define ROTARY_CLK 2
#define ROTARY_DT 4
#define ROTARY_SW 5
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
char myChar[10];
float encoderPos = 0.005;
int lastEncoderPos = 0;
bool buttonState = HIGH;
bool lastButtonState = HIGH;
float palegg = 0;
float mva = 1.25;
String prisomrade = "";
float NO1f = 0;
float NO2f = 0.01;
float NO3f = 0.02;
float NO4f = 0.03;
float NO5f = 0.04;
void setup() {
Serial.begin(115200);
// Intialize the object
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15)
myDisplay.setIntensity(8);
// Clear the display
myDisplay.displayClear();
myDisplay.displayScroll("Online!", PA_LEFT, PA_PRINT, 50);
myDisplay.displayAnimate();
delay(2000);
myDisplay.displayClear();
pinMode(ROTARY_CLK, INPUT);
pinMode(ROTARY_DT, INPUT);
pinMode(ROTARY_SW, INPUT_PULLUP);
}
void displayOmrade(){
if(prisomrade == "NO1"){
myDisplay.displayScroll("NO1 Oslo/Oest-Norge", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
else if(prisomrade == "NO2"){
myDisplay.displayScroll("NO2 Kristiansand/Soer-Norge", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
else if(prisomrade == "NO3"){
myDisplay.displayScroll("NO3 Trondheim/Midt-Norge", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
else if(prisomrade == "NO4"){
myDisplay.displayScroll("NO4 Tromsoe/Nord-Norge", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
else if(prisomrade == "NO5"){
myDisplay.displayScroll("NNO5 Bergen/Vest-Norge", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
}
void updateDisplay(float value, char *result, int decimalPlaces) {
dtostrf(value, 0, decimalPlaces, result);
strcat(result, ",-");
myDisplay.displayClear(); // Clear the display
myDisplay.displayText(result, PA_CENTER, 80, 1000, PA_NO_EFFECT, PA_NO_EFFECT);
myDisplay.displayAnimate();
}
void startup(){
prisomradefunksjon();
myDisplay.displayScroll("Valgt område:", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
displayOmrade();
myDisplay.displayScroll("Still inn paalegg per kWh i NOK før MVA:", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
avgift();
myDisplay.displayScroll("Paalegg per kWh:", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
updateDisplay(palegg, myChar, 2);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
myDisplay.displayScroll("Henter data fra API....", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
}
void avgift(){
encoderPos = 0;
updateDisplay(encoderPos, myChar, 2);
while(true) {
int readingCLK = digitalRead(ROTARY_CLK);
int readingDT = digitalRead(ROTARY_DT);
int readingSW = digitalRead(ROTARY_SW);
//update screen
myDisplay.displayAnimate();
if (readingCLK != lastEncoderPos) {
if (readingDT != readingCLK) {
encoderPos = encoderPos + 0.005;
}
else if(encoderPos > 0){
encoderPos = encoderPos - 0.005;
}
// Update the display with the current encoder position
updateDisplay(encoderPos, myChar, 2);
lastEncoderPos = readingCLK;
}
if (readingSW != lastButtonState) {
if (readingSW == LOW) {
// The button is pressed
palegg = encoderPos;
Serial.print(palegg);
break;
// Add your button press action here
}
lastButtonState = readingSW;
}
}
}
bool areFloatsEqual(float a, float b, float tolerance = 0.002) {
return std::fabs(a - b) < tolerance;
}
void prisomradefunksjon(){
encoderPos = 0;
myDisplay.displayScroll("Still inn område:", PA_LEFT, PA_SCROLL_LEFT, 40);
while(true){
if (myDisplay.displayAnimate()) {
break;
}
}
while(true) {
int readingCLK = digitalRead(ROTARY_CLK);
int readingDT = digitalRead(ROTARY_DT);
int readingSW = digitalRead(ROTARY_SW);
//update screen
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
if (readingCLK != lastEncoderPos) {
if (readingDT != readingCLK) {
encoderPos = encoderPos + 0.005;
}
else if(encoderPos >= 0){
encoderPos = encoderPos - 0.005;
}
Serial.println(encoderPos, 3);
myDisplay.displayScroll("NO1 Oslo/Oest-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO1";
//encoderPos til Områder
if (areFloatsEqual(encoderPos, NO1f)) {
myDisplay.displayScroll("NO1 Oslo/Oest-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO1";
} else if (areFloatsEqual(encoderPos, NO2f)) {
myDisplay.displayScroll("NO2 Kristiansand/Soer-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO2";
} else if (areFloatsEqual(encoderPos, NO3f)) {
myDisplay.displayScroll("NO3 Trondheim/Midt-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO3";
} else if (areFloatsEqual(encoderPos, NO4f)) {
myDisplay.displayScroll("NO4 Tromsoe/Nord-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO4";
} else if (areFloatsEqual(encoderPos, NO5f)) {
myDisplay.displayScroll("NO5 Bergen/Vest-Norge", PA_LEFT, PA_SCROLL_LEFT, 20);
prisomrade = "NO5";
} else if (encoderPos > 0.04) {
encoderPos = 0.035;
}
else if (encoderPos < 0.00) {
encoderPos = 0;
}
Serial.println(encoderPos, 3);
// Update the display with the current encoder position
lastEncoderPos = readingCLK;
}
if (readingSW != lastButtonState) {
if (readingSW == LOW) {
// The button is pressed
break;
// Add your button press action here
}
lastButtonState = readingSW;
}
}
}
void loop() {
startup();
delay(5000);
}