06-03-2016, 17:42
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
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