Jak wysterowac sygnałem HIGH

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Damcioss
Młodszy majsterkowicz
Posty: 6
Rejestracja: 28 wrz 2019, 17:35

Jak wysterowac sygnałem HIGH

Post autor: Damcioss » 14 lis 2019, 01:52

Witam. Potrzebuję wykonać układ który załączyć mi przekaźnik po otrzymaniu sygnału i będzie go trzymał przez określony czas. Problem w tym, że sygnał z zewnątrz ma potencjał wysoki. Nie chcę dawać przekaźników. Proszę powiedzcie mi co trzeba zmienić żeby sterować wysokim a nie niskim.

const int przycisk = 2; // Definicja pinu do którego podłączony jest przycisk
const int przekaznik = 3; // Definicja pinu do którego podłączony jest przekaznik

int buttonState = 0; /* Stan niski (przekaznik wyłączony ) w momencie gdy przycisk nie jest wcisniety*/
void setup() {
pinMode(przekaznik, OUTPUT); // Ustawienie pinu 3 jako wyjście
pinMode(przycisk, INPUT); // Ustawienie pinu 2 jako wejście
}

void loop() {

if (digitalRead(przycisk) == HIGH) { // Sprawdzamy czy przycisk jest wciśnięty
digitalWrite(przekaznik, HIGH); // Jeśli tak, załącza przekaznik
}
else { // W innym przypadku
// Przekaznik wyłączony
digitalWrite(przekaznik, LOW);
delay(3000); //czas jaki ma być włączony
}
}

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


uzi18
Majsterkowicz
Posty: 100
Rejestracja: 10 maja 2018, 05:06

Re: Jak wysterowac sygnałem HIGH

Post autor: uzi18 » 14 lis 2019, 08:46

z pewnoscia delay(3000) w sytuacji puszczenia przycisku to nie jest dobry pomysl

najlepiej byloby zapamietac millis() po wcisnieciu przycisku i od tego momentu mierzyc czas zalaczenia przekaznika a po nim wylaczac

Wysłane z mojego MI MAX przy użyciu Tapatalka

Awatar użytkownika
Marhef
Złota rączka
Posty: 1187
Rejestracja: 18 lis 2011, 02:18

Re: Jak wysterowac sygnałem HIGH

Post autor: Marhef » 14 lis 2019, 09:43

W podanym przez Ciebie kodzie będzie to działało tak, że przekaźnik będzie załączony tylko przez czas wciśnięcia przycisku. A jak puścisz, to się wyłączy i przez 3 sekundy nie będzie reagował na przycisk.

Sygnał, który podajesz, będzie miał określony stan? To znaczy będzie to 0V albo 5V? Czy to przycisk i nie wciśnięty nie będzie miał określonego stanu?
uzi18
Majsterkowicz
Posty: 100
Rejestracja: 10 maja 2018, 05:06

Re: Jak wysterowac sygnałem HIGH

Post autor: uzi18 » 14 lis 2019, 12:01

@Marhef ma calkowita racje

rozumiesz wogole co robi ten kod?

Wysłane z mojego MI MAX przy użyciu Tapatalka

Damcioss
Młodszy majsterkowicz
Posty: 6
Rejestracja: 28 wrz 2019, 17:35

Re: Jak wysterowac sygnałem HIGH

Post autor: Damcioss » 14 lis 2019, 14:12

Dopiero zaczynam zabawę z programowaniem. Potrzebuję zrobić coś takiego, że gdy układ dostanie +5v załączyć mi przekaźnik na dany czas. Po tym czasie będzie czekał na następny sygnał. Potrzebuję wysterowac dwa przekaźniki. Czyli dwa osobne sygnały +5v jeden steruję jednym przekaźnikiem drugi drugim. Po powstaniu sygnału ma "trzymać" przekaznik przez np 3 sek. Dodatkowo jeszcze jakieś przerwanie. Czyli trzyma jeden nie upłynął czas a dostaje sygnał na drugi to pierwszy odrazu puszcza i załącza drugi. Może banalne ale tak jak wspominałem zaczynam przygodę.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1187
Rejestracja: 18 lis 2011, 02:18

Re: Jak wysterowac sygnałem HIGH

Post autor: Marhef » 14 lis 2019, 14:57

No, to jest w miarę proste.
W pętli loop() potrzebujesz następujące kroki:
1) jeżeli jest sygnał 5V na pierwszym wejściu i pierwsze wejście nie jest załączone, to:
- wyłącz drugi przekaźnik
- załącz pierwszy przekaźnik
- zmierz czas załączenia
2) jeżeli jest sygnał 5V na drugim wejściu i drugie wejście nie jest załączone, to:
- wyłącz pierwszy przekaźnik
- załącz drugi przekaźnik
- zmierz czas załączenia (uwaga! Czas załączenia przechowujesz w jednej zmiennej)
3) jeżeli różnica czasu aktualnego i czasu załączenia przekaźnika jest większa od czasu żądanego (3 sekundy?):
- wyłącz pierwszy przekaźnik
- wyłącz drugi przekaźnik

Teraz to zapisz w kodzie programu :P
mała podpowiedź, będziesz musiał użyć funkcji millis()
Damcioss
Młodszy majsterkowicz
Posty: 6
Rejestracja: 28 wrz 2019, 17:35

Re: Jak wysterowac sygnałem HIGH

Post autor: Damcioss » 14 lis 2019, 23:35

Po wielu próbach i testach udało się osiągnąć to co chciałem. Dziękuję Panu Marhef który wypisał mi listę co po czym. Od dzisiaj taką listę będę sobie tworzyć przed każdym projektem.
To co stworzyłem do wglądu dla ciekawych (pewnie można było łatwiej)
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas3 = 0;
unsigned long zapamietanyCzas5 = 0;
void setup(){
Serial.begin(9600);
pinMode(2, INPUT); //numer portu przycisk 1
pinMode(3, OUTPUT); //numer portu przekaznik 1
digitalWrite(3, LOW); //ustawia LOW na wyjsciu 3
pinMode(4, INPUT); //numer portu przycisk 2
pinMode(5, OUTPUT);//numer portu przekaznik 2
digitalWrite(5, LOW); //ustawia LOW na wyjsciu 5
}

void loop(){
aktualnyCzas = millis();
if(digitalRead(2) == HIGH)
{
digitalWrite(3, HIGH);
digitalWrite(5, LOW);
}
if (aktualnyCzas - zapamietanyCzas3 >= 3000) {
zapamietanyCzas3 = aktualnyCzas;
digitalWrite(3, LOW);
}
aktualnyCzas = millis();
if(digitalRead(4) == HIGH)
{
digitalWrite(5, HIGH);
digitalWrite(3, LOW);
}
if (aktualnyCzas - zapamietanyCzas5 >= 3000) {
zapamietanyCzas5 = aktualnyCzas;
digitalWrite(5, LOW);
}
}
Awatar użytkownika
Marhef
Złota rączka
Posty: 1187
Rejestracja: 18 lis 2011, 02:18

Re: Jak wysterowac sygnałem HIGH

Post autor: Marhef » 15 lis 2019, 10:22

Skomentuję, a co mi tam ;)

unsigned long aktualnyCzas = 0; // Zmienna niepotrzebna, możesz po prostu używać millis()
unsigned long zapamietanyCzas3 = 0; // Ale wiesz, że tworząc dwie zmienne do czasu, nie uzyskasz efektu przerwania?
unsigned long zapamietanyCzas5 = 0;
void setup(){
Serial.begin(9600); // Nie komunikujesz się przez UART z kompem, nie potrzebujesz tego
pinMode(2, INPUT); //numer portu przycisk 1
pinMode(3, OUTPUT); //numer portu przekaznik 1
digitalWrite(3, LOW); //ustawia LOW na wyjsciu 3
pinMode(4, INPUT); //numer portu przycisk 2
pinMode(5, OUTPUT);//numer portu przekaznik 2
digitalWrite(5, LOW); //ustawia LOW na wyjsciu 5
}

void loop(){A to przepiszę, nie do końca łapię, co miałeś na myśli
aktualnyCzas = millis();
if(digitalRead(2) == HIGH)
{
digitalWrite(3, HIGH);
digitalWrite(5, LOW);
}
if (aktualnyCzas - zapamietanyCzas3 >= 3000) {
zapamietanyCzas3 = aktualnyCzas;
digitalWrite(3, LOW);
}
aktualnyCzas = millis();
if(digitalRead(4) == HIGH)
{
digitalWrite(5, HIGH);
digitalWrite(3, LOW);
}
if (aktualnyCzas - zapamietanyCzas5 >= 3000) {
zapamietanyCzas5 = aktualnyCzas;
digitalWrite(5, LOW);
}
}

Drobna uwaga. Kod programu wrzucaj w znaczniki od kodu (w pełnym edytorze piąty przycisk od lewej).
Moja wersja pętli loop(), dokładnie wg tego, co zapisałem w punktach wczoraj:

Kod: Zaznacz cały

loop(){
if (digitalRead(2) == HIGH) && (digitalRead(3) == LOW)
{
digitalWrite(5, LOW);
digitalWrite(3, HIGH);
zapamietanyCzas = millis();
}
if (digitalRead(4) == HIGH) && (digitalRead(5) == LOW)
{
digitalWrite(3, LOW);
digitalWrite(5, HIGH);
zapamietanyCzas = millis();
}
if (millis() - zapamietanyCzas > 3000)
{
digitalWrite(3, LOW);
digitalWrite(5, LOW);
}
Sprawdź, czy to działa. Pisałem w notatniku, nie mam możliwości sprawdzić, czy wszystko jest napisane bez błędów.
I na forach nie stosujemy formy Pan/Pani ;)
ODPOWIEDZ

Strony partnerskie: