sunnuntai 5. maaliskuuta 2017

Sarjaliikenne II

Tässä sovelluksessa sarjapulssit syötetään binääritulon nolla (0 / rx) kautta. Varsinaista sarjaliikennettä ei tämäkään jakso vielä ole, mutta kuitenkin hiukan periaatteltaan samanlainen toteutus kuin ”Kostutuskeskus” 4. tammikuuta 2017. Tuossa toteutuksessa anturi lähettää ”pitkän” pulssin merkiksi sanoman alusta. Kun se on ajallisesti tunnistettu, vastaanotetaan alkupulssia seuraavat pulssit datana.
 Tässä sovelluksessa alkupulssi annetaan sähkötysavaimella (siksi sähkötysavaimella, koska sillä on paljon helpompi tuottaa lyhyitä pulsseja nopeasti kuin painikkeella). Alkupulssi käynnistyy ensimmäisestä avaimen painalluksesta. Sen merkkinä palaa punainen LEDi pienen hetken. Tänä aikana ohjelma ei lue tulevaa dataa avaimesta. Kun tämä alkuviive on päättynyt, hyppää ohjelma askeleeseen kaksi, missä vihreää LEDiä vilkutetaan viisi (5) kertaa. Samanaikaisesti luetaan digitalituloa nolla (0) ja kerätään tämän vilkutuksen aikana tulleet pulssien nousevat reunat muuttujaan (Int_Numero). Kun vihreän LEDin vilkutus on loppunut, hyppää ohjelma askeleeseen kolme (3), missä pulssien lukumäärä siirretään 7-segmenttinäyttöön. Kolmannessa askeleessa on 1,5 sekunnin viive, minkä kuluttua numeromuuttuja nollataan ja sekvenssi pysäytetään. Seuraava avaimen painallus käynnistää tapahtumaketjun taas alusta. Video antinarduvideo40.youtube.com havainnollistaa tapahtumaketjua hieman selvemmin.

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