Łącznie dwóch programów, termoregulator+stoper

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 7 mar 2014, 21:03

Witam mam problem z połączeniem dwóch sketchy. Z programowania w a arduino nie jestem najlepszy ale coś tam kumam.
Napisałem sobie dwa programy do termoregulatora na czujniku lm35 z funkcją nastawy --> http://wklej.org/id/1292649/
oraz stoper, który po wciśnięciu przycisku zaczyna mi liczyć czas --> http://wklej.org/id/1292652/ .
Teraz chciałem połączyć te dwa programy aby mieć to na jednym wyświetlaczu. I tu pojawia się problem.
Połączyłem to tak : http://wklej.org/id/1292654/
Ale działa to tak: funkcja termoregulatora działa ładnie , dopóki nie wcisnę przycisku żeby włączyć stoper wtedy stoper odlicza a termoregulator się blokuje i nie reaguje na przyciski ani na zmianę temperatury. Jak przerobić sketch aby pięknie to śmigało ? Sądzę, że będzie tu potrzebna funkcja attachInterrupt(). Narazie testuję na arduino leonadro a puźniej przeniosę to na atmegę8.

Całość będzie mi potrzebna aby utrzymać temperaturę wytrawiacza i zobaczyć czas jak długo się już wytrawia.

Pozdrawiam

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


Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: Malen » 8 mar 2014, 00:49

Problem jest taki, że ten stoper jest w oddzielnej funkcji, która zawiera pętle nieskończoną, a w niej odliczanie czasu za pomocą delay. Aby umożliwić wyjście z tej funkcji proponuje użycie pętli do{}while(Przycisk1==LOW && Przycisk2==LOW). Umożliwi to wyjscie z funkcji liczącej. Jednak przy takiej budowie programu nie ma możliwości aby ten układ działał tak jak to sobie założyłeś. Przede wszystkim należało by zmienić sposób odliczania czasu, gdyż zapropnowany przez Ciebie system blokuje cały mikrokontroler funkcją delay, a jego dokładności nie ma nawet co wspominać. Dużo wydajniejszą metodą byłoby użycie funkcji millis(); Która zwraca w milisekundach czas który upłynął od momentu włączenia programu.

Przykład
unsigned long time;

void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
//prints time since program started
Serial.println(time);
// wait a second so as not to send massive amounts of data
delay(1000);
}
Pamiętaj jednak że nie ma możliwości aby tą funkcje zerować ręcznie. Jej licznik się przekręca automatcznie po około 2 miesiacach. Oprogramowanie termoregulatora wydaje się być ok.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 8 mar 2014, 11:40

Witam
kolega Malen ma rację, funkcja millis() jest tutaj najodpowiedniejsza i wcale nie trzeba zaprzęgać tu przerwań.
Co do dokładności to dla wytrawiarki nie jest to aż takie krytyczne. Najczęściej sam proces trwa nie więcej niż 20 minut, zaś niedokładność w tym zakresie nie przekracza 1 sek. Wiem, bo sam wykonałem onegdaj taką :-)
Niestety wtedy o Arduino jeszcze nikt nie słyszał i program trzeba było pisać w AVRStudio. Źrodła nie są obecnie do odnalezienia ale napisałem na prędce coś dla kolegi v-cu :-) Musisz sobie tylko przeanalizować ten kod i dostosować do swoich potrzeb. Zrobiłeś duży błąd wykorzystująć tu delay... W programie trzeba obilczać rożnicę czasu za pomocą funkcji millis() i potem co ok 1 sek. wyrzucać ją na ekran. Możesz przy tym niezależnie jednocześnie korygować temperaturę. Serial przerób na LCD. Myślę, że zakumasz o co biega :-)
przykładowe rozwiązanie:

Kod: Zaznacz cały

long czas=0; // czas o momentu wcisnięcia start
long s=0;    // chwila startu
long akt=0;  // aktualny pomiar czasu (milisekund)
int minuty=0, sekundy=0; // bez komentarza :-)
boolean start=false;  // pistolet sędziego  :-)
void setup()
{
  // moje piny (zmień na swoje)
  pinMode(4,INPUT_PULLUP);   // dekrementuj temp. (zmniejsz)
  pinMode(5,INPUT_PULLUP);   // inkrementuj temp. (zwiększ) 
  pinMode(6,INPUT_PULLUP);   // przycisk stopera
  Serial.begin(9600);
}
void loop()
{
// powtórzenie instrukcji if służy eliminacji drgań styków
if(digitalRead(4)==LOW){delay(30);if(digitalRead(4)==LOW)Serial.println("temp. --");}  
if(digitalRead(5)==LOW){delay(30);if(digitalRead(5)==LOW)Serial.println("temp. ++");}
if(digitalRead(6)==LOW){delay(30);if(digitalRead(6)==LOW)Serial.println("START");delay(20);start=true;}
if(start==true){s=millis();start=false;} // startujemy
if(s>0 && (millis()-akt)>999)
  {
  akt=millis();czas=(millis()-s)/1000;
  minuty=czas/60;sekundy=czas%60;
  if(minuty<10)Serial.print("0");
  Serial.print(minuty);
  Serial.print(":");
  if(sekundy<10)Serial.print("0");
  Serial.println(sekundy);
  }
delay(100);
}
Pozdrawiam
ps. Moja wytrawiarka to małe akwarium 12X20X4 cm. Wewnątrz 2 grzałki po 80W (takie małe czarne). Mniejsza moc nie sprawdziła się niestety. Jedyna wada to taka, że chlorek przywiera do plastiku i robi sie po czasie dziwny kamień.
Dodatkowo pompka do akwarium, taka zewnętrzna, bo nie znalazlem wtedy małej zanurzalnej.
Zatopiony, hermetyczny LM35 i wszystko śmiga do dzisiaj. Napowietrzanie pompką znacznie przyśpiesza i poprawia jakość wytrawiania. Roztwór lepiej jest wylewać do ciemnego naczynia i radzę ubierać b. stare ciuchy :-)
Awatar użytkownika
Marhef
Złota rączka
Posty: 1164
Rejestracja: 18 lis 2011, 02:18

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: Marhef » 8 mar 2014, 19:44

Z opisu wnioskuję, że ciągle używasz chlorku żelaza. Polecam zamienić na B327 (nadsiarczan sodu). Czysty, można przechowywać w plastiku, ładnie trawi.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 8 mar 2014, 20:51

Już tłumaczę o co chodzi :P

Wytrawiam B327 już długo, wytrawiłem już mnóstwo płytek. Wiem wojtekizk już nie raz kapło mi na koszulkę i potem na drugi dzień była czerwona :P

Ogólnie to zawsze wytrawiam w jakimś małym pudełeczku i podgrzewam opalarką albo na grzejniku i ruszam tym. Teraz w końcu trzeba by sobie ułatwić sprawę i zrobić jakąś wytrawiarkę. Założenie mam takie, żeby zrobić mieszanie takie jak tu http://majsterkowo.pl/urzadzenie-miesza ... o-cd-romu/. Nie potrzebuję całego akwarium wystarczy jakieś pudełeczko. Do tego właśnie ten termoregulator żeby mi utrzymywał temperaturę. A stoper to tylko taki bajer bo mi zostanie trochę wolnego miejsca na wyświetlaczu i ponad 3kB pamięci w uC. No chyba że macie jakiś inny pomysł żeby coś tu ciekawego dodać ? :)

Pozdrawiam

EDIT

Dobra przeanalizowałem kod i zmodyfikowałem i działa :) Super dzięki pochwała dla was koledzy :)
tu kod :
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
long czas=0;
long s=0;
long akt=0;
int minuty=0, sekundy=0;
boolean start=false;
int ustaw=40;
int przekaznik=8;
void setup()
{
  lcd.begin(16,2);

  pinMode(7,INPUT);
  pinMode(6,INPUT);
  pinMode(9,INPUT);
  lcd.setCursor(0,0);
lcd.print("00");
lcd.setCursor(2,0);
lcd.print(":");
lcd.setCursor(3,0);
lcd.print("0");
lcd.setCursor(4,0);
lcd.print(sekundy);
lcd.setCursor(0,1);
lcd.print(ustaw);
  
}
void loop()
{
  
  int sensorValue = analogRead(A0);
  float temp = sensorValue * (5.0 * 100.0/1023.0);
  lcd.setCursor(9,0);
  lcd.print(temp);
  delay(100);

if(digitalRead(7)==HIGH){delay(30);if(digitalRead(7)==HIGH) ustaw=ustaw+1; lcd.setCursor(0,1); lcd.print(ustaw); delay(200);}
if(digitalRead(6)==HIGH){delay(30);if(digitalRead(6)==HIGH) ustaw=ustaw-1; lcd.setCursor(0,1); lcd.print(ustaw); delay(200);}
if(digitalRead(9)==HIGH){delay(30);if(digitalRead(9)==HIGH) delay(20);start=true;}

if(temp < ustaw){
    digitalWrite(przekaznik,HIGH);}
    if(temp > ustaw+1){
     digitalWrite(przekaznik,LOW);}

if(start==true){s=millis();start=false;}

if(s>0 && (millis()-akt)>999){
  akt=millis();czas=(millis()-s)/1000;
  minuty=czas/60;sekundy=czas%60;

      if(sekundy >= 10) {lcd.setCursor(3,0);}
      else {lcd.setCursor(3,0);
      lcd.print("0");
      lcd.setCursor(4,0);}
      lcd.print(sekundy);
 
     if(minuty < 10){lcd.setCursor(0,0);
         lcd.print("0");
         lcd.setCursor(1,0);
         lcd.print(minuty);}
         if(minuty >= 10){ lcd.setCursor(0,0);
         lcd.print(minuty);
          lcd.setCursor(2,0);
          lcd.print(":");}
delay(100);
}
}
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 8 mar 2014, 22:41

do usług :-)
Zgadza się, czasem jednak sięgam po b327. Chlorku mam jeszcze w piwnicy ze 3 kg... więc nie kupuję nowości póki co :-) Co do płytek to wydruk laserowy na kredowym o gramaturze 120, potem 3-4 razy przez laminarkę i jest spoko ( no może czasem trzeba poprawić :-) a swoją drogą jakość samych laminatów strasznie spadła i to chyba wina chińskiej miedzi :-)
aaa... zostawiłem raz na kilka miesięcy w swoim "akwarium" B327 i efekt był jeszcze gorszy - plastik w grzałkach się pomarszczył i zrobił się biały nalot jak po odparowanej solance ..brrrr :-)
Ostatnio zmieniony 8 mar 2014, 22:58 przez wojtekizk, łącznie zmieniany 1 raz.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 8 mar 2014, 22:53

Mi pozostaje teraz tylko zaprojektowanie płytki w eaglu i włożenie tego do obudowy. :)
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 10 mar 2014, 18:37

Postanowiłem dodać jeszcze jedną funkcję mianowicie mieszanie. Klikam przycisk zaczyna mieszać, klikam jeszcze raz - przestaje. Kod taki jak w tym poradniku: http://majsterkowo.pl/urzadzenie-miesza ... o-cd-romu/ . Tylko mam rozumieć że funkcją delay nie da się tego zrobić i znowu trzeba wykorzystać funkcję millis?

Pomoże ktoś? :D
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 12 mar 2014, 21:03

Odświeżam :)
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 12 mar 2014, 22:01

Witam...
Niedalej jak wczoraj odpisałem koledze BlackIR na wiadomość dot. właśnie takiego mieszalnika :-)
Dołączam całą wiadomość i myślę że zakumasz o co biega :-)
(...cyt)
Witam... fajny pomysł i to gdzieś już było na forum...
Co do samej konstrukcji to wydaje mi się, że niezbędna jest krańcówka albo chociaż sam przycisk na końcu, Jest chyba widoczny na filmiku nr 2 :-)
Coś tam udało mi się napisać dla Ciebie...
Zakładając że będziesz używał nast. zmiennych:

boolean czy_start=false; // zmienna pomocnicza do START-STOPU
const int switchPin = 2; // krańcówka tylna (switch pokazany na drugim filmiku)
const int motor1Pin = 3; // pin silnika
const int motor2Pin = 4; // pin silnika
const int enablePin = 9; // to jest ten Start-Stop (z przodu CD)
const int upPin=5; // button zmiany czasu w delay UP
const int downPin=6; // button zmiany czasu w delay DOWN
const int zmiana=50; // jednostkowa zmiana czasu, przykładowo o 50 ms.
volatile int cz=500; // początkowy czas ruchu dla delay
... to mamy taki programik:

Kod: Zaznacz cały

boolean czy_start=false;  // zmienna pomocnicza do START-STOPU 
const int switchPin = 2;  // krańcówka tylna (switch pokazany na drugim filmiku) 
const int motor1Pin = 3;  // pin silnika  
const int motor2Pin = 4;  // pin silnika   
const int enablePin = 9;  // to jest ten Start-Stop (z przodu CD)
const int upPin=5;        // button zmiany czasu w delay UP 
const int downPin=6;      // button zmiany czasu w delay DOWN
const int zmiana=50;      // jednostkowa zmiana czasu, przykładowo o 50 ms.
volatile int cz=500;      // czas ruchu
// -------------------------------------------------------------------------------------------
void r0(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,LOW); } // zatrzymanie tacy
void rP(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,HIGH);} // ruch tacy do przodu
void rT(){digitalWrite(motor1Pin,HIGH);digitalWrite(motor2Pin,LOW); } // ruch tacy do tyłu
// jeśli Twoja taca porusza się odwrotnie to zamień piny silnika
// -------------------------------------------------------------------------------------------
void setup()
{
  pinMode(switchPin,INPUT_PULLUP);
  pinMode(enablePin,INPUT_PULLUP);
  pinMode(upPin,INPUT_PULLUP);
  pinMode(downPin,INPUT_PULLUP);
  pinMode(motor1Pin,OUTPUT);digitalWrite(motor1Pin,LOW);
  pinMode(motor2Pin,OUTPUT);digitalWrite(motor2Pin,LOW);
  do        // to na wypadek zaniku zasilania lub zatrzymaniu się tacki w dowolnym położeniu
  {
    rT();   //jedziemy do tyłu aż naciśnie się switchPin
  }
  while(digitalRead(switchPin)!=LOW); // taka funkcja parkowania tacy :-)
}
// -------------------------------------------------------------------------------------------
void loop()
{
  if(digitalRead(switchPin)==LOW  && digitalRead(enablePin)==LOW  && czy_start==false) czy_start=true;
  if(digitalRead(enablePin)==HIGH && czy_start==true )
    {
    delay(cz);r0();rT();delay(cz);r0();rP();
    }
  if(digitalRead(switchPin)==HIGH  && digitalRead(enablePin)==LOW && czy_start==true) {r0();delay(200);czy_start=false;rT();}  
  if(digitalRead(switchPin)==LOW   && digitalRead(enablePin)==HIGH && czy_start==false)r0();
  if(digitalRead(upPin)==LOW){delay(50);if(digitalRead(upPin)==LOW)cz+=zmiana;if(cz>4000)cz=4000;} 
  if(digitalRead(downPin)==LOW){delay(50);if(digitalRead(downPin)==LOW)cz-=zmiana;if(cz<50)cz=50;} 
}
// --------------------------------------------------------------------------------------------
Podłącz przyciski zmiany czasu do pinów 5 i 6 (albo pozmieniaj w/g swojej koncepcji) i sprawdź czy śmiga jak trzeba.
UWAGA: Powinieneś potem samodzielnie dobrać czas ruchu aby tacka podczas mieszania nie miała szansy dojechania do krańcówki. Potem w odpowiednim miejscu wstaw ograniczenie czasu ( znajdziesz w kodzie gdzie to jest) Jak sobie nie poradzisz to pytaj :-)
Pozdrawiam
ps. jeśli programujesz w Javie to żaden problem z programowaniem w C, bo java to przecież czyste C++ nawet bardziej "klasowa" i obiektowa niż C++ :-)
(....koniec cytatu )
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 12 mar 2014, 22:23

Z tym że tak: w atmedze8 zostały mi tylko 3 piny wolne: 2 do mostka h oraz jeden do włącznika :)
Kod będę próbował jutro.
Pozdrawiam.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 12 mar 2014, 22:42

Witam
wystarczy jeden pin.. ten kolega miał wyższe wymagania - chciał dodatkowo zmieniać czas posuwu, więc napisałem to na 3 przyciski UP,DOWN i OK... Ty będziesz potrzebował tylko OK :-)
Pozdrawiam
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 13 mar 2014, 22:07

Próbuje z tym kodem i nie chce coś mi to działać :/. Przekształcałem go na różne sposoby ale niezbyt..

Kod: Zaznacz cały

boolean czy_start=false;  // zmienna pomocnicza do START-STOPU 
const int motor1Pin = 13;  // pin silnika  
const int motor2Pin = 12;  // pin silnika   
const int enablePin = 9;  // to jest ten Start-Stop (z przodu CD)
volatile int cz=500;      // czas ruchu
// -------------------------------------------------------------------------------------------
void r0(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,LOW); } // zatrzymanie tacy
void rP(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,HIGH);} // ruch tacy do przodu
void rT(){digitalWrite(motor1Pin,HIGH);digitalWrite(motor2Pin,LOW); } // ruch tacy do tyłu
// jeśli Twoja taca porusza się odwrotnie to zamień piny silnika
// -------------------------------------------------------------------------------------------
void setup(){
  pinMode(enablePin,INPUT_PULLUP);
  pinMode(motor1Pin,OUTPUT);digitalWrite(motor1Pin,LOW);
  pinMode(motor2Pin,OUTPUT);digitalWrite(motor2Pin,LOW);
}
// -------------------------------------------------------------------------------------------
void loop()
{
  if(digitalRead(enablePin)==LOW  && czy_start==false){  delay(30); 
   czy_start=true;  
    delay(cz);r0();rT();delay(cz);r0();rP();
    }
  if(digitalRead(enablePin)==LOW && czy_start==true) {;czy_start=false; }  
}
// --------------------------------------------------------------------------------------------
Teraz działa tak że gdy trzymam przycisk cały czas to silnik się kręci raz w lewo raz w prawo(czyli prawidłowo) a jak tylko kliknę to zakręci się raz w jedną raz w drugą i stoi. Nic się nie dzieje.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 13 mar 2014, 23:23

Witam

Kod: Zaznacz cały

void loop()
{
  if(digitalRead(enablePin)==LOW  && czy_start==false) {  delay(30); czy_start=true;}  
  if(czy_start==true) { delay(cz);r0();rT();delay(cz);r0();rP();}
  if(digitalRead(enablePin)==LOW && czy_start==true)  { delay(30);czy_start=false; }
}
powinno śmigać
Pozdrawiam
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 14 mar 2014, 20:03

Teraz działa tak, że kilkam przycisk i zaczyna mieszać ale potem nie da się tego wyłączyć ;/

EDIT:
No na siłę mogło by tak działać ale znowu gdy chcę to wkleić do reszty programu to po wciśnięciu przycisku program znowu cały się sypie tzn. nie działa regulacja temperatury, timer działa wolniej i wgl nie reaguje na przyciski.
#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);
long czas=0;
long s=0;
long akt=0;
int minuty=0, sekundy=0;
boolean start=false;
int ustaw=40;
int przekaznik=8;
boolean start2=false;
boolean czy_start=false; // zmienna pomocnicza do START-STOPU
const int motor1Pin = 0; // pin silnika
const int motor2Pin = 1; // pin silnika
volatile int cz=600;
void r0(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,LOW); } // zatrzymanie tacy
void rP(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,HIGH);} // ruch tacy do przodu
void rT(){digitalWrite(motor1Pin,HIGH);digitalWrite(motor2Pin,LOW); } // ruch tacy do tyłu
void setup()
{
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(12,INPUT_PULLUP);
  pinMode(motor1Pin,OUTPUT);digitalWrite(motor1Pin,LOW);
  pinMode(motor2Pin,OUTPUT);digitalWrite(motor2Pin,LOW);
  pinMode(9,INPUT_PULLUP);
  pinMode(10,INPUT_PULLUP);
  pinMode(11,INPUT_PULLUP);
  lcd.setCursor(0,0);
lcd.print("00");
lcd.setCursor(2,0);
lcd.print(":");
lcd.setCursor(3,0);
lcd.print("0");
lcd.setCursor(4,0);
lcd.print(sekundy);
lcd.setCursor(0,1);
lcd.print(ustaw);
  
}
void loop()
{
  
  int sensorValue = analogRead(A0);
  float temp = sensorValue * (5.0 * 100.0/1023.0);
  lcd.setCursor(9,0);
  lcd.print(temp);
  delay(150);

if(digitalRead(9)==LOW){delay(30);if(digitalRead(9)==LOW) ustaw=ustaw+1; lcd.setCursor(0,1); lcd.print(ustaw); delay(120);}
if(digitalRead(10)==LOW){delay(30);if(digitalRead(10)==LOW) ustaw=ustaw-1; lcd.setCursor(0,1); lcd.print(ustaw); delay(120);}
if(digitalRead(11)==LOW){delay(30);if(digitalRead(11)==LOW) delay(20);start=true;}
if(digitalRead(12)==LOW && czy_start==false) { delay(30); czy_start=true;}
  if(czy_start==true) { delay(cz);r0();rT();delay(cz);r0();rP();}
  if(digitalRead(12)==LOW && czy_start==true) { delay(30);czy_start=false; }
if(temp < ustaw){
    digitalWrite(przekaznik,HIGH);}
    if(temp > ustaw+1){
     digitalWrite(przekaznik,LOW);}
if(start==true){s=millis();start=false;}

if(s>0 && (millis()-akt)>999){
  akt=millis();czas=(millis()-s)/1000;
  minuty=czas/60;sekundy=czas%60;

      if(sekundy >= 10) {lcd.setCursor(3,0);}
      else {lcd.setCursor(3,0);
      lcd.print("0");
      lcd.setCursor(4,0);}
      lcd.print(sekundy);
 
     if(minuty < 10){lcd.setCursor(0,0);
         lcd.print("0");
         lcd.setCursor(1,0);
         lcd.print(minuty);}
         if(minuty >= 10){ lcd.setCursor(0,0);
         lcd.print(minuty);
          lcd.setCursor(2,0);
          lcd.print(":");}
delay(100);
}
}
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 14 mar 2014, 22:53

Witam...
przyznam, że Arduino potrafi zaskoczyć, jedna funkcja wykonuje się w mig a inna wymaga czasu (chociażby Serial).
Chyba się starzeję...bez podłączonej płytki nie umiem już przewidzieć niektórych figli procka :-)
a spróbuj może tak:

Kod: Zaznacz cały

void loop()
{
  if(digitalRead(enablePin)==LOW  && czy_start==false) {  delay(30); czy_start=true;}  
  delay(30); // na wypadek wszelki :-)
  if(digitalRead(enablePin)==HIGH  && czy_start==true) { delay(cz);r0();rT();delay(cz);r0();rP();}
  delay(30);
  if(digitalRead(enablePin)==LOW  && czy_start==true)  { delay(30);czy_start=false; }
  delay(30);
}
W ten sposób zabezpieczam się przed niespodzianką - sprawdzam wszystkie zmienne, które usiadły do ruletki :-)
Kurcze teraz to musi się dać zatrzymać... jak nie to odpalam płytkę !
Pozdrawiam
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 14 mar 2014, 23:06

Button coś teraz źle reaguje. Raz zaskoczy raz nie :/. Ale dalej problem jest z połączeniem tego z tamtym kodem.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 15 mar 2014, 09:51

Witam
Kurde uważaj kolego na powielanie pinów, rownież te niejawne :-)
const int motor1Pin = 0; // pin silnika
const int motor2Pin = 1; // pin silnika
a na pinach 0 i 1 chodzi także Serial, ktory w setupie odpalasz :
Serial.begin(9600);
Dobra w chwili wolnej pójdę do piwnicy po stykówke i postaram się mniej więcej zachować zgodność z Twoim kodem...ale uwaga piny bedą pozmieniane bo np. mam lcd na innych niż Ty :-)
Pozdrawiam
ps.
aaaa.... czy kod z Twojego postu jest tym ostatnim do którego mam zajrzeć czy masz może jakiegoś niusa ? Jeśli masz to poproszę o wklejenie.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 15 mar 2014, 10:27

Piny silnika mam na pinach 0 i 1 ponieważ tylko te mi zostały wolne. No może jeszcze pin 2 byłby wolny.

Kod narazie taki jak wyżej, nic nie zmieniałem.

PS
Nie wiem co tam w ogóle robi w setupie Serial.begin, on jest nie potrzebny, można go usunąć.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Odp: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 15 mar 2014, 17:20

Dobra włożyłem dzisiaj cały układ do obudowy i śmiga, jeden przycisk został mi wolny ale niech jest. Mieszanie najwyżej zrobię sobie później na ATtiny2313.
Zdjęcia dodam potem.
Pozdrawiam


EDIT:
No dobra nie wszystko śmiga. Jest mały problem, stan wysoki powinien wynosić około 5V a u mnie na atmedze8 jest to 0.8V z obciążeniem i bez obciążenia. Po podłączeniu przez tranzystor jest 5V ale gdy podłączę diodę lub przekaźnik pod wyjście tranzystora to spada do 2.8V i nie załącza mi przekaźnika.
Coś mi się zdaje, że problem tkwi w kodzie, ponieważ na moim arduino leonardo gdy napiszę program który steruję diodą to diodę mogę sobie podłączać bez opornika pod wyjście arduino i ona świeci słabo( nie sprawdzałem dokładnie ile volt).
A gdy zabrałem jakiś sketch z internetu, to dioda świeci mocno i potrzebuje opornika.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 15 mar 2014, 23:17

Witam...
Sorki wziąłem się za Twój kod i urodził mi się zupełnie inny pomysł, ale oparty na Twoim projekcie. Piszę właśnie tutorial, który ma rozwiązać problem wielowątkowości, czyli jednoczesnej pracy kilku funkcji, czy podprogramów. Chcę do minimum ograniczyć przy tym używanie funkcji delay, bo to właśnie ona wszystko psuje. Trzeba przecież czekać, aż się wykona... i przez to wszystko inne wisi. Moje rozwiązanie jest oparte na bibliotece Timers. Wgryzam się właśnie w nią i całkiem fajne rzeczy mi wychodzą. Zrobię z tego poradnik na forum.
Na razie mam to :-)
#include <LiquidCrystal.h>
#include <Timers.h>
Timers <8> akcja; // na poczatek 8 niezależnych wątków
LiquidCrystal lcd(8,9,4,5,6,7); // definiujemy LCD
#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            // przekaznik na pinie 13
#define motor1Pin 12             // motor1Pin na pin 12
#define motor2Pin 11             // motorPin2 na pin 11
volatile boolean zmiana=true; // zmienna pomocnicza
volatile boolean kier=false; // kierunek ruchu tacy
volatile boolean startT=false; // start tacy
long czas=0; // czas od chwili startu
long s=0; // chwila startu
int minuty=0, sekundy=0; // chyba jasne :-)
int ustaw=40; // temperatura początkowa
volatile int cz=400; // czas ruchu tacy
// --- funkcje dla ruchu tacy ------------------------------------------
void r0(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,LOW); } // zatrzymanie tacy
void rP(){digitalWrite(motor1Pin,LOW); digitalWrite(motor2Pin,HIGH);} // ruch tacy do przodu
void rT(){digitalWrite(motor1Pin,HIGH);digitalWrite(motor2Pin,LOW); } // ruch tacy do tyłu
// --- funkcja ustawienia zadanej temperatury --------------------------
void set_temp()
{
  while(digitalRead(OK)!=LOW) // aż nie wciśniemy klawisza OK
  {
    if(digitalRead(UP)==LOW){delay(30);if(digitalRead(UP)==LOW) {ustaw++;if(ustaw>80)ustaw=80;lcd.setCursor(0,1); lcd.print(ustaw);}}
    if(digitalRead(DOWN)==LOW){delay(30);if(digitalRead(DOWN)==LOW) {ustaw--;if(ustaw<10)ustaw=10;lcd.setCursor(0,1); lcd.print(ustaw);}}
    delay(80); // raczej konieczne dla mojego refleksu :-)
  }
  delay(300);startT=true;lcd.setCursor(10,0);lcd.print("START"); // kosmetyka LCD
}  
// --- funkcja reakcji na wciśnięty przycisk OK  ------------------------
void buttonDown()
{
if(digitalRead(OK)==LOW){delay(50);if(digitalRead(OK)==LOW){startT=!startT;}delay(50);}
}
// --- funkcja zmiany kierunku ruchu tacy + kosmetyka LCD ---------------
void flopKierunek()
{
  kier=!kier;r0();lcd.setCursor(11,1);lcd.print(" * "); // zatrzymanie tacy
  if(kier==true){rP();lcd.setCursor(11,1);lcd.print("-->");} // ruch do przodu + kosmetyka LCD
  else {rT();lcd.setCursor(11,1);lcd.print("<--");} // ruch do tyłu + kosmetyka LCD
}
// --- funkcja pokazuje czas  --------------------------------------------
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,0);lcd.print(buf); // kosmetyka LCD
}
// --- funkcja pokazuje akt. temperaturę ----------------------------------
void pokazTemp()
{
  int sensorValue = analogRead(A0); // czujnik temperatury na pin A0
  float temp = sensorValue * (5.0 * 100.0/1023.0); // przeliczamy (wzór zalezy od czujnika)
  lcd.setCursor(0,1);lcd.print(temp); // kosmetyka LCD
  if(temp < ustaw) { digitalWrite(przekaznik,HIGH);} // właczamy grzałkę
  if(temp > ustaw+1){ digitalWrite(przekaznik,LOW); } // lub nie (histgereza 1 st.C)
}
// ------------------------------------------------------------------------
void setup()
{
  pinMode(motor1Pin,OUTPUT);digitalWrite(motor1Pin,LOW); // stop motor
  pinMode(motor2Pin,OUTPUT);digitalWrite(motor2Pin,LOW); // stop motor
  pinMode(UP,INPUT_PULLUP); // klawisz UP
  pinMode(DOWN,INPUT_PULLUP); // klawisz DOWN
  pinMode(OK,INPUT_PULLUP); // klawisz OK
  lcd.begin(16,2);lcd.clear();lcd.setCursor(0,0);lcd.print("00:00"); // kosmetyka LCD
  set_temp();                       // na początku ustawiam wymaganą temperaturę
  s=millis(); // sędzia odpalił na start :-)
  akcja.attach(0, 1000, pokazCzas); // pokazuje czas co sekunde
  akcja.attach(1,0,flopKierunek); // 0 oznacza stop dla tej akcji (czyli dla ruchu tacy i zmiany kierunku)
  akcja.attach(2,5000,pokazTemp); // pokazuję temperaturę co 5 sek.
  akcja.attach(3,150,buttonDown); // sprawdzam klawisz START-STOP tacy co 150 ms.
}
// -------------------------------------------------------------------------
void loop()
{
akcja.process(); // inicjalizacja i aktualizacja wszystkich procedur
if(startT==true){akcja.updateInterval(1,cz);} // a teraz uruchomiłem ruch tacy ze zmianą co cz [ms]
else {r0();lcd.setCursor(11,1);lcd.print(" * ");akcja.updateInterval(1,0);} // 0 oznacza stop akcji (dla ruchu tacy)
}
// =========================================================================
Pozdrawiam
aaaa.... bym zapomniał... napisz ojaki stan wysoki Ci chodzi i pokaż schemat... coś czuję że na tym pinie wisi jakieś "zdublowanie" (Serial, SDA, SCL itp.)
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 16 mar 2014, 00:02

Super, jutro poskładam na stykówce i wypróbuję sketch.

Pozdrawiam

EDIT:

Tak tylko szybko wrzuciłem do ardiono IDE i błąd kompilacji wystąpił.. Nie wiem nie znam się na bibliotece timers..

Kod: Zaznacz cały

sketch_mar15a:4: error: 'Timers' is not a template
sketch_mar15a:4: error: no matching function for call to 'Timers::Timers()'
C:\Program Files (x86)\Arduino\libraries\Timers/Timers.h:28: note: candidates are: Timers::Timers(byte)
C:\Program Files (x86)\Arduino\libraries\Timers/Timers.h:20: note:                 Timers::Timers(const Timers&)
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 16 mar 2014, 09:48

Witam
A masz bibliotekę Timers w libraries w odp. kakalogu ?
W razie co w załączniku
Pozdrawiam
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
v-cu
Starszy majsterkowicz
Posty: 290
Rejestracja: 30 gru 2012, 23:00
Lokalizacja: Woźniki

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: v-cu » 16 mar 2014, 20:13

Dobra bibliotekę miałem, tylko chyba starszą wersje, wgrałem twoją i dzierga sobie wszystko ładnie. Kod spoko, lecz minus jest taki że nie wejdzie mi na ATmegę8 :P bo za mało miejsca. Ale nic jak na razie jestem w miejscu i myślę co dalej.
Pozdrawiam.
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 311
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: Łącznie dwóch programów, termoregulator+stoper

Post autor: wojtekizk » 16 mar 2014, 22:20

Witam
Wiesz... to teraz kwestia kilku złotych a masz 32 kB zamiast 8. Mam jeszcze kilka ósemek i trzymam je chyba tyko dla linijek świetlnych. Od 2 lat kupuję już wyłącznie 328P (DIL).
Jeszcze dzisiaj zapraszam do lektury "gotowiec 4" w dziale Tutoriale. Będzie warto :-)
Pozdrawiam
ODPOWIEDZ

Strony partnerskie: