Minutnik - problem z odliczaniem

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Swiaderny
Młodszy majsterkowicz
Posty: 4
Rejestracja: 25 gru 2014, 15:28

Minutnik - problem z odliczaniem

Post autor: Swiaderny » 26 gru 2014, 17:08

Witam! To mój pierwszy post na forum.. Elektronik ze mnie żaden, i dlatego chyba utknąłem na dobre!

Chciałbym stworzyć termometr do swojego domowego browaru (i to się chyba udało), ale zamarzył mi się jeszcze prosty minutnik z obsługą trzech klawiszy:
-klawisz PLUS - dodaje do zmiennej 'czas' wartość 5 - docelowo 5 minut;
-klawisz MINUS - zeruje zmienną 'czas' do wartości 0;
-klawisz OK - zatwierdza i inicjuje odliczanie w dół od wartości 'czas' - i tu właśnie zaczynają się schody..

Na niebiesko zaznaczyłem fragment programu z którym mam problem
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DS18B20.h>
#include <LedControl.h>

// select the pins used on the LCD panel
LiquidCrystal_I2C lcd(0x27,16,2);

// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define btnOK 6
#define btnMINUS 7
#define btnPLUS 8

#define ONEWIRE_PIN 2

#define POTENCJOMETR_MIN 1
#define POTENCJOMETR_MAX 2

// Adres czujnika
byte address[8] = {0x28, 0xE9, 0x9B, 0x5C, 0x6, 0x0, 0x0, 0x7D}; //

int state = 2; //pin termometru
int BUZZER = 3; //pin brzęczka

int rec = 0; //-----------------------------nagrywanie
byte czas = 0; //----------------------------- minutnik


//LED Arduino Pin 7 to DIN, 6 to Clk, 5 to LOAD, no.of devices is 1
LedControl lc=LedControl(7,6,5,2);


OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor
if (adc_key_in > 1000) return btnNONE;
if (adc_key_in < 40) return btnRIGHT;
if (adc_key_in < 110) return btnUP;
if (adc_key_in < 210) return btnDOWN;
if (adc_key_in < 360) return btnLEFT;
if (adc_key_in < 600) return btnSELECT;
if (adc_key_in < 840) return btnOK;
if (adc_key_in < 900) return btnPLUS;
if (adc_key_in < 960) return btnMINUS;
return btnNONE;
}

void alarm(boolean ON)
{
if (ON)
//digitalWrite(BUZZER, HIGH);
tone (BUZZER, 2000, 10); //
delay(200);

if (!ON)
digitalWrite(BUZZER, LOW);
// tone (BUZZER, 300, 10); //
//delay(400);
}


void StateMachine (int state){
switch (state)
{
case 0:{ // --------------------------clear screen

}
case 1:{// --------------------------hello world

}

case 2:{ // -------------------- PULPIT

}}



void setup()
{
//konsola
while(!Serial);
Serial.begin(9600);
//konsola
lcd.init();
lcd.backlight();

sensors.begin();
pinMode(BUZZER, OUTPUT);

// Initialize the MAX7219 device
lc.shutdown(0,false); // Enable display
lc.setIntensity(0,3); // Set brightness level (0 is min, 15 is max)
lc.clearDisplay(0); // Clear display register

StateMachine(1);
}

void loop()
{
// ~~~~~~wycinek programu

//-------minutnik

if (lcd_key == btnPLUS) {
czas=czas+5;
delay(150); }

if (lcd_key == btnMINUS) {
czas=0 ;
}
if (lcd_key == btnOK) {
/// tu chciałbym inicjować odliczanie
/// i po zakończeniu usłyszeć alarm


}

lcd.setCursor(1,1);
LCDprint2digits(czas);

//---- minutnik koniec

//// ~~~~ wycinek programu
}


///----- zegar
void LCDprint2digits(int number) {
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}
///---zegar
Pozdrawiam, Tomek
Ostatnio zmieniony 26 gru 2014, 21:59 przez Swiaderny, łącznie zmieniany 1 raz.

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


Tysz
Młodszy majsterkowicz
Posty: 10
Rejestracja: 13 gru 2014, 11:53

Re: Minutnik - problem z odliczaniem

Post autor: Tysz » 26 gru 2014, 19:48

W loop() przydał by się jakaś przerwa tak aby była wyznacznikiem czasu. np delay(100);
Pod klawisz PLUS przydała by się wartość trochę inna niż 5. Przy delay(100); to by było pół sekundy
Gdy czas jest większy od zera to odejmuje dana jednostke czasu i tak az do zera if (czas > 0) czas-100;
No i buzer gdy czas dojdzie do zera if (czas == 0) tone (BUZZER, 2000, 10);
Jak wykorzystać klawisz MINUS do wyłączenia buzera zostawię Ci do zabawy ;)

Tez jestem nowy i dziwne zasady panują tu na forum:
za pół gotowce wołają kasę
przymuszają nowych do myślenia
i szufladkują do jednego worka ;)

Więc trza krakać tak jak oni :D
Swiaderny
Młodszy majsterkowicz
Posty: 4
Rejestracja: 25 gru 2014, 15:28

Re: Minutnik - problem z odliczaniem

Post autor: Swiaderny » 26 gru 2014, 20:55

Ale właśnie o to chodzi, że funkcja delay (xx) powoduje sypanie się pozostałej części programu..

Znalazłem nawet temat o bibliotece timers.h http://majsterkowo.pl/forum/post12728.html ale to jeszcze bardziej mnie pogrążyło :)

No nic.. Skoro taka polityka forum to idę kopać dalej
Tysz
Młodszy majsterkowicz
Posty: 10
Rejestracja: 13 gru 2014, 11:53

Re: Minutnik - problem z odliczaniem

Post autor: Tysz » 26 gru 2014, 21:31

Jest jeszcze opcja w pętli ale cały program stanie w miejscu na czas odliczania
No i chyba ta wielozadaniowość ale nie miałem jeszcze z tym kontaktu
I tak w ostatniej chwili mi przyszło do głowy funkcja millis() mierzy czas od wystartowania arduino do 50dni
stiven
Złota rączka
Posty: 1581
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Minutnik - problem z odliczaniem

Post autor: stiven » 26 gru 2014, 21:42

Swiaderny masz w programie dodaną bibliotekę do układu ds1307 (#include <DS1307RTC.h>). Masz ten układ? Można z niego skorzystać. Jak nie, to funkcja millis(), o której napisał Tysz, powinna być w miarę do ogarnięcia.
Swiaderny
Młodszy majsterkowicz
Posty: 4
Rejestracja: 25 gru 2014, 15:28

Re: Minutnik - problem z odliczaniem

Post autor: Swiaderny » 26 gru 2014, 22:06

Wszystkie dołączone biblioteki są używane w programie

Wiem, (a przynajmniej podejrzewam) że korzystając z biblioteki <DS1307RTC.h> mógłbym coś zrobić z odliczaniem sekundowym i po pełnej minucie (co 60 sekund) odjąć 1 od wartości 'czas'.. ale nie wiem gdzie szukać
Swiaderny
Młodszy majsterkowicz
Posty: 4
Rejestracja: 25 gru 2014, 15:28

Re: Minutnik - problem z odliczaniem

Post autor: Swiaderny » 27 gru 2014, 00:22

Na podstawie tego http://majsterkowo.pl/forum/lacznie-dwo ... tml#p12508

Zrobiłem tak:
byte czas = 0; //----------------------------- minutnik

long odlicz=0;
long s=0;
long akt=0;

byte start=0;
byte minutnik=0;
byte sekundy=0;
byte minuty=0;
void loop()
{

//-------minutnik

if (lcd_key == btnPLUS) {
czas=czas+5;
delay(150); }

if (lcd_key == btnMINUS) {
czas=0 ;
}

if(lcd_key == btnOK){
minutnik=1;
s=millis();
lcd.setCursor(1,1);
lcd.print(" ");
delay (500);
}

if(minutnik==1&&(millis()-akt)>999){
akt=millis();
odlicz=(millis()-s)/1000;
minuty=odlicz/60;
czas=czas-minuty;
}

if(minuty>>0){
minuty=0;
s=millis();}


if(czas==0){
minutnik=0;
s=0;}

lcd.setCursor(1,1);
LCDprint2digits(czas);

//---- minutnik koniec
}
Ale jak nastawię dłuższy czas do odliczania to coraz bardziej się rozjeżdża.. Za duża zwłoka przez inne delay chyba..

Pomysły mi się skończyły
ODPOWIEDZ

Strony partnerskie: