Tämän
kertainen ohjelma koostuu pääosin jo aiemmin käytetyista
ohjelmapalasista. Siksi olen jättänyt esim. 7-segmenttinäyttöön
liittyvät aliohjelmat pois, viitaten ainostaan jaksoon, mistä ne
voi halutessaan kopioda. Tätä ohjelmaa laatiessa haastavin osuus
oli saada vihreän LEDin vilkutus ja avaimen tilan lukeminen
samanaikaiseksi. Digitalitulo nolla (0) on määritelty sisäiselle
ylösvetovastukselle (INPUT_PULLUP), joten tällöin ei tarvitse
käyttää tulovastusta. Toisaalta avainta painettaessa tulon jännite
laskee nollaan (5V → 0V), joten luettaessa signaali käännetään
huutomerkillä (!) (Bol_Avain = !digitalRead(Con_Avain);)
OHJELMA
40
/***************************************
*
Ohjelma 40
*
05.03.2017
*
Sarjapulssien laskenta ja näyttö
**************************************/
//
MÄÄRITTELYT:
const
int Con_Jakso = 400;
unsigned
int Uni_Jakso = Con_Jakso;
int Seq_Runko = 0;
boolean
Bol_LEDtila = true;
unsigned
int Uni_LEDpun = Con_Jakso * 3;
int Int_LEDvihKertaa = 5;
const
int Con_Avain = 0; // Sähkötysvaimen liityntä
boolean
Bol_Avain = false;
boolean
BolAvainVapaa = true;
int Int_Numero = 0;
boolean
Arr_Data[8] = {0,0,0,0,0,0,0,0};// Näyttö
//
Sarjadatan syöttö 74HCT595
const int Con_DS_Data = 6; // Sarjadatan syöttö
const
int Con_SHCP_Kello = 7; // Sarjadatan kellotus
const
int Con_STCP_Siirto = 8; // Syöttö rinnanlähtöön
//
ALIOHJELMAT
//
Aliohjelma: luvun vähennys
unsigned
int Fun_Miinus( unsigned
int luku){
luku--;
return luku;}// vähennys loppu
//
Aliohjelma LEDin ohjaus
void
Fun_LEDit(int pinni, boolean tila){
pinMode(pinni, OUTPUT);
digitalWrite(pinni, tila);
}//
LEDin ohjaus loppu
//
Seuraavana 3 aliohjelmaa:
//
void Fun_Tyhjenna(){
//
void Fun_N7seg(int numero){
//
void Fun_Naytto(int j){
//
Nämä ovat maaliskuun ensimmäisessä päivityksessä
//
ASETUKSET:
void
setup(){
Serial.begin(9600);
pinMode(Con_Avain, INPUT_PULLUP);
pinMode(Con_DS_Data, OUTPUT);
pinMode(Con_SHCP_Kello, OUTPUT);
pinMode(Con_STCP_Siirto, OUTPUT);
}//
Asetuksen loppu
//
PÄÄLOOPPI
void
loop(){
Bol_Avain
= !digitalRead(Con_Avain);
if(Bol_Avain
== true && Seq_Runko == 0){
Fun_Tyhjenna();
Seq_Runko
= 1;}
switch
(Seq_Runko) {
case
1: // Poltetaan punaista LEDiä aloituksen merkkinä
Fun_LEDit(4,
LOW);
Fun_LEDit(5,
HIGH);
Uni_LEDpun
= Fun_Miinus(Uni_LEDpun);
if(Uni_LEDpun == 0){
Fun_LEDit(5, LOW);
Uni_LEDpun
= Con_Jakso * 3;
Bol_LEDtila
= true;
Seq_Runko
= 2;
}//
if punaisen polton loppu
break;
case
2: // Vilkutetaan vihreää LEDiä merkiksi datan annosta
do{
delay(2);
// Vaatii näköjään pienen viiveen jotta suorittaa
Uni_Jakso
= Fun_Miinus(Uni_Jakso);
if(Uni_Jakso == Con_Jakso - 1 ||
Uni_Jakso == Con_Jakso / 2){
Bol_LEDtila = !Bol_LEDtila;
Fun_LEDit(4, Bol_LEDtila);
}//
if vihreän vilkutus
if(Uni_Jakso == 0){
Fun_LEDit(4, LOW);
Int_LEDvihKertaa =
Fun_Miinus(Int_LEDvihKertaa);
Uni_Jakso = Con_Jakso;
}//
if kertojen laskenta
//
Avainten painamisten laskenta
Bol_Avain
= !digitalRead(Con_Avain);
if(Bol_Avain
== true && BolAvainVapaa == true){
Int_Numero++;
BolAvainVapaa = false;
}//
Avaimen nouseva reunan tunnistus loppu
if(Bol_Avain
== false){BolAvainVapaa = true;}
}while
(Int_LEDvihKertaa > 0);
if(Int_LEDvihKertaa == 0){
Seq_Runko
= 3;
}//
if askeleen vaihto
break;
case
3: // Tulostetaan numero, eli painamisten lukumäärä
Fun_Naytto(Int_Numero);
Int_LEDvihKertaa = 5;
Int_Numero
= 0;
delay(1500);
// Näytetään 1,5 sekuntia
Fun_Tyhjenna();
Seq_Runko
= 0;
break;
}//
Sekvenssin loppu
delay(1);
}
// Pääohjelma LOPPU
Ei kommentteja:
Lähetä kommentti