Czujnik poziomu wody Arduino +tranzystor

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 16 paź 2021, 22:15

Witam.
Sprawa następująca:
W arduino jedno z wejść opisuje jako
pinMode(3, INPUT_PULLUP); i kiedy to wejście zewre do zacisku 5V za pomocą przycisku to na mojej aplikacji w telefonie zapala się dioda i tak to działa.
Znalazłem w sieci taki układ jak w załączniku i teraz mam pytanie czy istnieje możliwość aby przycisk który zwiera Pin 3 z 5V zastąpić tranzystorem ,który bedzie sterowany poprzez kontakt z wodą .Tak jak na schemacie kiedy baza tranzystora BC547 zostanie zwarta do "+" poprzez wodę to zapali sie dioda a ja chciałbym aby zamiast zapalającej się diody tranzystor zadziałał jak przycisk i poprostu zwarł pin 3 z 5V.
Chodzi o zrobienie wskaznika poziomu wody w zbiorniku na deszczówkę .
Bez tytułu.jpg
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 17 paź 2021, 09:15

Po pierwsze, to coś namieszałeś. INPUT_PULLUP powoduje podciągnięcie pinu właśnie do 5 V (przez rezystor do + zasilania), co powoduje, że jeśli do tego pinu nic nie będzie podłączone, to będzie na nim stan wysoki. Kiedy ten pin zewrzesz z 5 V, to nic się nie zmieni, dalej będzie stan wysoki. Musisz ten pin właśnie zewrzeć z GND, co spowoduje, że na pinie pojawi się stan niski. To jest niemożliwe żebyś w ten sposób jaki opisałeś, wykrywał przyciśnięcie przycisku, on musi zwierać do GND.
https://www.arduino.cc/en/Tutorial/Buil ... llupSerial
Ostatnio zmieniony 17 paź 2021, 10:08 przez stiven, łącznie zmieniany 2 razy.
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 17 paź 2021, 09:57

Tak masz racje zle to opisalem pin 3 musi zostac zwarty do GND.Ten uklad fizycznie juz u mnie działa wraz z aplikacja ale chodzi tylko o to aby te piny zwarl tranzystor sterowany poprzez kontakt z wodą.
stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 17 paź 2021, 10:08

Wydaje mi się, że tranzystora nie można wykorzystać w takiej roli, jakiej chcesz, ale zdaje mi się, że możesz ten czujnik wody podłączyć bezpośrednio do pinu bez niczego dodatkowego.
Kiedy podłączasz przycisk do pinu, to sytuacja jest taka, że on tylko może zwierać, czyli podawać jakiś stan na pin w momencie przyciśnięcia przycisku. Kiedy przycisk nie jest wciśnięty (nie ma zwarcia), to na pin nie jest podawany żaden stan (ani niski(zwieranie z GND), ani wysoki(zwieranie z 5 V)). I kwestia tutaj jest taka, że kiedy ustawisz pin jako zwykłe wejście, czyli samo INPUT, nie INPUT_PULLUP, to kiedy na pin nie jest podawany żaden stan, to na pinie jest tak zwany stan nieustalony, korzystając z DigitalRead() nie ma pewności jaki zostanie odczytany stan, on może być i niski i wysoki. Dlatego przy korzystaniu z przycisku potrzebne jest INPUT_PULLUP, wtedy przy niewciśniętym przycisku, na pewno będzie stan wysoki, a w momencie przyciśnięcia przycisku podłączonego do GND, na pinie pojawi się stan niski.
W przypadku czujników jest z reguły inaczej, one podają cały czas jakiś stan, albo niski, albo wysoki i podłącza się bezpośrednio do pinu, który ustawia się jako zwykły INPUT.
stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 17 paź 2021, 10:31

Napisz jaki masz ten czujnik, to może się coś znajdzie na jego temat, no ale myślę, że jest tak jak napisałem.

Ogólnie w arduino jest to INPUT_PULLUP, czyli programowe podciągnięcie pinu ustawionego jako wejście, do 5 V przez rezystor. Można też samemu zrobić sobie taki PULLUP, pin ustawić jako samo INPUT, a przez rezystor 10 kΩ zewnętrznie połączyć z 5 V. Istnieje też PULLDOWN, ale arduino nie ma czegoś takiego "wbudowanego", ale zawsze można zrobić samemu, tym razem podłączając pin przez rezystor do GND. Wtedy można na przykład przycisk zwierać do 5 V, a gdyby się okazało, że ten czujnik też działa na zasadzie zwierania, to też możesz tak zrobić, zamiast tego tranzystora.

Jest o tym wspomniane też na stronie arduino
Often it is useful to steer an input pin to a known state if no input is present. This can be done by adding a pullup resistor (to +5V), or a pulldown resistor (resistor to ground) on the input. A 10K resistor is a good value for a pullup or pulldown resistor.
https://www.arduino.cc/en/Tutorial/Foun ... igitalPins

I obrazek jak to wygląda, z lewej strony PULLUP, z prawej PULLDOWN.
Obrazek
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 17 paź 2021, 14:24

Przycisk miał byc zastąpiony zwykłym czujnikiem pływakowym takim jak w załaczniku wiec mógłbym bez probkemów taki pływak zastosować ale koszt takiego to 30 zł potrzebowałbym takich 5-6 szt. wiec pomyslałem ze moze jest opcja taki plywak zastąpić tranzystorem.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 17 paź 2021, 16:28

Okej, już teraz rozumiem co chcesz zrobić. Przetestowałem układ, który tutaj jest podany https://electronics.stackexchange.com/q ... vice/75910
i on działa dobrze (pin arduino musi być jednak ustawiony na INPUT_PULLUP, bo przy samym INPUT przy braku stanu na bazie tranzystora, arduino odbiera raz stan niski, raz wysoki). Na wodzie nie testowałem. Tam akurat ten układ do czegoś innego miał być użyty, ale tutaj będzie analogicznie.
W miejscu, w którym jest 3,3V pin, to byłaby woda.
Obrazek
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 17 paź 2021, 18:40

Ok dzieki jutro postaram sie kupic taki tranzystor i sprawdzic.
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 18 paź 2021, 21:06

Zadziałało.Zrobiłem tak ze do rezystora R1 dolutowałem przewód który wkładałem do wody .Arduino odbierało informacje ze np Pin 3 jest zwierany do masy i poprzez moduł bluetooth info szła do mojego telefonu i w aplikacji Roboremofree zapalała się dioda.Działo się tak tylko jak ten przewod szybko wkładałem do wody kiedy powoli go zanurzałem dioda raz gasła potem zapalała się i tak na zmianę.Powolne zanurzanie miało chyba jakiś wpływ na prace tranzystora.
Zrobiłem tak :przewód od GND i przewód z Pin 3 razem do wody i tez zadziałało więc nie bede już nic z tym kombinował i taki sposób wykorzystam do czujnika poziomu wody.Pojawił się jednak jeszcze jeden problem.
W kodzie do arduino piny D3..D7 są wystawione jako INPUT_PULLUP każdy z tych pinów to LED na smartfonie.Włączam arduino i moduł HC05 otwieram aplikacje na telefonie i łącze się z HC05,pojawiają się Ledy przypisane do pinów i teraz po kolei wkładam przewody do wody , wszystkie diody zapalają się i jest ok ale kiedy wyłącze bluetooth a potem wyciągne jeden z przewodów z wody tak żeby zgasić jedną z LED to po ponownym włączeniu bluetooth w aplikacji nadal palą się wszystkie ledy pomimo że jedna z nich powinna być zgaszona.W czym może być problem ?Jak napisać w kodzie programu aby np arduino co 1s sprawdzało informacje o stanie pinów ?Mam nadzieje ze w miare jasno to opisałem :-)
stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 19 paź 2021, 18:47

Masz na myśli, że wyłączasz bluetooth na smartfonie i po ponownym włączeniu nie zgadzają się stany? Jeśli tak, to wydaje mi się, że raczej w programie na arduino by trzeba było zrobić wysyłanie danych co jakiś określony czas, a nie tylko w momencie zmiany. Właściwie nie wiem co to za aplikacja na smartfonie, może w niej można by było zrobić coś, żeby po włączeniu wysyłała "zapytanie" do arduino o aktualny stan.
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 19 paź 2021, 19:48

]Dokladnie o to mi chodzi.Aplikacja na telefon to roboremofree i w ustawieniach niczego nie udało mi sie znalezc.Mysle ze trzeba cos zmienic w kodzie aby np co 1 sek sprawdzał stan pinow.
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 19 paź 2021, 19:59

Kod: Zaznacz cały

[#include <Servo.h>

#include <Servo.h>
Servo myservo;

void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  myservo.attach(10);
}

char cmd[100];
byte cmdIndex;
boolean prz1, prz2,prz3, prz4, prz5, prz1_old = true, prz2_old = true, prz3_old = true,prz4_old = true, prz5_old = true;

void exeCmd() {

  if (cmd[0] == 's') {
    unsigned int val = atof(cmd + 2);
    myservo.write(val);
  }
}

void loop() {
  if (Serial.available() > 0)
  {
    char c = (char)Serial.read();
    if (c == '\n') {
      cmd[cmdIndex] = 0;
      exeCmd();
      cmdIndex = 0;
    } else {
      cmd[cmdIndex] = c;
      if (cmdIndex < 99) cmdIndex++;
    }
  }

  prz1 = digitalRead(3);
  prz2 = digitalRead(4);
  prz3 = digitalRead(5);
  prz4 = digitalRead(6);
  prz5 = digitalRead(7);

  if (prz1 != prz1_old)
  {
    prz1_old = prz1;
    if (prz1)
      Serial.println("led1 0\n");
    else Serial.println("led1 1\n");
    delay(200);
  }

  if (prz2 != prz2_old)
  {
    prz2_old = prz2;
    if (prz2)
      Serial.println("led2 0\n");
    else Serial.println("led2 1\n");
    delay(200);
  }
  if (prz3 != prz3_old)
  {
    prz3_old = prz3;
    if (prz3)
      Serial.println("led3 0\n");
    else Serial.println("led3 1\n");
    delay(200);
  }
  if (prz4 != prz4_old)
  {
    prz4_old = prz4;
    if (prz4)
      Serial.println("led4 0\n");
    else Serial.println("led4 1\n");
    delay(200);
  }
  if (prz5 != prz5_old)
  {
    prz5_old = prz5;
    if (prz5)
      Serial.println("led5 0\n");
    else Serial.println("led5 1\n");
    delay(200);
  }
 
}/code]
stiven
Złota rączka
Posty: 1661
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: stiven » 20 paź 2021, 18:03

Zrobiłem modyfikację kodu, żeby stan wejść był wysyłany co około 2 sekundy.

Kod: Zaznacz cały

#include <Servo.h>

#include <Servo.h>
Servo myservo;

unsigned long t_send = millis();

void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  myservo.attach(10);
}

char cmd[100];
byte cmdIndex;
boolean prz1, prz2,prz3, prz4, prz5, prz1_old = true, prz2_old = true, prz3_old = true,prz4_old = true, prz5_old = true;

void exeCmd() {

  if (cmd[0] == 's') {
    unsigned int val = atof(cmd + 2);
    myservo.write(val);
  }
}

void loop() {
  if (Serial.available() > 0)
  {
    char c = (char)Serial.read();
    if (c == '\n') {
      cmd[cmdIndex] = 0;
      exeCmd();
      cmdIndex = 0;
    } else {
      cmd[cmdIndex] = c;
      if (cmdIndex < 99) cmdIndex++;
    }
  }

  prz1 = digitalRead(3);
  prz2 = digitalRead(4);
  prz3 = digitalRead(5);
  prz4 = digitalRead(6);
  prz5 = digitalRead(7);

  if (prz1 != prz1_old)
  {
    prz1_old = prz1;
    if (prz1)
      Serial.println("led1 0\n");
    else Serial.println("led1 1\n");
    delay(200);
  }

  if (prz2 != prz2_old)
  {
    prz2_old = prz2;
    if (prz2)
      Serial.println("led2 0\n");
    else Serial.println("led2 1\n");
    delay(200);
  }
  if (prz3 != prz3_old)
  {
    prz3_old = prz3;
    if (prz3)
      Serial.println("led3 0\n");
    else Serial.println("led3 1\n");
    delay(200);
  }
  if (prz4 != prz4_old)
  {
    prz4_old = prz4;
    if (prz4)
      Serial.println("led4 0\n");
    else Serial.println("led4 1\n");
    delay(200);
  }
  if (prz5 != prz5_old)
  {
    prz5_old = prz5;
    if (prz5)
      Serial.println("led5 0\n");
    else Serial.println("led5 1\n");
    delay(200);
  }

  if(millis() > t_send)
  {
    if (prz1)
      Serial.println("led1 0\n");
    else Serial.println("led1 1\n");
    delay(200);
    if (prz2)
      Serial.println("led2 0\n");
    else Serial.println("led2 1\n");
    delay(200);
    if (prz3)
      Serial.println("led3 0\n");
    else Serial.println("led3 1\n");
    delay(200);
    if (prz4)
      Serial.println("led4 0\n");
    else Serial.println("led4 1\n");
    delay(200);
    if (prz5)
      Serial.println("led5 0\n");
    else Serial.println("led5 1\n");

    t_send = millis() + 1000;
  }
 
}
Nie wiem czy to dobre rozwiązanie, ale raczej powinno działać.
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 20 paź 2021, 18:11

Dzieki wielki ...za okolo 2h bede sprawdzal
gintur
Młodszy majsterkowicz
Posty: 30
Rejestracja: 12 lip 2017, 20:03

Re: Czujnik poziomu wody Arduino +tranzystor

Post autor: gintur » 20 paź 2021, 19:27

Właśnie sprawdziłem działanie układu i wszystko chodzi jak powinno także dziekuje za pomoc.
ODPOWIEDZ

Strony partnerskie: