Skocz do zawartości

Budowa generator Ozonu


vadim1983

Pomocna odpowiedź

Witam.

Nie wiem czy w dobrym dziale napisałem , jeżeli w złym to proszę o przeniesienie moderatora ale sprawa wygląda następująco.

Jestem początkującym jeżeli chodzi o arduino i elektronikę.

Buduje właśnie swój pierwszy projekt- generator ozonu w obudowie drewnianej z dwoma wentylatorami (wdmuchującym i wydmuchującym), sterowanymi z arduino nano v3 przez przekaźniki wyzwalane załączane stanem niskim, całość jest zasilana zasilaczem mean well 5V 2A ,wentylatory i generator 230V.

Sprawę sprzętową wydaje mi się że mam ogarniętą.

Mam dwie wersje programu 1 jak niżej , a 2 jest nieosiągalna ze względu na brak wiedzy.

Problem polega na tym iż nie wiem czy dobrze napisałem program.

Całość ma działać tak wersja 1:

-włączenie zasilania przyciskiem,

-naciśnięcie przycisku monostabilnego ,

-włączenie zasilania(przekaźnika generatora) na 5 minut,

-odczekanie 20sekund włączenie  zasilania (przekaźnika wentylatorów) na 5 minut,

-po 5 minutach zakończenie programu,

Czy mógłby ktoś zerknąć na program i udzielić jakichś sugestii??

Proszę o wyrozumiałość i pomoc w zrealizowaniu projektu.

Mam dwie obawy Patrz pogrubiona trzcionka w programie

A o to i program

const int przekaznikGen = 10;   // pin do sterowania przekaznikiem generatora(stan niski)
const int przekaznikWen = 11;   // pin do sterowania przekaznikiem wentylatorow (stan niski)
const int przycisk = 9 ;       // pin przycisku mono stabilnego sterowany masą

int stanGen = LOW;
int stanWen = LOW;

long czasPracyGeneratora = 300000; //czas pracy po nacisnieciu przycisku
long czasPracyWenrtylatorow= 300000;//czas pracy po nacisnieciu przycisku

long start = 0;
long startPrzekaznikaGen = 0;
long startPrzekaznikaWen = 20000;   // start po 20 sekundach a może  powinno wyglądać to tak(long startPrzekaznikaWen = start + 20000 ????)


void setup() {

  pinMode(przekaznikGen,OUTPUT); //ustawienie pinu 10 wyjscie
  pinMode(przekaznikWen,OUTPUT); //ustawienie pinu 11 wyjscie
  pinMode(przycisk,INPUT_PULLUP); // pin 9 wejscie po nacisnieciu o przycisku

  digitalWrite(przekaznikGen, HIGH); // stan poczatkowy przekaznika wysoki >2,5V czy tu może być stan wysoki??
  digitalWrite(przekaznikWen, HIGH); //stan poczatkowy przekaznika wysoki  >2,5V czy tu może być stan wysoki??

}

void loop(){
 
  if (digitalRead(przycisk) == HIGH) {
  digitalWrite(przekaznikGen, HIGH);
  digitalWrite(przekaznikWen, HIGH);  
  } else
  start = millis();
 
  if (start - startPrzekaznikaGen >= 300000) {
    startPrzekaznikaGen = start;        // zapamiętaj czas
    stanGen = !stanGen;
    digitalWrite(przekaznikGen, stanGen);
  }
  if (start - startPrzekaznikaWen >= 300000) {
    startPrzekaznikaWen = start;        //zapamiętaj czas
    stanWen = !stanWen;
    digitalWrite(przekaznikWen, stanWen);
    
  }
}

 
 Fotki z realizacji w późniejszym czasie.

Pozdrawiam. 
 

Link do komentarza
Share on other sites

//zalecam używanie #define zamiast zmiennych, jest to dobrym nawykiem ponieważ oszczędza pamięć mikrokontrolera
#define przekaznikGen 10   // pin do sterowania przekaznikiem generatora(stan niski)
#define przekaznikWen 11   // pin do sterowania przekaznikiem wentylatorow (stan niski)
#define przycisk 9       // pin przycisku mono stabilnego sterowany masą

#define startWent 20
#define stopWent 320
#define stopGen 300

int czas = 0;

void setup() 
{
  pinMode(przekaznikGen,OUTPUT); //ustawienie pinu 10 wyjscie
  pinMode(przekaznikWen,OUTPUT); //ustawienie pinu 11 wyjscie
  pinMode(przycisk,INPUT_PULLUP); // pin 9 wejscie po nacisnieciu o przycisku

  digitalWrite(przekaznikGen, HIGH); // stan poczatkowy przekaznika wysoki >2,5V czy tu może być stan wysoki?? //może
  digitalWrite(przekaznikWen, HIGH); //stan poczatkowy przekaznika wysoki  >2,5V czy tu może być stan wysoki?? //może
}

void loop()
{   //zalecam używanie timera, można go wykorzystywać do wieu rzeczy na raz i znacznie upraszcza obliczenia dalszej części kodu
/////////////////////////////TIMER////////////////////////////////////////////////////////////////////////////////////////////////
  static unsigned long zapamietanyCzas = 0;
  unsigned int roznicaCzasu = millis() - zapamietanyCzas;
  if(roznicaCzasu >= 1000) //co 1000ms
  {
    zapamietanyCzas = millis();
    if(czas <= stopWent) czas++; 
  }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (! digitalRead(przycisk)) czas = 1;//wciśnięcie przycisku spowoduje przedłużenie czasu pracy
  // jeśli chcesz żeby przycisk reagował dopiero po upływie cyklu wykorzystaj poniższą funkcję
  // if ((! digitalRead(przycisk))&&((czas > stopWent))) czas = 1;
  //pamiętaj o korekcji stuków przycisków (ten program akurat nie wymaga tego)
  if((czas > startWent) && (czas <= stopWent))digitalWrite(przekaznikWen, LOW);
  else digitalWrite(przekaznikWen, HIGH);

  if((czas > 0) && (czas <= stopGen))digitalWrite(przekaznikGen, LOW);
  else digitalWrite(przekaznikGen, HIGH);
} 

Mam nadzieję, że pomoże. Pozdrawiam.

Ps. jeśli używasz przekaźników to pamiętaj żeby dać diodę równolegle do cewki podłączoną w kierunku zaporowym. Przekaźniki muszą być sterowane tranzystorami, bo wyjścia z arduino są za słabe. Jeśli masz pytania to zadawaj śmiało.

Edytowano przez Adam_
  • Lubię! 2
Link do komentarza
Share on other sites

(edytowany)

Hej.

Mam problem z tym kodem.  Chciałbym żeby algorytm wyglądał tak

-właczenie zasilania arduino czeka na naciśniecie przycisku

-naciśniecie przycisku monostabilnego (start programu 5min.)

-włącza generator i odmierza 20 sekund (po 20 sekundach od naciśnięcia przycisku startują wentylatory)

-po 5 minutach arduino oczekuje na nacisnięcie przycisku,

A wygląda to tak, że po włączeniu zasilania startuje układ od razu.

 

Edytowano przez vadim1983
Link do komentarza
Share on other sites

// używanie #define zamiast zmiennych, nie zawsze jest dobrym pomysłem ponieważ każda definicja jest to stała
// wklejana w kod za każdym razem zajmując odpowniednią ilość miejsca w pamięci flash. Jeśli zatem zdefiniujemy stałą zajmującą 1baj i wywołamy definicję 100razy tym sposobem mamy zajęte 100 bajtów pamięci flash. Definiując zmienną typu uint8_t zajmujemy 1 bajt pamięci sram bez różnicy na liczbę wywołań.

#define przekaznikGen 10   // pin do sterowania przekaznikiem generatora(stan niski)
#define przekaznikWen 11   // pin do sterowania przekaznikiem wentylatorow (stan niski)
#define przycisk 9       // pin przycisku mono stabilnego sterowany masą

#define OPOZNIENIE_WENTYLATORA 20000 // ms
#define CZAS_PRACY_W_MINUTACH 5
#define KONIEC_PRACY(minuty) ((minuty) * 60000) //60s * 1000ms

int czas = 0;

//bool buttonPressed = 0;

void setup() 
{
  pinMode(przekaznikGen,OUTPUT); //ustawienie pinu 10 wyjscie
  pinMode(przekaznikWen,OUTPUT); //ustawienie pinu 11 wyjscie
  pinMode(przycisk,INPUT_PULLUP); // pin 9 wejscie po nacisnieciu o przycisku
// piny są domyślnie skonfigurowane ze stanem niskim 
}

void loop()
{  
unsigned long zapamietanyCzas = 0;
  
if(digitalRead(przycisk)) delay 1; // nie włączone, sprawdź za milisekundę
else{							// włączone
  digitalWrite(przekaznikGen, 1); 
  zapamietanyCzas = millis() + KONIEC_PRACY(CZAS_PRACY_W_MINUTACH);
  
  delay(OPOZNIENIE_WENTYLATORA); // czekaj na włączenie wentylatora.
  digitalWrite(przekaznikWen, 1);
  
  while(zapamietanyCzas > millis()){ // czeka na koniec pracy
    // jeśli przycisk wciśnięty w trakcie pracy, wyłącza urządzenia przed czasem
    if(!digitalRead(przycisk)){
      delay(200); // czas na zwolnienie przycisku i przeczekanie drgań styków
      // Przyciski powodują tzw. drgania styków co sprawia, że może zostać wykryte wielkokrotne
      // naciśnięcie zamiast pojedynczego.
      break; 
    }
  }
  // wyłącz oba urządzenia i przejdz na początek pętli
  digitalWrite(przekaznikGen, 0); 
  digitalWrite(przekaznikWen, 0);
}
} 
 
Edytowano przez Anonim
brakowało nawiasu + drobiazgi
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dnia 13.03.2020 o 15:56, atMegaTona napisał:

// używanie #define zamiast zmiennych, nie zawsze jest dobrym pomysłem ponieważ każda definicja jest to stała
// wklejana w kod za każdym razem zajmując odpowniednią ilość miejsca w pamięci flash. Jeśli zatem zdefiniujemy stałą zajmującą 1baj i wywołamy definicję 100razy tym sposobem mamy zajęte 100 bajtów pamięci flash. Definiując zmienną typu uint8_t zajmujemy 1 bajt pamięci sram bez różnicy na liczbę wywołań.

#define przekaznikGen 10   // pin do sterowania przekaznikiem generatora(stan niski)
#define przekaznikWen 11   // pin do sterowania przekaznikiem wentylatorow (stan niski)
#define przycisk 9       // pin przycisku mono stabilnego sterowany masą

#define OPOZNIENIE_WENTYLATORA 20000 // ms
#define CZAS_PRACY_W_MINUTACH 5
#define KONIEC_PRACY(minuty) ((minuty) * 60000) //60s * 1000ms

int czas = 0;

//bool buttonPressed = 0;

void setup() 
{
  pinMode(przekaznikGen,OUTPUT); //ustawienie pinu 10 wyjscie
  pinMode(przekaznikWen,OUTPUT); //ustawienie pinu 11 wyjscie
  pinMode(przycisk,INPUT_PULLUP); // pin 9 wejscie po nacisnieciu o przycisku
// piny są domyślnie skonfigurowane ze stanem niskim 
}

void loop()
{  
unsigned long zapamietanyCzas = 0;
  
if(digitalRead(przycisk)) delay 1; // nie włączone, sprawdź za milisekundę
else{							// włączone
  digitalWrite(przekaznikGen, 1); 
  zapamietanyCzas = millis() + KONIEC_PRACY(CZAS_PRACY_W_MINUTACH);
  
  delay(OPOZNIENIE_WENTYLATORA); // czekaj na włączenie wentylatora.
  digitalWrite(przekaznikWen, 1);
  
  while(zapamietanyCzas > millis()){ // czeka na koniec pracy
    // jeśli przycisk wciśnięty w trakcie pracy, wyłącza urządzenia przed czasem
    if(!digitalRead(przycisk)){
      delay(200); // czas na zwolnienie przycisku i przeczekanie drgań styków
      // Przyciski powodują tzw. drgania styków co sprawia, że może zostać wykryte wielkokrotne
      // naciśnięcie zamiast pojedynczego.
      break; 
    }
  }
  // wyłącz oba urządzenia i przejdz na początek pętli
  digitalWrite(przekaznikGen, 0); 
  digitalWrite(przekaznikWen, 0);
}
} 

 

Cześć.

Układ dalej startuje po włączeniu zasilania i działa dłużej niż 5 minut , dopiero naciśnięcie przycisku wyłącza przekaźnik generatora ozonu i po 20 sekundach wentylatory.

Ponowne naciśniecie przycisku włącza układ.

Poprawiłem linijkę if(digitalRead(przycisk)) delay 1; bo kompilator wywalał mi błąd. Dodałem nawiasy po delay (1).

Co ma znaczyć wpis

//bool buttonPressed = 0;

??

Link do komentarza
Share on other sites

2 godziny temu, vadim1983 napisał:

Co ma znaczyć wpis

//bool buttonPressed = 0;

??

Nic, jest wykomentowany ;]

To że działa dłużej może być spowodowane niedokładnością oscylatora taktującego. Rezonatory mają jakąś tolerancję, oscylatory RC jeszcze większą, która to sprawia, że faktyczna częstotliwość może się różnić od nominalnej.  Przy małych odcinkach czasu nie jest to może aż tak uciążliwe ale przy dłuższych, liczonych w minutach może już być widoczne. Do dokładnego odmierzania czasu należy używać układów RTC z kwarcem zaprojektowanym właśnie w tym celu i skalibrowanych do dokładnego pomiaru czasu rzeczywistego. 

Najprostszym rozwiązaniem będzie eksperymentalne ustalenie opóźnienia lub dodanie RTC do projektu. Jest również możliwe wykorzystanie timera atmegi jako generator podstawy czasu RTC wymieniając kwarc w arduino na zegarkowy ale to wymaga ingerencji w płytkę.

Jeśli działa znacząco dłużej możesz w tym miejscu:

#define KONIEC_PRACY(minuty) ((minuty) * 60000) //60s * 1000ms

zmniejszyć ilość ms w minucie. Na innej płytce może działać krócej, w różnych temperaturach też będzie działać z różną prędkością ale można próbować mniej więcej dopasować aby spełniało założenia projektu.

To makro to taki przykład aby pokazać, że tak się da. Możesz zmienić nazwę na własną, lepiej oddającą pełnioną przez nie funkcję.

Edytowano przez Anonim
literówki
Link do komentarza
Share on other sites

Dopiero do mnie dotarło, że włączasz przekaźniki stanem niskim...

#define przekaznikGen 10   // pin do sterowania przekaznikiem generatora(stan niski)
#define przekaznikWen 11   // pin do sterowania przekaznikiem wentylatorow (stan niski)
#define przycisk 9       // pin przycisku mono stabilnego sterowany masą

#define OPOZNIENIE_WENTYLATORA 20000 // ms
#define CZAS_PRACY_W_MINUTACH 5
#define KONIEC_PRACY(minuty) ((minuty) * 60000) //60s * 1000ms

#define PRZEKAZNIK_ON 0
#define PRZEKAZNIK_OFF 1
  
int czas = 0;

//bool buttonPressed = 0;

void setup() 
{
  pinMode(przekaznikGen,OUTPUT); //ustawienie pinu 10 wyjscie
  pinMode(przekaznikWen,OUTPUT); //ustawienie pinu 11 wyjscie
  pinMode(przycisk,INPUT_PULLUP); // pin 9 wejscie po nacisnieciu o przycisku
// piny są domyślnie skonfigurowane ze stanem niskim 
// przez co może się zdarzyć, że urządzenia po włączeniu zasilania
// mogą się na krótką chwilę załączyć zanim mikrokontroler uruchomi program
// Należy samemu zadbać o odpowiedni stan na wyjściach sterujących za pomocą podciągu rezystorem 
// do zasilania 
  digitalWrite(przekaznikGen, PRZEKAZNIK_OFF);
  digitalWrite(przekaznikWen, PRZEKAZNIK_OFF);
}

void loop()
{  
unsigned long zapamietanyCzas = 0;
  
if(digitalRead(przycisk)) delay 1; // nie włączone, sprawdź za milisekundę
else{							// włączone
  digitalWrite(przekaznikGen, PRZEKAZNIK_ON); 
  zapamietanyCzas = millis() + KONIEC_PRACY(CZAS_PRACY_W_MINUTACH);
  
  delay(OPOZNIENIE_WENTYLATORA); // czekaj na włączenie wentylatora.
  digitalWrite(przekaznikWen, PRZEKAZNIK_ON);
  
  while(zapamietanyCzas > millis()){ // czeka na koniec pracy
    // jeśli przycisk wciśnięty w trakcie pracy, wyłącza urządzenia przed czasem
    if(!digitalRead(przycisk)){
      delay(200); // czas na zwolnienie przycisku i przeczekanie drgań styków
      // Przyciski powodują tzw. drgania styków co sprawia, że może zostać wykryte wielkokrotne
      // naciśnięcie zamiast pojedynczego.
      break; 
    }
  }
  // wyłącz oba urządzenia i przejdz na początek pętli
  digitalWrite(przekaznikGen, PRZEKAZNIK_OFF); 
  digitalWrite(przekaznikWen, PRZEKAZNIK_OFF);
}
} 

Można dać pull-up rezystorem 470ohm do 5V na pinach 10 i 11.

Link do komentarza
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.