[061] Nieco większe ATtiny

[061] Nieco większe ATtiny

Będąc dzieckiem bardzo lubiłem znajdujące się nieopodal przejście, gdzie światło zmieniało się po wciśnięciu przycisku. Działało ono jednak dziwnie – czasem od razu, czasem nie – ale o tym za chwilę. Spróbujmy rozbudować nasz model sygnalizatora świateł o ów przycisk, który będzie aktywować zielone światło dla pieszych.


W poprzednim artykule wykorzystałem jeden z najmniejszych ATtiny, z serii piątej. Ma on pięć, a warunkowo sześć uniwersalnych wejść-wyjść i nadawałby się tutaj także, ale postanowiłem użyć kolejnego układu z serii ATtiny24. Jest to rozwinięcie piątek o dodatkowe porty i teraz mamy ich już 12, w tym osiem wejść A/D

Do tego układ ten jest produkowany w obudowach do montażu przewlekanego, zatem będzie dla nas bardzo miłym wyborem. Ze względu na cenę i powszechność, jest obecnie chyba najbardziej rozpowszechnioną kostką do niewielkich zadań.

Połączenia związane z programowaniem różnią się nóżkami i schemat przedstawiam na zdjęciu oraz w zestawieniu niżej:

  • port 10 – nóżka 4

  • port 11 – nóżka 7

  • port12 – nóżka 8

  • port 13 – nóżka 9

  • 5 woltów - nóżka 1

  • masa - nóżka 14

Oczywiście będziemy musieli zadeklarować nowy typ kontrolera i przeprowadzić znane już operacje, z wypaleniem bootloardera włącznie.

Diody podłączę sobie tutaj według schematu tego kontrolera, który obdarowuje nas już dwunastoma pinami.

Do piątego portu podłączę jeszcze mikrostyk, zwierający go do masy. To będzie ów pstryczek, który pamiętam z dzieciństwa, a który obecnie towarzyszy sygnalizatorom dużo częściej niż dawniej.

const byte czerwoneSamochod = 0;  // Światło czerwone dla samochodów.
const byte zolteSamochod = 1;     // Światło żółte dla samochodów.
const byte zieloneSamochod = 2;   // Światło zielone dla samochodów.
const byte czerwonePieszy = 10;   // Światło czerwone dla pieszych.
const byte zielonePieszy = 9;     // Światło zielone dla pieszych.

const byte pstryczek = 5;  // Pstryczek wymuszający włączenie zielonego światła dla pieszych.

void setup() {
  pinMode(czerwoneSamochod, OUTPUT);  // Ustaw porty świateł jako wyjścia.
  pinMode(zolteSamochod, OUTPUT);
  pinMode(zieloneSamochod, OUTPUT);
  pinMode(czerwonePieszy, OUTPUT);
  pinMode(zielonePieszy, OUTPUT);
  pinMode(pstryczek, INPUT_PULLUP);  // Ustaw port pstryczka jako wejście.
}

W programie trzeba go zadeklarować i określić, jak to zwykle się robi. Reszta będzie się różnić jedynie procedurą wyjścia ze stanu domyślnego, którym jest zielone światło dla samochodów i czerwone dla pieszych. Dopóki nie wciśniemy przycisku, stan ten będzie trwać w nieskończoność. Teoretycznie moglibyśmy wcisnąć przycisk i uzyskać natychmiastowy start procesu zmiany świateł, ale gdyby tak piesi w kółko wciskali ten przycisk, żaden samochód nie mógłby przejechać. Dlatego na początku procedury zielone światło dla samochodów jest utrzymywane przez siedem sekund bez względu na wciskanie przycisku. Ale nie tak po prostu, ale w pętli, która sprawdza stan przycisku i jeśli ten zostanie wciśnięty, przestawia się binarna zmienna oznaczająca ów fakt. Dlatego zawczasu zadeklarowałem ją sobie.

bool wcisnieto = LOW;  // Zmienna, która jest ustawiana po wciśnięciu pstryczka.

digitalWrite(czerwoneSamochod, LOW);  // Zielone światło dla samochodów - stan domyślny.
digitalWrite(zolteSamochod, LOW);
digitalWrite(zieloneSamochod, HIGH);
digitalWrite(czerwonePieszy, HIGH);
digitalWrite(zielonePieszy, LOW);
wcisnieto = LOW;  // Zeruj zmienną wciśnięcia pstryczka.

for (byte x = 1; x < 70; x++) {      // Czekaj minimalny czas zielonego światła dla samochodów, sprawdzając pstryczek.
  if (digitalRead(pstryczek) == LOW) {  // Jeśli zostanie wciśnięty,
    wcisnieto = HIGH;                   // Ustaw przełącznik "wciśnięto"
  }
  delay(100);  // Czas pomiędzy analizą pstryczka.
}

Po tym czasie program zatrzymuje się do czasu aż pstryczek nie pozostaje wciśnięty, ale pod warunkiem, że nie był wciśnięty wcześniej. Innymi słowy, jeśli nastąpi pierwsze zdarzenie albo nastąpiło wcześniej drugie, program przechodzi dalej, a ca tam robi, to już widzieliśmy w poprzednim artykule.

Ostatnią rzeczą jest wyzerowanie zmiennej wciśnięcia przycisku, by znowu mogła być ustawiona podczas siedmiosekundowej zwłoki na początku, po podaniu zielonego światła dla kierowców. Można to zrobić zaraz po opuszczeniu pętli na początku programu, co z punktu widzenia elegancji programu jest lepszym rozwiązaniem albo tak jak to widać powyżej – tuż przed wejściem do tej pętli.

Szkic z poprzedniego artykułu zjada 40% zasobów dwukilobajtowej kostki, ten – 45% Jak więc widać, kontrolery z dwójką na początku, a więc zawierające 2kB pamięci, nadają się raczej tylko do tego typu zadań. Biorąc jednak pod uwagę powszechność takich potrzeb, śmiem twierdzić, że większość prac stawianych współczesnej elektronice to tego typu złożoność. I jak widać, w dwóch kilobajtach można zmieścić spokojnie obsługę nawet całkiem sporego skrzyżowania.

Układ z czwórką na początku umożliwia tworzenie nawet kolejowej logiki sygnalizatorów, oferując dwanaście portów, co już pozwala oprogramować skromną makietę. Zachęcam do zabawy, a na koniec prezentuję pełen szkic, który tutaj analizowaliśmy.

const byte czerwoneSamochod = 0;  // Światło czerwone dla samochodów.
const byte zolteSamochod = 1;     // Światło żółte dla samochodów.
const byte zieloneSamochod = 2;   // Światło zielone dla samochodów.
const byte czerwonePieszy = 10;   // Światło czerwone dla pieszych.
const byte zielonePieszy = 9;     // Światło zielone dla pieszych.

const byte pstryczek = 5;  // Pstryczek wymuszający włączenie zielonego światła dla pieszych.
bool wcisnieto = LOW;      // Zmienna, która jest ustawiana po wciśnięciu pstryczka.

void setup() {
  pinMode(czerwoneSamochod, OUTPUT);  // Ustaw porty świateł jako wyjścia.
  pinMode(zolteSamochod, OUTPUT);
  pinMode(zieloneSamochod, OUTPUT);
  pinMode(czerwonePieszy, OUTPUT);
  pinMode(zielonePieszy, OUTPUT);
  pinMode(pstryczek, INPUT_PULLUP);  // Ustaw port pstryczka jako wejście.
}
void loop() {
  digitalWrite(czerwoneSamochod, LOW);  // Zielone światło dla samochodów - stan domyślny.
  digitalWrite(zolteSamochod, LOW);
  digitalWrite(zieloneSamochod, HIGH);
  digitalWrite(czerwonePieszy, HIGH);
  digitalWrite(zielonePieszy, LOW);
  wcisnieto = LOW;  // Zeruj zmienną wciśnięcia pstryczka.

  for (byte x = 1; x < 70; x++) {         // Czekaj minimalny czas zielonego światła dla samochodów, sprawdzając pstryczek.
    if (digitalRead(pstryczek) == LOW) {  // Jeśli zostanie wciśnięty,
      wcisnieto = HIGH;                   // Ustaw przełącznik "wciśnięto"
    }
    delay(100);  // Czas pomiędzy analizą pstryczka.
  }
  while (digitalRead(pstryczek) == HIGH && wcisnieto == LOW) {}  // Czekaj aż przycisk zostanie wciśnięty, opuść pętlę, gdy już został wciśnięty wcześniej.

  digitalWrite(zolteSamochod, HIGH);  // Żółte światło dla samochodów.
  digitalWrite(zieloneSamochod, LOW);
  delay(3000);  // Czas świecenia żółtego światła.

  digitalWrite(czerwoneSamochod, HIGH);  // Czerwone światło dla samochodów.
  digitalWrite(zolteSamochod, LOW);
  delay(2000);  // Opóźnienie pojawienia się zielonego światła dla pieszych.

  digitalWrite(czerwonePieszy, LOW);  // Zielone światło dla pieszych.
  digitalWrite(zielonePieszy, HIGH);
  delay(7000);  // Czas trwania zielonego światła dla pieszych.

  for (byte x = 1; x < 6; x++) {  // Pętla migania zielonego światła na końcu cyklu zielonego światła dla pieszych.
    digitalWrite(zielonePieszy, LOW);
    delay(300);
    digitalWrite(zielonePieszy, HIGH);
    delay(300);
  }

  digitalWrite(czerwonePieszy, HIGH);  // Czerwone światło dla pieszych.
  digitalWrite(zielonePieszy, LOW);
  delay(2000);  // Opóźnienie pojawienia się czerwonego i żółtego światła dla samochodów.

  digitalWrite(zolteSamochod, HIGH);  // Żółte światło dla samochodów.
  delay(2000);                        // Opóźnienie pojawienia się zielonego światła dla samochodów.
}
Płytka edukacyjna TME-EDU-ARD-2Płytka edukacyjna TME-EDU-ARD-2Sprawdź tutaj

Przeczytaj również

Nasi partnerzy

TMETech Master EventTME EducationPoweredby
Copyright © 2024 arduino.pl