#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define ledWlacz 0
#define ledWylacz 1
uint32_t caseTime,aktualnyCaseTime;
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int zarowka1 = 7;
const int zarowka2 = 6;
const int zarowka3 = 5;
const int zarowka4 = 4;
const int zarowka5 = 3;
const int zarowka6 = 2;
const int analogIn = A0;
int mVperAmp = 66;
int RawValue = 0;
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
uint32_t ostatniPomiar = 0;
uint32_t czasPomiarowy = 2;
uint32_t zapamietanyCzas = 0;
uint32_t aktualnyCzas = 0,poprzedniCzas,sekundy;
const int wylacz = 2000;
const int wlacz12 = 3000;
const int wylacz12 = 13000;
const int wlacz34 = 15000;
const int wylacz34 = 25000;
const int wlacz56 = 27000;
const int wylacz56 = 37000;
const int wlacz123456 = 39000;
const int wylacz123456 = 49000;
unsigned long resetInterval = 51000;
unsigned long startTime = 0;
bool znacznikSekundy=0;
enum StanZarowek {
WYLACZONE,
WLACZ_ZAROWKI_12,
WYLACZ_ZAROWKI_12,
WLACZ_ZAROWKI_34,
WYLACZ_ZAROWKI_34,
WLACZ_ZAROWKI_56,
WYLACZ_ZAROWKI_56,
WLACZ_ZAROWKI_123456,
WYLACZ_ZAROWKI_123456
};
StanZarowek aktualnyStan = WYLACZONE;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.begin(20, 4);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pomiar prądu i napięcia!");
startTime = millis();
pinMode(zarowka1, OUTPUT);
pinMode(zarowka2, OUTPUT);
pinMode(zarowka3, OUTPUT);
pinMode(zarowka4, OUTPUT);
pinMode(zarowka5, OUTPUT);
pinMode(zarowka6, OUTPUT);
}
void loop() {
aktualnyCzas = millis();
if(aktualnyCzas-poprzedniCzas>1000) //minelaSekunda
{
sekundy++;
poprzedniCzas=aktualnyCzas;
znacznikSekundy=1;
}
if(znacznikSekundy and sekundy%czasPomiarowy==0) pomiarPradu(); //tylko gdy jest nowa sekunda i reszta dzielenia przez czasPomiarowy=0, czyli co 2s
if (znacznikSekundy) obsugaZarowek(); //tylko gdy jest nowa sekunda
// RESET MILLIS CO 51 SEKUND:
// if (elapsedTime >= resetInterval) {
// startTime = aktualnyCzas;
// Serial.println("Czas zresetowany.");
// aktualnyStan = WYLACZONE;
// }
// no jasne :D delay(10); // Dodaj krótką pauzę dla stabilności
znacznikSekundy=0;
}
void obsugaZarowek()
{
// ZAPALANIE ŻARÓWEK:
switch (aktualnyStan) {
case WYLACZONE:
caseTime=2;
digitalWrite(zarowka1, ledWylacz);
digitalWrite(zarowka2, ledWylacz);
digitalWrite(zarowka3, ledWylacz);
digitalWrite(zarowka4, ledWylacz);
digitalWrite(zarowka5, ledWylacz);
digitalWrite(zarowka6, ledWylacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki wylaczone");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WLACZ_ZAROWKI_12;
}
break;
case WLACZ_ZAROWKI_12:
caseTime=2;
digitalWrite(zarowka1, LOW);
digitalWrite(zarowka2, LOW);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 1 i 2 zapalone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WYLACZ_ZAROWKI_12;
}
break;
case WYLACZ_ZAROWKI_12:
caseTime=1;
digitalWrite(zarowka1, ledWylacz);
digitalWrite(zarowka2, ledWylacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 1 i 2 zgaszone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WLACZ_ZAROWKI_34;
}
break;
case WLACZ_ZAROWKI_34:
caseTime=5;
digitalWrite(zarowka3, ledWlacz);
digitalWrite(zarowka4, ledWlacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 3 i 4 zapalone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WYLACZ_ZAROWKI_34;
}
break;
case WYLACZ_ZAROWKI_34:
caseTime=2;
digitalWrite(zarowka3, ledWylacz);
digitalWrite(zarowka4, ledWylacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 3 i 4 zgaszone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WLACZ_ZAROWKI_56;
}
break;
case WLACZ_ZAROWKI_56:
caseTime=2;
digitalWrite(zarowka5, ledWlacz);
digitalWrite(zarowka6, ledWlacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 5 i 6 zapalone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WYLACZ_ZAROWKI_56;
}
break;
case WYLACZ_ZAROWKI_56:
caseTime=2;
digitalWrite(zarowka5, ledWylacz);
digitalWrite(zarowka6, ledWylacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Zarowki 5 i 6 zgaszone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WLACZ_ZAROWKI_123456;
}
break;
case WLACZ_ZAROWKI_123456:
caseTime=2;
digitalWrite(zarowka1, ledWlacz);
digitalWrite(zarowka2, ledWlacz);
digitalWrite(zarowka3, ledWlacz);
digitalWrite(zarowka4, ledWlacz);
digitalWrite(zarowka5, ledWlacz);
digitalWrite(zarowka6, ledWlacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Wszystkie zarowki zapalone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WYLACZ_ZAROWKI_123456;
}
break;
case WYLACZ_ZAROWKI_123456:
caseTime=2;
digitalWrite(zarowka1, ledWylacz);
digitalWrite(zarowka2, ledWylacz);
digitalWrite(zarowka3, ledWylacz);
digitalWrite(zarowka4, ledWylacz);
digitalWrite(zarowka5, ledWylacz);
digitalWrite(zarowka6, ledWylacz);
Serial.print("Aktualny case "); Serial.print(aktualnyStan); Serial.println(" Wszystkie zarowki zgaszone.");
if (++aktualnyCaseTime>=caseTime)
{
aktualnyCaseTime=0;
aktualnyStan=WYLACZONE;
}
break;
}
}
void pomiarPradu()
{
ostatniPomiar = aktualnyCzas;
RawValue = analogRead(analogIn);
Voltage = (RawValue / 1024.0) * 5000;
Amps = ((Voltage - ACSoffset) / mVperAmp);
Serial.print("\t Amps = ");
Serial.println(Amps, 3);
displayCurrent(Amps);
}
// WYŚWIETLANIE PRĄDU NA LCD 4x20:
void displayCurrent(float Amps) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Prad: ");
lcd.print(Amps);
lcd.print(" A");
}