Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
kruszpak
Młodszy majsterkowicz
Posty: 5
Rejestracja: 12 mar 2017, 15:03

Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: kruszpak » 23 lut 2019, 15:39

Witam,
Mam problem z kodem, który napisałem. Chcę wykonać układ, który na wyświetlaczu po wciśnięciu pierwszego przycisku zaczyna odliczanie od 10 do 0, natomiast drugi przycisk ma zatrzymać liczenie i wyświetlić napis. Ponowne wciśnięcie 1 przycisku ma na nowo zacząć odliczanie od 10 i tak w kółko. Wszystko jest w miarę ogarnięte. Problem jest w tym, że kiedy program zaczyna zliczać do 0, to nie mogę go tym drugim przyciskiem zatrzymać. Próbowałem już chyba wszystkiego, funkcje przerwań powodują, że program się zawiesza całkowicie, zastosowałem bibliotekę Timers aby programy działały równolegle. Skończyły mi się już pomysły, może któryś z Panów byłby w stanie mnie nakierować? Wklejam kod programu, przepraszam jeżeli jest mało czytelny bądź są w nim błędy, w programowanie Arduinno bawię się hobbystycznie i sporadycznie. Dzięki za wyrozumiałość.

Kod: Zaznacz cały

#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "Timers.h"
Timers <8> akcja;
int minuta = 10;
int sekunda = 0;
float mdziesiatki;
float mjednosci;
float sdziesiatki;
float sjednosci;
#define swiatlocz 4
#define swiatloni 5
#define klakson 6
#define przyciskcz 8
#define przyciskni 9
volatile int stala = 0;
volatile int stala2 = 0;
unsigned long licznik;
LiquidCrystal_I2C lcd(0x27,20, 4); 

byte custchar[8][8] = {
{
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
}, {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
}, {
  B11111,
  B11111,
  B11111,
  B00000,
  B00000,
  B11111,
  B11111,
  B11111
}, {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B01110,
  B01110,
  B01110
}, {
  B00000,
  B00000,
  B00000,
  B01110,
  B01110,
  B01110,
  B00000,
  B00000
}, {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
}, {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
}, {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
}
};

byte bignums[10][2][3] = {
{
  {255, 0, 255},
  {255, 1, 255}
},{
  {0, 255, 254},
  {1, 255, 1}
},{
  {2, 2, 255},
  {255, 1, 1}
},{
  {0, 2, 255},
  {1, 1, 255}
},{
  {255, 1, 255},
  {254, 254, 255}
},{
  {255, 2, 2},
  {1, 1, 255}
},{
  {255, 2, 2},
  {255, 1, 255}
},{
  {0, 0, 255},
  {254, 255, 254}
},{
  {255, 2, 255},
  {255, 1, 255}
},{
  {255, 2, 255},
  {254, 254, 255}
}
};

void loadchars() {
   for (int i = 0; i < 8; i++)
       lcd.createChar(i, custchar[i]);
   
/*    
   lcd.command(64);
   for (int i = 0; i < 8; i++)
       for (int j = 0; j < 8; j++)
           lcd.write(custchar[j]);
*/
   lcd.home();
}

void printbigchar(byte digit, byte col, byte row, byte symbol = 0) {
   if (digit > 9) return;
   for (int i = 0; i < 2; i++) {
       lcd.setCursor(col, row + i);
       for (int j = 0; j < 3; j++) {
           lcd.write(bignums[digit][i][j]);     //.kbv add the [i]
       }
       lcd.write(254);
   }
   if (symbol == 1) {
       lcd.setCursor(col + 3, row + 1);
       lcd.write(3);
   } else if (symbol == 2) {
       lcd.setCursor(col + 3, row);
       lcd.write(4);
       lcd.setCursor(col + 3, row + 1);
       lcd.write(4);
   }

   lcd.setCursor(col + 4, row);
}
void odczyt()
{ 
 
 if(digitalRead(8) == LOW)
  {
     stala = 1;
     licznik = millis();
    
  }
 else if(digitalRead(9) == LOW)
  {
     stala2 = 1;
     licznik = millis();
  }
  else if (digitalRead(10) == LOW)
  {
       stala = 0;
       stala2 = 0;
       licznik = 0;
   }
 else
   {
     return 0;
  }
}
void odliczanie()
{
for (minuta; minuta>0; sekunda--)
{
 
   lcd.setCursor(3,0);
   lcd.print("PRZEJECIE BAZY");
   lcd.setCursor(5,1);
   lcd.print("CZERWONYCH");

     if (sekunda == 0)
     {
       minuta = minuta - 1;
       sekunda = 59;

     }

     mjednosci = minuta%10;
     mdziesiatki = minuta/10%10;
     sjednosci = sekunda%10;
     sdziesiatki = sekunda/10%10;

   printbigchar(mdziesiatki, 3, 2);
   printbigchar(mjednosci, 7, 2, 2);
   printbigchar(sdziesiatki, 11, 2);
   printbigchar(sjednosci, 15, 2); 
 


}
 
while (minuta == 0)
{

   lcd.clear();
   lcd.setCursor(3,0);
   lcd.print("BAZA CZERWONYCH");
   lcd.setCursor(6,1);
   lcd.print("PRZEJETA");
   printbigchar(0, 3, 2);
   printbigchar(0, 7, 2, 2);
   printbigchar(0, 11, 2);
   printbigchar(0, 15, 2);
 
   
}
}

void sterowanie()
{
   loadchars();
     if (stala == 1 && stala2 == 0)
     {
       stala2 = 0;
       digitalWrite(swiatloni, HIGH);
       odliczanie();

}
     
   else if (stala2 == 1 && stala == 0)
     {
       stala = 0;
   digitalWrite(swiatloni, LOW);
   lcd.clear();
   lcd.setCursor(3,0);
   lcd.print("BAZA CZERWONYCH");
   lcd.setCursor(5,1);
   lcd.print("BEZPIECZNA");
     }
   else if (stala2 == 0 && stala == 0)
     {

   digitalWrite(swiatloni, LOW);
   lcd.clear();
   lcd.setCursor(3,0);
   lcd.print("BAZA CZERWONYCH");
   lcd.setCursor(5,1);
   lcd.print("BEZPIECZNA");
     }
   else 
   {
   lcd.clear();
   lcd.setCursor(3,0);
   lcd.print("AWARIA");
   }
}


void setup() {   
   lcd.begin();
   Serial.begin(9600);

   pinMode(8, INPUT_PULLUP);
   pinMode(9, INPUT_PULLUP);
   pinMode(2, INPUT_PULLUP);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   pinMode(6, OUTPUT);
   digitalWrite(swiatlocz, HIGH);
   digitalWrite(swiatloni, HIGH);
   akcja.attach(1, 400, odczyt);
   akcja.attach(2, 1500, sterowanie);
   
}

void loop() {
akcja.process();
   Serial.println(stala);
   Serial.println(stala2);
}

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


uzi18
Majsterkowicz
Posty: 93
Rejestracja: 10 maja 2018, 05:06

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: uzi18 » 23 lut 2019, 17:08

podpowiedz moze skad ta biblioteka timers?

do tego piszesz o 2 przyciskach a sa 3

do przyciskow lepiej uzywac jakiejs biblioteki Button

Wysłane z mojego MI MAX przy użyciu Tapatalka


kruszpak
Młodszy majsterkowicz
Posty: 5
Rejestracja: 12 mar 2017, 15:03

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: kruszpak » 23 lut 2019, 17:15

Biblioteka Timers.h pochodzi z tematu na forum "Biblioteka Timers = koniec z uciążliwym delay()"

deklaracja 3 przycisku to pozostałości po moich różnorakich próbach implementacji przerwań.

Implementacja jakieś biblioteki do przycisków załatwi sprawę?

Edit: Zastosowanie biblioteki do przycisków niczego nie zmieniło.
uzi18
Majsterkowicz
Posty: 93
Rejestracja: 10 maja 2018, 05:06

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: uzi18 » 23 lut 2019, 21:04

i tak bedzie bo funkcja odliczanie nie ma warunku wyjscia, a while ponizej blokuje program

Wysłane z mojego MI MAX przy użyciu Tapatalka


uzi18
Majsterkowicz
Posty: 93
Rejestracja: 10 maja 2018, 05:06

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: uzi18 » 23 lut 2019, 22:24

dopisz w petli "for" w funkcji odliczenie taki fragment:

Kod: Zaznacz cały

if (digitalRead(10) == LOW)
break;
oczywiscie daj zamiast 10 ten pin co trzeba aby przerwalo odliczanie
kruszpak
Młodszy majsterkowicz
Posty: 5
Rejestracja: 12 mar 2017, 15:03

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: kruszpak » 24 lut 2019, 21:26

Dzięki! Taka głupia sprawa, a Twoja podpowiedź rozwiązała problem. Wszystko chodzi tak jak powinno :)
uzi18
Majsterkowicz
Posty: 93
Rejestracja: 10 maja 2018, 05:06

Re: Zliczanie do tyłu, kontrola za pomocą 2 przycisków.

Post autor: uzi18 » 24 lut 2019, 21:36

i o to chodzilo

Wysłane z mojego MI MAX przy użyciu Tapatalka

ODPOWIEDZ

Strony partnerskie: