[056] Symulator Wokwi cz. 2

[056] Symulator Wokwi cz. 2

Zanim zabierzemy się za następne przykłady, wróćmy na chwilę do interfejsu aplikacji Wokwi. Okno szkicu przypomina to ze środowiska Arduino IDE, acz nie ma tutaj mechanizmu układającego kod, więc o jego czytelność musimy zadbać sami. Sąsiednie okno zawiera opis elementów na ekranie i generalnie dla nas jest nieprzydatne. Ostatnie zaś – spis użytych bibliotek.


Powyżej mamy możliwość zapisania projektu i jego eksportu do pliku. Tutaj także można stworzyć kopię projektu, co się świetnie nadaje do eksperymentów z alternatywnymi elementami. Gdy teraz wrócimy do okna projektów, ujrzymy dwa, w tym jeden będący kopią.

Rzućmy sobie jeszcze okiem na peryferia. Mamy tutaj typową drobnicę, a więc rezystory, przyciski, przełączniki, diody świecące, cały szereg popularnych wyświetlaczy w różnych konfiguracjach, kilka rejestrów i multiplekserów, elementów związanych z podczerwienią, obowiązkowy zestaw czujników, który znajdziemy w klasycznych kitach, przekaźniki i motorki, a nawet kartę microSD oraz zestaw bramek i przerzutników. No i oczywiście trzy płytki stykowe. Teraz zrobimy sobie pożytek z możliwości dotąd poznanych.

Wśród płytek startowych znajdziemy nieoficjalne maleńkie Arduino, którym jest układ AtTiny85. Ma on tylko osiem nóżek, odrobinę pamięci, ale do takich jak ten projekt jest i tak zbyt zaawansowany. Posadzimy go tym razem na małej wersji płytki stykowej, łącząc wszystko jak w projekcie poprzednim. Szkic także nie zmieni treści poza adresami portów: te należy odczytać ze specyfikacji układu i odpowiednio zamieć. Wszak pinów mamy tylko sześć.

Po wirtualnym skompilowaniu dostaniemy dokładnie ten sam efekt co poprzednio. Możemy teraz skopiować nasz projekt element po elemencie do świata rzeczywistego, jak również udostępnić go w takiej, czytelnej postaci.

Na koniec spróbuję przenieść projekt, który ostatnio prezentowałem, a służył do wyświetlania dużych cyfr. Trafimy tu na pewien problem i pokażę jak tego typu problemy się obchodzi.

W oryginale projekt wyświetlał cyfry o nietypowym kroju na wyświetlaczu osadzonym na płytce edukacyjnej TME za pomocą niestandardowych metod. Spróbuję teraz projekt ten przenieść w środowisko wirtualne.

Jak widać, w zestawie znajdziemy wyświetlacz kompatybilny z HD44780 pracujący na szynie I2C, więc wystarczy go wybrać i podłączyć jak na płycie oryginalnej. Pozostaje wklejenie programu do edytora i… Niestety, biblioteka hd44780 nie jest obsługiwana.

W tym wypadku należy sięgnąć za bibliotekę alternatywną. Wymagać będzie to od nas wprowadzenia zmiany także podczas deklaracji ustawień, zgodnie z wymaganiami tej biblioteki, co znajdziemy w jej dokumentacji. Dla uwidocznienia zmian, nie usuwałem poprzednich wpisów, tylko zrobiłem z nich komentarze. Rzecz dotyczy tylko dwóch linii, reszta wygląda identycznie.

Po próbie kompilacji znów dostaniemy komunikat, ale tym razem bardziej przyjazny. Zostaniemy poproszeni o ściągnięcie biblioteki. Teraz już możemy uruchomić symulację i cieszyć się tym, co widzieliśmy poprzednio na prawdziwym wyświetlaczu.

A gdyby nam zabrakło inspiracji, zawsze można wejść w przykłady czy projekty społeczności i zobaczyć jakie rzeczy powstały w głowach innych miłośników komputerka Arduino.

A jeśli ktoś chciałby pobawić się symulatorem z programami przedstawionymi w artykule, poniżej znajdują się listingi. ATTiny85:

const byte dioda = 0;          // Adres diody świecącej.
const byte potencjomert = A1;  // Adres potencjometru.

void setup() {
  pinMode(dioda, OUTPUT);  // Deklaruj port diody.
}

void loop() {
  digitalWrite(dioda, !digitalRead(dioda));  // Zamień poziom na porcie sterującym diodą.
  delay(analogRead(potencjomert));           // Zaczekaj proporcjonalnie do wartości napięcia na wejściu przetwornika A/D
}

Oraz projekt z dużymi cyframi:

#include                                                       // Biblioteka obsługująca magistralę I2C
// #include                                                    // Biblioteka obsługująca wyświetlacze 44780
// #include                              // Dodatek obsługujący wyświetlacze podłączone do ekspandera I2C
// hd44780_I2Cexp lcd(0x20, I2Cexp_MCP23008, 7, 6, 5, 4, 3, 2, 1, HIGH);  // Konfiguracja połączeń wyświetlacza LCD
#include 
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);

const byte woltomierz = A1;  // Port, który będzie mierzyć napięcie.
int napiecie;                // Wartość tego napięcia bez jednostek.

byte znak[320] = { 0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,  // Wzorce dużych cyfr
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00001, 0b00011, 0b00000, 0b00000,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00011, 0b00011,
                   0b00100, 0b01100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b01100, 0b00000, 0b00000,
                   0b00111, 0b01110, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111, 0b11111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00111, 0b11111, 0b11111, 0b11111,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b01100, 0b00000, 0b00000,
                   0b00000, 0b00000, 0b01100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b11100, 0b01110, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00001, 0b00011, 0b00111, 0b01110,
                   0b11100, 0b11111, 0b11111, 0b11111, 0b00000, 0b00000, 0b00011, 0b00011,
                   0b00100, 0b01100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11100, 0b11111, 0b11111, 0b11111, 0b11100, 0b11100, 0b11111, 0b11111,
                   0b11111, 0b11111, 0b11100, 0b11100, 0b11100, 0b11111, 0b11111, 0b11110,
                   0b00000, 0b00000, 0b01100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11111, 0b11111, 0b00111, 0b00000, 0b00000, 0b11100, 0b11110, 0b01111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11111, 0b11111, 0b11110,
                   0b11100, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01110, 0b00000, 0b00000, 0b11100, 0b11110, 0b01111,
                   0b00111, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b11111, 0b11111, 0b11111, 0b11100, 0b00000, 0b00000, 0b00000, 0b00000,
                   0b00111, 0b01110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100, 0b01100,
                   0b11111, 0b11111, 0b11111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b01110, 0b00111,
                   0b01110, 0b11100, 0b11100, 0b11100, 0b11110, 0b11111, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b01110, 0b11100,
                   0b01110, 0b00111, 0b00111, 0b00111, 0b01111, 0b11111, 0b11110, 0b11100,
                   0b00111, 0b01111, 0b11110, 0b11100, 0b11100, 0b11100, 0b11100, 0b11100,
                   0b11110, 0b01111, 0b00111, 0b00000, 0b00000, 0b01110, 0b01111, 0b00111,
                   0b11100, 0b11110, 0b01111, 0b00111, 0b00111, 0b00111, 0b00111, 0b00111,
                   0b01111, 0b11111, 0b11111, 0b00111, 0b00111, 0b01111, 0b11110, 0b11100 };

void setup() {
  lcd.begin(16, 2);  // Inicjalizacja wyświetlacza LCD
  lcd.backlight();
}

void loop() {
  napiecie = map(analogRead(woltomierz), 0, 1023, 0, 99);  // Mapuj wartość napięcia do przedziału (0, 99)

  lcd.createChar(0, znak + 32 * (napiecie / 10));       // Lewa górna część dziesiątek.
  lcd.createChar(1, znak + 32 * (napiecie / 10) + 8);   // Lewa dolna część dziesiątek.
  lcd.createChar(2, znak + 32 * (napiecie / 10) + 16);  // Prawa górna część dziesiątek.
  lcd.createChar(3, znak + 32 * (napiecie / 10) + 24);  // Prawa dolna część dziesiątek.
  lcd.createChar(4, znak + 32 * (napiecie % 10));       // Lewa górna część jednostek.
  lcd.createChar(5, znak + 32 * (napiecie % 10) + 8);   // Lewa dolna część jednostek.
  lcd.createChar(6, znak + 32 * (napiecie % 10) + 16);  // Prawa górna część jednostek.
  lcd.createChar(7, znak + 32 * (napiecie % 10) + 24);  // Prawa dolna część jednostek.

  lcd.setCursor(6, 0);  // Ustaw kursor na pozycji szóstej w wierszu górnym.
  lcd.write(0);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(2);
  lcd.write(4);
  lcd.write(6);
  lcd.setCursor(6, 1);  // Ustaw kursor na pozycji szóstej w wierszu dolnym.
  lcd.write(1);         // Wyślij kolejno adresy górnych części grafik.
  lcd.write(3);
  lcd.write(5);
  lcd.write(7);
}

Powiązane tematy

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