
Projekt ma na celu monitorowanie wartości prądu za pomocą czujnika SCT-013, przetworzenie odczytów i zapisanie ich na karcie SD. Jednocześnie informacje o odczytach są wyświetlane na wyświetlaczu LCD. Dodatkowo, projekt uwzględnia zapisywanie najwyższej wartości prądu oraz powtarzanie zapisu na kartę SD co 60 iteracji pętli.
Komponenty:
- Czujnik Prądu SCT-013: (20A)
- Odczytuje wartość prądu z przewodu, w którym płynie prąd.
- Karta SD:
- Służy do zapisywania danych pomiarowych. W projekcie plik o nazwie „1.txt” jest używany do przechowywania danych.
- Zegar Czasu Rzeczywistego (RTC – RtcDS1302):
- Zapewnia dokładne oznaczenia czasowe dla każdego pomiaru prądu.
- Wyświetlacz LCD (LiquidCrystal_I2C):
- Wykorzystywany do prezentacji informacji, takich jak aktualna wartość prądu, data i godzina oraz komunikaty o zapisach.
Podłączenie:

Kod Arduino
#include <SPI.h> //Bi
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RtcDS1302.h>
ThreeWire myWire(6, 5, 7); // IO, SCLK, CE
RtcDS1302<ThreeWire> Rtc(myWire);
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define VREF 5.0
#define ACTectionRange 20
const int ACPin = A2;
int x = 0;
float UPValue = 0;
int bufferIndex = 0; // Indeks aktualnej pozycji w buforze
File plik;
/*Funkcja odpowiadająca za obliczenia wartości z czujnika prądu AC */
float readACCurrentValue() {
float ACCurrtntValue = 0;
float peakVoltage = 0;
float voltageVirtualValue = 0;
for (int i = 0; i < 5; i++) {
peakVoltage += analogRead(ACPin);
delay(1);
}
peakVoltage = peakVoltage / 5;
voltageVirtualValue = peakVoltage * 0.707;
voltageVirtualValue = (voltageVirtualValue / 1024 * VREF ) / 2;
ACCurrtntValue = voltageVirtualValue * ACTectionRange;
return ACCurrtntValue;
}
/*Inicjalizacja*/
void setup() {
lcd.init();
lcd.backlight();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Gotowy!)");
lcd.setCursor(0, 1);
lcd.print("Szukam karte...");
// Serial.begin(9600); // W przyapdku korzystania z portu szeregowego
Rtc.Begin();
if (!SD.begin(4)) { //błąd wykrycia karty
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Nie wykryto");
delay(500);
// Serial.println("Nie wykryto karty(ERR)");
return;
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Karta Wykryta");
delay(500);
// Serial.println("Karta Wykryta"); // W przypadku korzystania z portu szeregowego
if (SD.exists("1.txt")) {
lcd.setCursor(2, 1);
lcd.print("Plik txt");
delay(500);
//Serial.println("Plik o podanej nazwie istnieje !");
} else {
plik = SD.open("1.txt", FILE_WRITE);
delay(500);
// Serial.println("Utworzono plik o nazwie ACCurrent.csv");
}
}
void loop() {
logger();
}
#define countof(a) (sizeof(a) / sizeof(a[0]))
void printDateTime(const RtcDateTime& dt)
{
char datestring[26];
snprintf_P(datestring,
countof(datestring),
PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
dt.Month(),
dt.Day(),
dt.Year(),
dt.Hour(),
dt.Minute(),
dt.Second() );
Serial.print(datestring);
}
void logger()
{ lcd.clear();
float ACCurrentValue = readACCurrentValue();
// Dodaj wynik do bufora
RtcDateTime now = Rtc.GetDateTime();
if (UPValue < ACCurrentValue) {
UPValue = ACCurrentValue;
plik = SD.open("1.txt", FILE_WRITE);
plik.print("Data: ");
plik.print(now.Month());
plik.print("/");
plik.print(now.Day());
plik.print("/");
plik.print(now.Year());
plik.print("Czas: ");
plik.print(now.Hour());
plik.print(":");
plik.print(now.Minute());
plik.print(":");
plik.print("Prad");
plik.print(ACCurrentValue);
plik.println("A");
lcd.clear();
lcd.setCursor(0, 0);
plik.close();
lcd.print("Zapisano");
x = 0;
delay(500);
}
if (x == 60) {
plik = SD.open("1.txt", FILE_WRITE);
plik.print("Data: ");
plik.print(now.Month());
plik.print("/");
plik.print(now.Day());
plik.print("/");
plik.print(now.Year());
plik.print("Czas: ");
plik.print(now.Hour());
plik.print(":");
plik.print(now.Minute());
plik.print(":");
plik.print("Prad");
plik.print(ACCurrentValue);
plik.println("A");
lcd.clear();
lcd.setCursor(0, 0);
plik.close();
lcd.print("Zapisano");
x = 0;
delay(2000);
}
// Serial.print(ACCurrentValue); // W przypadku korzystania z portu szeregowego
// Serial.println(" A"); // W przypadku korzystania z portu szeregowego
lcd.setCursor(2, 1);
lcd.print("Prad");
lcd.setCursor(7, 1);
lcd.print(ACCurrentValue);
lcd.setCursor(13, 1);
lcd.print("A");
lcd.setCursor(0, 0);
lcd.print("Godzina ");
lcd.print(now.Hour());
lcd.print(":");
lcd.print(now.Minute());
delay(1000);
x++;
// Serial.println("Zapisano na karcie SD!"); // W przypadku korzystania z portu szeregowego
}
Test 1 :

Podłączenie suszarki Moc 2 :
Miernik cęgowy 5,09A czujnik w Arduino 5,16A
Różnica; 0,07A
Test 2 :

Podłączenie suszarki Moc 1 :
Miernik cęgowy 2,78 A czujnik w Arduino 3,45 A
Różnica; 0,67A
„Non-linearity ±3% (10%—120% of rated input current)”
Plik na karcie SD

Test i wykres pomiarów
