Skocz do zawartości

Kontrola napięcia zasilania sieciowego


Pomocna odpowiedź

Napisano

Chcę kontrolować napięcie sieciowe (pośrednio kontrolując +5V z zasilacza) za pomocą arduino Nano. Nie jestem jednak "mocarzem" w arduino i szukam rozwiązania.

Mam "kawałek" sketcha do odczytu poziomu pinu cyfrowego:

void setup() {
 Serial.begin(9600);
 pinMode(5, INPUT_PULLUP);
}

void loop() {
 byte value = digitalRead(5);
 Serial.print(F("Wejscie cyfrowe 5 ma wartosc: "));
 if (value == LOW) {
   Serial.println(F("LOW"));
 }

 else {
   Serial.println(F("HIGH"));
 }

 delay(500);
}

Program wykonuje się poprawnie, ale wysyła informacje co 500ms.

Mnie interesuje tylko jednorazowa zmiana stanu LOW/HIGH i odwrotnie. Może bardziej szczegółowo: oczekuję komunikatu (jednorazowego) tylko po zmianie poziomu pinu.

Proszę o wyrozumiałość i podpowiedź.

Dopiero się uczę, ale myślę, że do tego nadadzą się przerwania. Można kontrolować pin i wywołać funkcję(w tym przypadku informującą o stanie na danym pinie) podczas zmiany z HIGH na LOW i odwrotnie(reakcja CHANGE)

Wszystko wyjaśnione jest w kursie Arduino II #4 na blogu .

Dzięki za odzew. Pomysł może dobry, ale u mnie pojawiają się nowe problemy. Arduino Nano ma dwa dostępne przerwania D2 i D3, a na tych pinach mam zaimplementowane połączenie z modemem. Jak powiększyć ilość przerwań , to "już wyższa szkoła jazdy", a jak zaznaczyłem - "mocarzem nie jestem"

W takim razie możesz dodać jakąś flagę. Przykladowa zmienną isHigh, która przyjmie wartość 1, gdy zarejestrowane wcześniej był stan wysoki i 0 gdy niski. W pętli wrzucasz po prostu instrukcję:

if(digitalRead(5) == LOW && isHigh == 1)
{
Serial.println("low");
isHigh = 0;
}
if(digitalRead(5) == HIGH && isHigh == 0)
{
Serial.prinln("high");
isHigh = 1;
}

Dzięki za sugestie.

Zastosowałem się do podpowiedzi, wstawiłem kod do void loop(), ale "zaraza milczy" 😃

W konsoli nie widzę żadnych reakcji po zmianie poziomu na pinie 5. Chyba z ta flagą isHigh coś źle robię (deklaruję).

Ja zadelkarowalem po prostu int isHigh = 1;

W setupie dodalem jeszcze digitalWrite(5, LOW) bo zauwazylem ze na tym pinie u mnie wystepowalo napiecie ok 4,5V bez tej deklaracji.

Dodalem jeszcze minimalne opoznienie w pętli głównej, bo podczas zwierania/rozwierania przewodu podlaczonego do 5. Pinu zaklocenia powodowaly wyswietlanie kilkakrotne informacji na przemian. Mase baterii 4,5V podlaczylem do GND Arduino i za pomocą zworki połączonej z pinem 5 dotykalem + baterii. Uzyskałem zamierzony efekt.

Niemniej jednak prosiłbym kogoś bardziej doświadczonego o opinie na temat takiego testu. Czy łączenie baterii w ten sposób do płytki jest bezpieczne?

Dzięki za kolejne podpowiedzi.

Robiłem testy i nie do końca problem rozwiązany.

Ze względu na konstrukcję urządzenia pin D5 jest "podciągnięty" do + zasilania (pinMode(5, INPUT_PULLUP)😉, dlatego zmieniłem int isHigh = 0;. Zadeklarowałem digitalWrite(5, HIGH);

Po kompilacji i uruchomieniu programu, gdy na D5 jest LOW, to nic się nie dzieje. Gdy ustawię D5 HIGH i uruchomię program, to jest powiadomienie. Gdy teraz zmienię stan pinu na LOW to też jest powiadomienie. Nie bardzo wiem dlaczego tak się dzieje.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...