• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wytrawiarka PCB
#1
Witam czy ktoś pomoże?
Chcę zrobić wytrawiarke według projektu kol. Wojtekizh z dzialu inne.
Niestety poległem na tym projekcie.
Najlepiej gdyby do tego ustosunkowal się Wojtekizh bo zna projekt ale każda pomoc będzie mile widziana.  Ale do rzeczy;
Po włączeniu pojawia się 1 ekran powitalny z napisem i funkcją ustawiania temperatury. Naciśniecie przycisku OK włącza 2 ekran wyswietlający czas i temperature aktualną. Chciałbym aby dłuższe przytrzymanie OK otwierało 3 ekran sterujący przekaznikiem na pinie 10 w którym można niezależnie ustawic czas pracy i przerwy w zakresie 0-30 sekund. naciśniecie OK zatwierdzało by ustawienia a dłuższe  Wracało by do wyswietlania 2 ekranu czyli temperatury.
Pomózcie bo sam sobie nie radzę.
Z góry dziękuje za pomoc a to program.
Przepraszam ale nie wiem jak to dołączyć inaczej


/*Projekt uP wytrawiarki PCB autorstwa Wojtekizh zmodyfikowany i skosmetykowany przez:
* Marek K | mkxyronsr@gmail.com
*/
#include <Wire.h>
#include <DallasTemperature.h>   // dołączona biblioteka DallasTemperature (dla czujnika)
#include <LiquidCrystal.h>       //  dołączona biblioteka LiquidCrystal
#include <Timers.h>  // dołączona biblioteka Timers (konieczna do poprawnej pracy ... jest w załączniku)
Timers <8> akcja;    // na poczatek 8 niezależnych wątków (procesów, zadań, procedur, akcji itp.)
LiquidCrystal lcd(8,9,4,5,6,7);  // definiujemy LCD
// pin 4 do DB4
// pin 5 do DB5
// pin 6 do DB6
// pin 7 do DB7
// pin 8 do RS
// pin 9 do E
// wolny pin 10
#define UP 1                     // klawisz UP na pinie 1
#define DOWN 0                   // klawisz DOWN na pinie 0
#define OK 2                     // klawisz OK na pinie 2
#define przekaznik 13            // przekaźnik na pinie 13
#define motor1Pin 12             // motor1Pin na pinie 12
#define motor2Pin 11             // motorPin2 na pinie 11
#define buzzer 3                 // buzzer na pinie 3
volatile boolean kier=false;     // kierunek ruchu mieszalnika
volatile boolean startT=false;   // start mieszalnika
long czas=0;                     // czas od chwili startu
long licznikOk = 0;
long s=0;                        // chwila startu
int minuty=0, sekundy=0;         // chyba jasne :-)
int ustaw=40;                    // zadana temperatura początkowa
volatile int cz=600;             // zadany poczatkowy czas ruchu mieszalnika

// --- funkcje dla ruchu mieszalnika -----------------------------------

void r0()                        // zatrzymanie mieszalnika
{
 digitalWrite(motor1Pin,LOW);
 digitalWrite(motor2Pin,LOW);
}

void rP()                        // ruch mieszalnika w lewo
{
 digitalWrite(motor1Pin,LOW);
 digitalWrite(motor2Pin,HIGH);
}

void rT()                        // ruch mieszalnika w prawo
{
 digitalWrite(motor1Pin,HIGH);
 digitalWrite(motor2Pin,LOW);
}

// --- funkcja ustawienia zadanej temperatury --------------------------

// tylko w tej jedynej funkcji użyłem delay, i tylko dlatego aby zapobiec drganiom styków
// oraz aby spowolnić szybkość zwiększania lub zmniejszania wymaganej temperatury.
// Ta funkcja jest uruchamiana w setupie zanim w loopie uruchomię obsługę zdarzeń :-)
void setTemp()
{
 while(digitalRead(OK)!=LOW) // dopóty nie wcisniemy klawisza OK, ustawiamy wymaganą temperaturę roztworu
 {
   // poniżej inkrementacja (zwiększanie) lub dekremantacja (zmniejszanie) wymaganej temperatury w procesie
   if(digitalRead(UP)==LOW)
   {
     delay(30);
       if(digitalRead(UP)==LOW)
       {
         Buzzer(5);
         ustaw++;
           if(ustaw>80)
           ustaw=80;
         lcd.setCursor(12,1);
         lcd.print(ustaw);
       }
   }
   if(digitalRead(DOWN)==LOW)
   {
     delay(30);
     if(digitalRead(DOWN)==LOW)
     {
       Buzzer(5);
       ustaw--;
         if(ustaw<10)
         ustaw=10;
       lcd.setCursor(12,1);
       lcd.print(ustaw);
      }
    }
   delay(80); // raczej konieczne dla mojego refleksu :-), owo spowolnienie...
 }
 
 //Potrójne piknięcie jako potwierdzenie
 Buzzer(20);
 delay(30);
 Buzzer(20);
 delay(30);
 Buzzer(20);
 
 startT=true; // zezwolenie na start mieszalnika
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("CZAS TEMP SILNIK"); // kosmetyka LCD, pierwsza linia
 pokazCzas();
 pokazTemp(); // a w drugiej linii pokazuję stoper i akt. temperaturę
}  
// --- reakcja na wciśnięty przycisk OK  w pętli loop ----------------
void buttonOK()
{
if(digitalRead(OK)==LOW)
{
 Buzzer(50);
 startT=!startT;
 akcja.updateInterval(2,5);
}

}

// --- reakcja na wciśniety przycisk DOWN w pętli loop ------------------
void buttonDOWN()
{
if(digitalRead(DOWN)==LOW)
 {
   Buzzer(20);
 if(startT==true){cz-=50;;if(cz<50)cz=50;} // dynamicznie zmniejsza czas ruchu mieszalnika w krokach co 50 ms.
 else
   {
    akcja.updateInterval(2,0); // zatrzymuje proces pokazywania akt. temperatury
    ustaw--;
    if(ustaw<10)
     ustaw=10; // dynamicznie zmniejsza wymaganą temperaturę w krokach co 1 st.
    lcd.setCursor(6,1);
    lcd.print(" ");
    lcd.setCursor(6,1);
    lcd.print(ustaw);
    lcd.print(" oC "); // kosmetyka LCD
   }
 }
}

// --- reakcja na wciśnięty przycisk UP w pętli loop --------------------
void buttonUP()
{
// dynamicznie zwiększa czas ruchu mieszalnika w krokach co 50 ms
if(digitalRead(UP)==LOW)
 {
   Buzzer(20);
   if(startT==true)
     {
       cz+=50;
       if(cz>3000)
       cz=3000;
     }
   else
     {
       akcja.updateInterval(2,0); // zatrzymuje proces pokazywania akt. temperatury
       ustaw++;
         if(ustaw>80) // dynamicznie zwiększa wymaganą temperaturę w krokach co 1 st.
         ustaw=80;
       lcd.setCursor(6,1);
       lcd.print(" ");
       lcd.setCursor(6,1);
     lcd.print(ustaw);
     lcd.print(" oC "); // kosmetyka LCD
   }
 }
}

// --- zmiana kierunku ruchu mieszalnika + kosmetyka LCD ----------------
void flopKierunek()
{
 kier=!kier;
 r0();
 lcd.setCursor(11,1);
 lcd.print(" OFF "); // zatrzymanie mieszalnika
 if(kier==true) // ruch do przodu + kosmetyka LCD
 {
   rP();
   lcd.setCursor(11,1);
   lcd.print(" ->>>");
 }
 else // ruch do tyłu + kosmetyka LCD
 {
   rT();
   lcd.setCursor(11,1);
   lcd.print(" <<<-");
 }
}

// --- pokaz czasu pracy ------------------------------------------------
void pokazCzas()
{
 char buf[20];
 memset(buf,0,sizeof(buf)); // zamiast pozycjonowania LCD proponuję to właśnie
 czas=(millis()-s)/1000; // czas w sekundach
 minuty=czas/60;sekundy=czas%60;          // obliczamy mniuty i sekundy
 if(minuty>59)
 {
   minuty=0;
   sekundy=0;
 } // po przekroczeniu 60 minut liczymy od nowa
 snprintf(buf,sizeof(buf),"%02d:%02d",minuty,sekundy); // sprytna funkcja (radzę poczytać o niej :-)
 lcd.setCursor(0,1);lcd.print(buf); // kosmetyka LCD
}

// ---  pokaz aktualnej temperatury --------------------------------------
void pokazTemp()
{
 int sensorValue = analogRead(A1);        // czujnik temperatury na pin A1
 float temp = sensorValue * 0.48828125;
 //float temp = sensorValue * (5.0 * 100.0/1023.0); // przeliczamy (wzór zalezy od czujnika)
 lcd.setCursor(6,1);lcd.print(" ");lcd.setCursor(6,1);lcd.print((int)temp);lcd.print(" oC"); // kosmetyka LCD
 if(temp < ustaw) { digitalWrite(przekaznik,HIGH); lcd.setCursor(11,1);lcd.print("*");} // właczamy grzałkę i gwiazdkę na LCD
 if(temp > ustaw+1){ digitalWrite(przekaznik,LOW); lcd.setCursor(11,1);lcd.print(" ");} // lub nie (histereza 1 st.C)
}

// --- ekran powitalny ---------------------------------------------------
void kosmetykaLCD()
{
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("WYTRAWIARKA PCB:");
 lcd.setCursor(0,1);
 lcd.print("TEMP CIECZY=");
 lcd.print(ustaw);
 lcd.print("oC");
}
// ------------------------------------------------------------------------

// --- Buzzer---------------------------------------------------
void Buzzer(int czas)
{
  digitalWrite(buzzer,HIGH);
  delay(czas);
  digitalWrite(buzzer,LOW);
}
// ------------------------------------------------------------------------

void setup()
{
 pinMode(motor1Pin,OUTPUT);digitalWrite(motor1Pin,LOW); // stop motor
 pinMode(motor2Pin,OUTPUT);digitalWrite(motor2Pin,LOW); // stop motor
 pinMode(buzzer,OUTPUT);digitalWrite(buzzer,LOW);       // stop buzzer
 pinMode(UP,INPUT_PULLUP);   // klawisz UP
 pinMode(DOWN,INPUT_PULLUP); // klawisz DOWN
 pinMode(OK,INPUT_PULLUP);   // klawisz OK
 lcd.begin(16,2); kosmetykaLCD();   // powitanie :-)
 setTemp();                         // na początku ustawiam wymaganą temperaturę
 s=millis(); // sędzia odpalił na start :-), utrwalamy tę chwilę w zmiennej s
 // Teraz najważniejsze :-)
 akcja.attach(0, 1000, pokazCzas); // Wątek 1: pokazuje czas co 1 sekundę
 akcja.attach(1,0,flopKierunek); // Wątek 2: ruch mieszalnika, 0 oznacza, że na razie zatrzymany ten proces
 akcja.attach(2,5000,pokazTemp); // Wątek 3: pokazuje temperaturę co 5 sek.
 akcja.attach(3,200,buttonOK); // Wątek 4: sprawdza stan klawisza OK dla START-STOP mieszalnika, co np. 200 ms.
 akcja.attach(4,189,buttonDOWN); // Wątek 5: sprawdza stan klawisza DOWN co np. 189 ms.
 akcja.attach(5,211,buttonUP); // Watek 6: sprawdza stan klawisza UP co np. 211 ms.
 // i tu mała uwaga... aby uniknąć sytuacji jednoczesnego uruchamiania kilku wątków dobrze jest używać liczb pierwszych
 // jako drugiego parametru funkcji attach :-) Nie jest to jednak krytyczne.
}
// -------------------------------------------------------------------------
void loop()
{
 akcja.process(); // inicjalizacja lub aktualizacja wszystkich procedur(wątków, zdarzeń itp.)
 if(startT==true) // a teraz uruchamiam ruch mieszalnika ze zmianą co cz [ms]
 {
   akcja.updateInterval(1,cz);
 }
 else
 {
   r0();
   lcd.setCursor(11,1);
   lcd.print(" OFF ");
   akcja.updateInterval(1,0); // 0 oznacza stop akcji (dla ruchu mieszalnika)
 }
}
// program do dalszej modyfikacji
// =================================================================== KONIEC
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości