Teraz można przejść do napisania programu, który na początku będzie załączał przekaźnik, co w rezultacie spowoduje uruchomienie silnika. Następnie kod mierzy wartość analogową na pinie A0 połączonym z wyjściem czujnika. Odczyt z przetwornika cyfrowo-analogowego jest przeliczana na mV, a następnie na prąd w mA. Obliczony prąd porównywany jest z wartością progową, a po jej przekroczeniu przekaźnik zostanie odłączony, co spowoduje zatrzymanie silnika. Aby silnik pracował ponownie potrzebny jest restart programu na płytce KAmduino UNO (pełen kod programu znajduje się na końcu artykułu, w sekcji Do pobrania).
Na początku programu zadeklarowano niezbędne zmienne, które będą przechowywać informacje o wartości odczytanej z portu A0, napięciu w mV oraz natężeniu w mA.
1 2 3 4 5 6 7 8 9 10 11 |
// [PRZYKŁAD] Moduł z czujnikiem natężenia prądu oraz KAmduino UNO // Autor: Patryk Mądry // Mikrokontroler 2017-2018 r. // Zmienne int mVperAmp = 185; // dla modułu 20A - 100, dla modułu 30A - 66 int Wartosc_analogowa= 0; // int ACSoffset = 2472; float napiecie = 0; double natezenie= 0; double srednie_natezenie =0; |
Następnie w funkcji konfiguracyjnej setup() ustawiono prędkość portu szeregowego, rolę pinu do sterowania przekaźnikiem (pin 3 ustawiony jako wyjście) oraz stan wysoki na tym pinie, co uruchomi pracę silnika.
1 2 3 4 5 6 |
void setup() { Serial.begin(9600); pinMode(3, OUTPUT); digitalWrite(3,HIGH); } |
W pętli głównej loop() odczytywana jest wartość na pinie A0, a następnie jest przeliczana na napięcie w mV, oraz natężenie prądu przepływającego przez sensor wyrażone w mA. Wartość ta jest wyświetlana w monitorze portu szeregowego.
1 2 3 4 5 6 7 |
void loop() { Wartosc_analogowa = analogRead(A0); napiecie = (Wartosc_analogowa / 1024.0) * 5000; // napięcie w mV natezenie = ((napiecie - ACSoffset) / mVperAmp)*1000; // natężenie w mA Serial.println(natezenie); |
Po skompilowaniu i uruchomieniu programu należy otworzyć Kreślarkę (Crtl+Shift+L). Teraz zatrzymując wał silnika można zobaczyć podobny wykres.
Rysunek 5. Wykres natężenia od czasu – bez filtracji
Na rysunku 5 wyraźnie widać, w którym momencie silnik pobierał więcej prądu. Sygnał jest jednak mocno zaszumiony, ale można temu zapobiegać stosując proste uśrednianie wyników. Wystarczy w pętli for sumować 10 kolejnych pomiarów natężenia prądu, a następnie wypisywać na ekran wartość średnią.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void loop() { srednie_natezenie = 0; for(int i=0;i<=100;i++) { Wartosc_analogowa = analogRead(A0); napiecie = (Wartosc_analogowa / 1024.0) * 5000; // napięcie w mV natezenie = ((napiecie - ACSoffset) / mVperAmp)*1000; // natężenie w mA srednie_natezenie = srednie_natezenie+ natezenie; delay(1); } srednie_natezenie= srednie_natezenie/100; Serial.println(srednie_natezenie); |
Sygnał po zastosowaniu tego kroku wygląda następująco:
Rysunek 6. Wykres natężenia od czasu – z filtracją
Teraz można napisać warunek, który będzie sprawdzał uśredniony prąd pobierany przez silnik. Jeśli będzie on większy niż ustawiony próg, nastąpi wyłączenie silnika (ustawienie stanu niskiego na pinie 3).
1 2 3 4 |
if (srednie_natezenie >800) { digitalWrite(3,LOW); } |
Aby uruchomić ponownie silnik należy zrestartować płytkę KAmduino UNO.
Działanie programu zostało pokazane na poniższym materiale wideo: