Arduino jest platformą Open Source używaną do budowania projektów elektronicznych. Składa się zarówno z fizycznej płytki programowalnej/mikrokontrolera, jak i z oprogramowania IDE (Integrated Development Environment), które służy do pisania i przesyłania kodu komputerowego do tej płytki.
Platforma Arduino stała się popularna wśród osób rozpoczynających przygodę z elektroniką. W przeciwieństwie do większości poprzednich układów programowalnych Arduino nie wymaga osobnego sprzętu (zwanego programatorem), aby załadować nowy kod na płytkę – można po prostu użyć kabla USB. Dodatkowo Arduino IDE używa uproszczonej wersji języka C++, co ułatwia naukę programowania.
Sprzęt i oprogramowanie Arduino zostały zaprojektowane dla hobbystów, projektantów, artystów i wszystkich zainteresowanych tworzeniem interaktywnych obiektów i środowisk. Arduino może współpracować z przyciskami, diodami LED, silnikami, głośnikami, urządzeniami GPS, kamerami, internetem, a nawet smartfonem czy telewizorem, czyli z większością dostępnego sprzętu i peryferii.
Taka elastyczność w połączeniu z tym, że oprogramowanie Arduino jest darmowe, płytki sprzętowe są dosyć tanie, a zarówno oprogramowanie, jak i sprzęt są łatwe do nauczenia się, doprowadziła do powstania dużej społeczności użytkowników. Stworzyła ona kod dla ogromnej liczby otwartych projektów opartych na Arduino.
Dzisiaj, korzystając z Arduino IDE uruchomionego na EuroLinux Desktop, zajmiemy się utworzeniem prostego programu, który za pomocą czujnika dymu i gazów łatwopalnych MQ-2 oraz czujnika temperatury i wilgotności DHT11, będzie monitorował naszą serwerownię.
Jak zaprogramować płytkę Arduino?
Arduino IDE to oprogramowanie Open Source, które jest napisane w Javie i działa na różnych platformach: Windows, Mac i Linux. IDE umożliwia pisanie kodu w specjalnym środowisku z podświetlaniem składni i innymi funkcjami, które ułatwiają kodowanie, a następnie łatwe załadowanie kodu do urządzenia za pomocą prostego kliknięcia przycisku.
Program napisany za pomocą IDE dla Arduino jest nazywany „szkicem”. Typowy szkic Arduino w języku C/C++ składa się z dwóch funkcji, które są kompilowane i łączone z funkcją main() w cykliczny program wykonawczy:
- setup() – funkcja uruchamiana raz na początku programu, która inicjalizuje ustawienia
- loop() – funkcja wywoływana wielokrotnie, aż do wyłączenia płytki.
Posiadając te podstawowe informacje, możemy przejść do kolejnego kroku, którym jest instalacja środowiska programistycznego.
Instalacja Arduino IDE w EuroLinux 9 Desktop
Uwaga – poradnik był pisany dla Arduino IDE w wersji 1.8. Proces instalacji aktualnej wersji 2.0 mógł ulec zmianie.
Aby móc programować Arduino, w pierwszej kolejności należy pobrać skompresowane archiwum IDE ze strony https://www.arduino.cc/en/software, wybierając wersję dla systemu Linux 64-bit.
Następnie uruchamiamy terminal i rozpakowujemy archiwum IDE poleceniem:
tar -xf arduino-*.tar.xz
Teraz należy przenieść katalog z IDE do katalogu domowego:
mv arduino-*/ ~/
i przejść do tego katalogu:
cd ~/arduino-*/
Przed kolejnym krokiem upewnijmy się, że posiadamy zainstalowany pakiet java-11-openjdk. Jeżeli nie – to zainstalujmy go poleceniem:
sudo dnf install java-11-openjdk
Dopiero w tej chwili możliwa jest właściwa instalacja środowiska Arduino IDE, która odbywa się poprzez wykonanie polecenia:
sudo ./install.sh
Po zakończeniu procesu instalacji należy jeszcze usunąć katalog java, który znajduje się w katalogu bieżącym:
rm -rf java
Musimy także dodać naszego użytkownika do grupy dialout, dzięki czemu uzyskamy dostęp do portu, na którym działa nasze Arduino:
sudo usermod -aG dialout $USER
Po tej operacji wymagany jest restart komputera.
Teraz możemy uruchomić Arduino IDE w systemie EuroLinux Desktop po prostu wybierając z listy dostępnych programów aplikację Arduino IDE.
W zależności od preferencji możemy wybrać wersję dzienną lub nocną środowiska w systemie EuroLinux Desktop klikając ikonkę księżyca w prawym, dolnym rogu ekranu:
Montaż i aktywacja projektu
Jeżeli aplikacja IDE działa poprawnie, to możemy przejść do montażu płytki na podstawie poniższego schematu:
W projekcie korzystamy z najpopularniejszych rezystorów 220Ω oraz z klasycznej płytki prototypowej. Efekt końcowy powinien wyglądać podobnie jak na zdjęciu:
Możemy teraz przejść do oprogramowania płytki. W pierwszej kolejności musimy dodać bibliotekę do obsługi czujników temperatury DHT11, DHT21 i DHT22.
Dokonamy tego z menu Szkic → Dołącz bibliotekę → zarządzaj bibliotekami → w oknie wyszukiwania wpisujemy dht i z listy poniżej wybieramy bibliotekę: DHT sensor library by Adafruit.
Instalujemy powyższą bibliotekę i wszystkie jej zależności.
Aktywujemy port komunikujący się z Arduino wybierając z menu Narzędzia → Port → /dev/ttyACM0
W Arduino IDE wklejamy gotowy poniższy szkic, kompilujemy go przyciskiem w lewym górnym rogu i jeżeli wszystko przebiegło poprawnie, to wysyłamy go do Arduino przyciskiem umieszczonym tuż obok poprzedniego, służącego do kompilacji.
/*
DHT11 + MQ-2 + Piezzo / Arduino Sketch
--------------------------------------
REQUIRES the following Arduino libraries:
- DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
- Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
*/
#include "DHT.h"
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
#define DHTPIN 2 // Digital pin connected to the DHT sensor
#define SMOKE A5 // Analog pin connected to MQ-2 sensor
#define BUZZER 10 // Buzzer pin
#define STHRES 400 // Smoke threshold value
#define TTHRES 30 // Temperature threshold value
// Initialize DHT sensor.
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
pinMode(BUZZER, OUTPUT);
pinMode(SMOKE, INPUT);
Serial.println(F("SrvMon"));
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
int smokeSensor = analogRead(SMOKE);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old'
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Serial.print(F("Temperature: "));
Serial.print(t);
Serial.print(F(" °C "));
Serial.print(F("Smoke: "));
Serial.print(smokeSensor);
Serial.print(F(" "));
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.println(F(" %"));
if (smokeSensor > STHRES or t > TTHRES) tone(BUZZER, 1000, 200);
}
Jeżeli procesy kompilacji i wgrywania programu na płytkę przebiegły pomyślnie, to wprost z naszego Arduino możemy teraz podejrzeć wartości trzech zmiennych: temperatury powietrza, zadymienia i wilgotności powietrza. Dokonamy tego w Arduino IDE z menu Narzędzia → Monitor portu szeregowego. Komputer wyśle do Arduino wiadomość SrvMon i w wyniku powinniśmy otrzymać aktualizowane co dwie sekundy dane tych trzech powyższych wartości:
Temperature: 26.10 °C Smoke: 27 Humidity: 42.00 %
Temperature: 26.10 °C Smoke: 27 Humidity: 41.00 %
Temperature: 26.10 °C Smoke: 27 Humidity: 42.00 %
Temperature: 26.10 °C Smoke: 27 Humidity: 42.00 %
Temperature: 26.10 °C Smoke: 26 Humidity: 42.00 %
Temperature: 26.10 °C Smoke: 26 Humidity: 42.00 %
Jeżeli wartość zmiennej Smoke przekracza 400, to znaczy, że w pomieszczeniu obecny jest dym i włączy się przerywany sygnał dźwiękowy. Będzie on odtwarzany również w przypadku przekroczenia temperatury powyżej 30 stopni Celsjusza. Oczywiście są to domyślne wartości – można eksperymentować z tymi ustawieniami korzystając ze zmiennych STHRESH i TTHRES odpowiednio dla dymu i temperatury.
Kontrola procesu
Teraz pozostaje już tylko skryptowy, systematyczny odczyt tych danych przez serwer np. co 30 sekund. Wykorzystamy do tego zadania prosty skrypt bashowy. Powiadomienie o wykryciu dymu lub o zbyt wysokiej temperaturze, wysyłane będzie poprzez komunikator Slack:
#!/bin/bash
# Temperature threshold value
TTHRES=30
# Smoke threshold value
STHRES=400
# Time gap between Slack messages
SLACK_SLEEP=5
# Time gap between checks
BREAK=30
function Slack () {
`curl -s -X POST -H 'Content-type: application/json' --data "{'text':'$1'}" https://hooks.slack.com/services/T01GNQECZT7/B01J837URLH/uQuAjfoejsfJpIO`
}
stty 9600 -ixon icanon </dev/ttyACM0
while true; do
MES=$(head -2 /dev/ttyACM0 | grep Temp)
TMP=$(echo $MES | cut -f 2 -d' ')
SMG=$(echo $MES | cut -f 5 -d' ')
TMP=$(printf '%.0f' $TMP)
[[ "$SMG" -gt "$STHRES" ]] && \
Slack "Fire in the server room !!" && sleep $SLACK_SLEEP
[[ "$TMP" -gt "$TTHRES" ]] && \
Slack "High temperature - DevOps are mining Ethereum again !!"
sleep $BREAK
done
Odpowiedź na pytania czy, jak i dlaczego podłączyć nasze Arduino bezpośrednio do internetu i ominąć komunikację poprzez serwer, pozostawiam już w gestii naszych czytelników.
Podsumowanie
Oprogramowanie Arduino IDE jest łatwe w użyciu dla początkujących, a jednocześnie wystarczająco elastyczne dla zaawansowanych użytkowników. Działa na komputerach Mac, Windows i Linux – w tym na komputerach z zainstalowanym systemem EuroLinux 9 Desktop. Oprócz łatwości programowania, którą umożliwia Arduino IDE, inną ważną cechą jest moc i możliwości mikrokontrolera AVR, na którym jest oparte. Dzięki szerokiemu wyborowi tanich modułów, czujników i siłowników, naprawdę nie ma wielu rzeczy, których nie da się stworzyć z Arduino – ograniczeniem jest tylko nasza wyobraźnia.