Czujnik prądu zmiennego AC

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:

  1. Czujnik Prądu SCT-013: (20A)
    • Odczytuje wartość prądu z przewodu, w którym płynie prąd.
  2. Karta SD:
    • Służy do zapisywania danych pomiarowych. W projekcie plik o nazwie „1.txt” jest używany do przechowywania danych.
  3. Zegar Czasu Rzeczywistego (RTC – RtcDS1302):
    • Zapewnia dokładne oznaczenia czasowe dla każdego pomiaru prądu.
  4. 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

Dodaj komentarz