Skocz do zawartości
Albert1972

Dwa przekaźniki działające na przemian, uruchamiane zwarciem przekaźnika trzeciego i zatrzymane rozwarciem tegoż

Pomocna odpowiedź

Rzecz w tym że nie mam zielonego pojęcia co tu nie gra. Świeżak choć leciwy jestem i ogólnie z programowaniem czegokolwiek poza pralką miałem mało do czynienia.

Co mam?  Plan działania!

Czego brakuje? Działania programu!

No to tak. Mamy dwa przekaźniki które załączają się  w pętli póki z trzeciego przekaźnika idzie 5V. Ten trzeci jest sygnałem na wejściu. Dwa poprzednie to wyjścia. Teraz. Jeśli pierwszy jest włączony drugi nie może byś włączony i na odwrót. Cykl kończy rozwarcie. Funkcji delay nie mogę użyć bo blokuje mi resztę procesów.

#include "DHT.h"
#define DHTPIN 2                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
#define RELAY1 3                                   // Pin miernika poziomu cieczy - wejście 3
#define PUMP 4                                    // Pin pompy napełniającej - wyjście 4
#define PUMP2 5                                   // Pin pompy mieszającej - wyjście 5
#define PUMP3 6                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPUMP = HIGH;
int stanPUMP2 = HIGH;
int stanPUMP3 = HIGH;


unsigned long pracaPUMP = 60000;
unsigned long pracaPUMP2 = 60000;
 
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPUMP = 0;
unsigned long zapamietanyCzasPUMP2 = 0;
DHT dht(DHTPIN, DHTTYPE);


void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
  //dopóki serial monitor nie jest otwarty NIE rób nic
  while (!Serial) ;
  // Testuj czujnik DHT 22 (Ciągnie z biblioteki)
  Serial.println("DHTxx test!");
  dht.begin();
    pinMode(RELAY1, INPUT);
    pinMode(PUMP, OUTPUT);
    pinMode(PUMP2, OUTPUT);
    pinMode(PUMP3, OUTPUT);
    
}

void loop() {
      
     aktualnyCzas = millis();                            //Pobierz liczbe milisekund od startu
     
    stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
    
    if (stanRELAY1 == HIGH) {                           // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. Jeśli tak zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
      
   pracaPUMP = 60000;                                  // Włącz pompę napełniającą:
  } 
  else {
    pracaPUMP = HIGH;
  }
  

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  //if (isnan(t) || isnan(h)) {
    //Serial.println("Błędny odczyt czujnika DHT");
//  } else {
  //  Serial.print("Wilgotnoiść: "); 
   // Serial.print(h);
   // Serial.print(" %\t");
    //Serial.print("Temperatura: "); 
    //Serial.print(t);
    //Serial.print(" *C ");
    if(stanRELAY1){
       Serial.print("Aktywny");
       } else {Serial.print("nieaktywny");
       
        
       }
        Serial.println("");
          delay(5000);
    }

 

Udostępnij ten post


Link to post
Share on other sites

@Albert1972 witam na forum 🙂

13 godzin temu, Albert1972 napisał:

No to tak. Mamy dwa przekaźniki które załączają się  w pętli póki z trzeciego przekaźnika idzie 5V. Ten trzeci jest sygnałem na wejściu. Dwa poprzednie to wyjścia. Teraz. Jeśli pierwszy jest włączony drugi nie może byś włączony i na odwrót. Cykl kończy rozwarcie. Funkcji delay nie mogę użyć bo blokuje mi resztę procesów.

Opis trochę enigmatyczny, ale coś może uda się doradzić. Nie zadałeś żadnego konkretnego pytania... Może, aby ruszyć napisz na czym dokładnie utknąłeś, co sprawia problem? Jak program działa w tej chwili i czego mu brakuje, aby spełniał Twoje założenia?

PS programy należy umieszczać za pomocą odpowiedniej opcji w edytorze. Tym razem poprawiłem, ale pamiętaj o tym na przyszłość 😉 Krótka instrukcja do często pomijanych opcji edytora, które warto znać:

edytor_forum.png

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cały projekt ma na celu wysterowanie systemu saturatora z regulowaną mineralizacją wody. Sprzętowo jest już wykonany i działa bez zarzutu. Teraz chodzi o zautomatyzowanie procesu. Początkowo myślałem użyć do tego sterownika PLC ale po przyjrzeniu się Arduino, doszedłem do wniosku że spokojnie sobie z tym poradzi. Po drugie koszt PLC  plus  peryferia typu moduł ethernet lub moduł wejść analogowych to koszt rzędu 2000 PLN +.

Zakupiłem płytkę Arduino Yun , jakiś tam starter, czujnik DHT22 i ośmioprzekaźnikowy moduł do sterowania peryferiami typu elektrozawory i pompy 24V

(moduł załączany stanem niskim)

To czego oczekiwałem od sterowania przekaźnikami pomp wykonywał poprawnie poniższy kod

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// Ustaw numery pinów dla poszczególnych wejść i wyjść:
int relayPin = 3; // Pin miernika poziomu cieczy - wejście 5V
int pumpPin = 4;  // Pin pompy napełniającej - wyjście 5V
int pumpPin2 = 5;  // Pin pompy mieszającej - wyjście 5V


// variables will change:
int stanRELAY1 = 1;         // variable for reading the pushbutton status

void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
  //dopóki serial monitor nie jest otwarty NIE rób nic
  while (!Serial) ;
  // Testuj czujnik DHT 22
  Serial.println("DHTxx test!");
  dht.begin();
   // ustawienie miernika poziomu cieczy na wejście:
    pinMode(relayPin, INPUT);
    // Ustawienie pinu pompy na wyjście:
    pinMode(pumpPin, OUTPUT);
    //stan początkowy przekaznika1 
    digitalWrite(pumpPin, LOW);
}

void loop() {
     // Odczyt stanu przekaźnika miernika poziomu cieczy:
    stanRELAY1 = digitalRead(relayPin);
    // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. Jeśli tak zbiornik nie jest pełny, więc ustaw stan relayState na HIGH:
    if (stanRELAY1 == HIGH) {
      // Włącz pompę napełniającą:
 digitalWrite(pumpPin, LOW);
      delay(100000); //Odczekaj 1000 ms
      digitalWrite(pumpPin, HIGH);
      delay(10); //Odczekaj 10 ms
       digitalWrite(pumpPin2, LOW);
      delay(100000); //Odczekaj 1000 ms
      digitalWrite(pumpPin2, HIGH);
      delay(10); //Odczekaj 10 ms
    } else {
      // wyłącz pompę napełniającą:
      digitalWrite(pumpPin, HIGH);
      digitalWrite(pumpPin2, HIGH);
     
    }
    
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 // check if returns are valid, if they are NaN (not a number) then something went wrong!
  //if (isnan(t) || isnan(h)) {
    //Serial.println("Błędny odczyt czujnika DHT");
//  } else {
  //  Serial.print("Wilgotnoiść: "); 
   // Serial.print(h);
   // Serial.print(" %\t");
    //Serial.print("Temperatura: "); 
    //Serial.print(t);
    //Serial.print(" *C ");
  

    if(stanRELAY1){
       Serial.print("Napełnianie");
       } else {Serial.print("Zbiornik pełny");
       
        
       }
        Serial.println("");
          delay(5000);
    }

Jednak delay blokuje mi odczyt czujnika DHT więc po przeczytaniu części kursu o wielozadaniowości doszedłem do wniosku że idealna będzie tu funkcja millis . Na razie jednak najwyraźniej mnie przerosło zastosowanie jej w kodzie wiec próbowałem metodą małpuj -wklej.  Chyba nie do końca rozumiem ustawienie stanu początkowego i co od niego zależy.

W poniższym kodzie przekaźniki  4 i 5 nie wyłączają się po zmianie stanu wejścia z High na LOW a powinny. Poza tym pracują równolegle a powinny na przemian.

#include "DHT.h"
#define DHTPIN 2                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
#define RELAY1 3                                   // Pin miernika poziomu cieczy - wejście 3
#define PUMP 4                                    // Pin pompy napełniającej - wyjście 4
#define PUMP2 5                                   // Pin pompy mieszającej - wyjście 5
#define PUMP3 6                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPUMP = HIGH;
int stanPUMP2 = HIGH;
int stanPUMP3 = HIGH;


unsigned long pracaPUMP = 60000;
unsigned long pracaPUMP2 = 60000;
 
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPUMP = 0;
unsigned long zapamietanyCzasPUMP2 = 0;
DHT dht(DHTPIN, DHTTYPE);


void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
  //dopóki serial monitor nie jest otwarty NIE rób nic
  while (!Serial) ;
  // Testuj czujnik DHT 22 (Ciągnie z biblioteki)
  Serial.println("DHTxx test!");
  dht.begin();
    pinMode(RELAY1, INPUT);
    pinMode(PUMP, OUTPUT);
    pinMode(PUMP2, OUTPUT);
    pinMode(PUMP3, OUTPUT);
    
}

void loop() {
      
     aktualnyCzas = millis();                            //Pobierz liczbe milisekund od startu
     
    stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
    
    if (stanRELAY1 == HIGH) {                           // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. Jeśli tak zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
      
   pracaPUMP = 60000;                                  // Włącz pompę napełniającą:
  } 
  else {
    pracaPUMP = HIGH;
  }
  

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  //if (isnan(t) || isnan(h)) {
    //Serial.println("Błędny odczyt czujnika DHT");
//  } else {
  //  Serial.print("Wilgotnoiść: "); 
   // Serial.print(h);
   // Serial.print(" %\t");
    //Serial.print("Temperatura: "); 
    //Serial.print(t);
    //Serial.print(" *C ");
    if(stanRELAY1){
       Serial.print("Aktywny");
       } else {Serial.print("nieaktywny");
       
        
       }
        Serial.println("");
          delay(5000);
    }

 

Edytowano przez Albert1972

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cóż próbowałem ale chyba jeszcze jestem za cienki w te klocki.

Generalnie chodzi mi o to by ten kod z części 11 kursu  przerobić następująco:

  1. Kiedy przycisk jest wciśnięty (przekaźnik zwarty) startuje LED1 przez powiedzmy 60000 ms. (na wyjściu 4 stan niski)
  2. Po zgaśnięciu LED1 zapala się LED2  i świeci przez podobny czas.
  3. Wszystko dzieje się tylko wtedy kiedy przycisk jest wciśnięty (przekaźnik zwarty)
  4. Kiedy przycisk(przekaźnik) jest rozwarty obie diody są wyłączone. Stan pinów 4 i 5 jest HIGH
  5. Wyłączenie następuje z 5- sekundowym opóźnieniem.

W tej chwili nie potrafię sprawić by po rozwarciu przycisku diody zgasły.

 #define LED1 4
#define LED2 5
#define PRZYCISK 3
 
int stanLED1 = LOW;
int stanLED2 = LOW;
 
unsigned long miganieLED1 = 1000;
unsigned long miganieLED2 = 200;
 
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasLED1 = 0;
unsigned long zapamietanyCzasLED2 = 0;
 
void setup(){
  Serial.begin(9600);
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(PRZYCISK, INPUT);
}
 
void loop(){
  //Pobierz liczbe milisekund od startu
  aktualnyCzas = millis();
 
  //Jeśli przycisk jest wciśniety migaj szybciej
  if (digitalRead(PRZYCISK) == HIGH) {
    miganieLED1 = 100;
  } else {
    miganieLED1 = HIGH;
  }
  
  //Jeśli różnica wynosi ponad miganieLED1
  if (aktualnyCzas - zapamietanyCzasLED1 >= miganieLED1) {
    //Zapamietaj aktualny czas
    zapamietanyCzasLED1 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stanLED1 = !stanLED1;
    //ustawiamy nowy stan na diodzie
    digitalWrite(LED1, stanLED1);
  }
 
    //Jeśli różnica wynosi ponad miganieLED2
  if (aktualnyCzas - zapamietanyCzasLED2 >= miganieLED2) {
    //Zapamietaj aktualny czas
    zapamietanyCzasLED2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stanLED2 = !stanLED2;
    //ustawiamy nowy stan na diodzie
    digitalWrite(LED2, stanLED2);
  }
  
  //Jeśli różnica wynosi ponad miganieLED1
  if (aktualnyCzas - zapamietanyCzasLED1 >= miganieLED1) {
    //Zapamietaj aktualny czas
    zapamietanyCzasLED1 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stanLED1 = !stanLED1;
    //ustawiamy nowy stan na diodzie
    digitalWrite(LED1, stanLED1);
  }
 
    //Jeśli różnica wynosi ponad miganieLED2
  if (aktualnyCzas - zapamietanyCzasLED2 >= miganieLED2) {
    //Zapamietaj aktualny czas
    zapamietanyCzasLED2 = aktualnyCzas;
    //Zmieniamy stan diody na przeciwny
    stanLED2 = !stanLED2;
    //ustawiamy nowy stan na diodzie
    digitalWrite(LED2, stanLED2);
  }
}

 

Edytowano przez Albert1972

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, Albert1972 napisał:

W tej chwili nie potrafię sprawić by po rozwarciu przycisku diody zgasły.

Po pierwsze pokaż proszę który fragment kodu jest za to odpowiedzialny... 

Po drugie może zacznij na początek od jednej diody(pompy), a jak zacznie działać to pomyślisz o drugiej, ok. Napisz kod dla jednej i napisz co nie działa, bo na razie to pomieszanie z poplątaniem;) 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
2 godziny temu, SOYER napisał:

Po pierwsze pokaż proszę który fragment kodu jest za to odpowiedzialny... 

Po drugie może zacznij na początek od jednej diody(pompy), a jak zacznie działać to pomyślisz o drugiej, ok. Napisz kod dla jednej i napisz co nie działa, bo na razie to pomieszanie z poplątaniem;) 

Już działa  choć nie do końca jeszcze tak jak chciałem. Teraz jeśli jadna pompa działa powiedzmy przez minutę to i druga musi tak działać a chciałbym mówc ustawiać czasy niezależnie dla Pompy  i  Pompa2

#include "DHT.h"
#define DHTPIN 2                                     // przypisany pin
#define DHTTYPE DHT22                                // typ czujnika DHT
DHT dht(DHTPIN, DHTTYPE);
const int RELAY1 = 3;                                   // Pin miernika poziomu cieczy - wejście 3
const int POMPA = 4;                                    // Pin pompy napełniającej - wyjście 4
const int POMPA2 = 5;                                   // Pin pompy mieszającej - wyjście 5
const int POMPA3 = 6;                                   // Pin pompy mineralizującej - wyjście 6
int stanRELAY1 = LOW;
int stanPOMPY = LOW;
int stanPOMPY1 = LOW;
int stanPOMPY2 = LOW;


//unsigned long pracaPOMPY = 60000;
//unsigned long pracaPOMPY2 = 60000;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasPOMPY = 0;
unsigned long zapamietanyCzasPOMPY2 = 0; 
unsigned long opoznienie = 60000;


void setup() {
 //otwarcie portu i ustawienie prędkości na 9600 bodów
  Serial.begin(9600);
  //dopóki serial monitor nie jest otwarty NIE rób nic
  while (!Serial) ;
  // Testuj czujnik DHT 22 (Ciągnie z biblioteki)
  Serial.println("DHTxx test!");
  dht.begin();
    pinMode(RELAY1, INPUT);
    pinMode(POMPA, OUTPUT);
    pinMode(POMPA2, OUTPUT);
    pinMode(POMPA3, OUTPUT);
    
}

void loop() {
       unsigned long aktualnyCzas = millis();                            //Pobierz liczbe milisekund od startu
       stanRELAY1 = digitalRead(RELAY1);                   // Odczyt stanu przekaźnika miernika poziomu cieczy:
       if (stanRELAY1 == HIGH) {                           // Sprawdź czy przekaźnik poziomu cieczy jest zwarty. Jeśli tak zbiornik nie jest pełny, więc ustaw stanRELAY1 na HIGH:
       
    digitalWrite(POMPA, stanPOMPY);
    digitalWrite(POMPA2, !stanPOMPY);
 
  if (aktualnyCzas - zapamietanyCzasPOMPY > opoznienie) {
 
    zapamietanyCzasPOMPY = aktualnyCzas;
    if (stanPOMPY  == LOW)
      stanPOMPY  = HIGH;
    else
      stanPOMPY  = LOW;
   
  
  }
}else{
   digitalWrite(POMPA, HIGH);
    digitalWrite(POMPA2, HIGH);
}

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
   Serial.println("Błędny odczyt czujnika DHT");
   } else {
    Serial.print("Wilgotność: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperatura: "); 
    Serial.print(t);
    Serial.print(" *C ");
    if(stanRELAY1){
       Serial.print("Napełnianie");
       } else {Serial.print("Zbiornik pełny");
       
        
       }
        Serial.println("");
          delay(2000);
    }
 }
 

Komentarzami proszę się nie sugerować narazie 😄

Edytowano przez Albert1972

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...