• 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
Zliczanie do tyłu, kontrola za pomocą 2 przycisków.
#1
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:
#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);
}
 
Odpowiedź
  


Wiadomości w tym wątku
Zliczanie do tyłu, kontrola za pomocą 2 przycisków. - przez kruszpak - 23-02-2019, 14:18

Skocz do:


Przeglądający: 2 gości