Od dłuższego czasu nosiłem się z zamiarem zrobienia własnego panelu, wyświetlającego wybrane parametry pracy komputera, który z powodzeniem mógłbym zainstalować w zatoce 5.25". Miał do tego posłużyć wcześniej zakupiony 1.8" wyświetlacz HY-1.8 SPI oraz Arduino UNO R3, odbierający dane poprzez gniazdo USB. Taki panel może okazać się również pomocny w monitorowaniu pracy domowego serwera, bez konieczności włączania monitora.
Taki był zamiar - przynajmniej do momentu, gdy musiałem oddać swój sypialniany zegarek. W finale postanowiłem więc opracować dwa tryby: nocny oraz pomiarowy.
Funkcja zegara oraz pomiaru temperatury i wilgotności
W pierwszej kolejności postanowiłem rozbudować swój Monitino o pracę w trybie nocnym, czyli prezentację wartości typowych dla zegarów: godzina, data, sekundnik, temperatura oraz wilgotność panująca w pomieszczeniu. W prawym dolnym rogu znajduje się natomiast ikona prezentująca, czy układ odbiera dane pomiarowe z USB (serduszko lub rozłączona wtyczka).
Arduino sam w sobie nie posiada zegara RTC, dlatego wykorzystałem do tego celu dość popularny układ DS1307 z możliwością podtrzymywania bateryjnego w przypadku całkowitego braku zasilania. Do pomiaru temperatury i wilgotności wybrałem banalny czujnik DHT11 komunikujący się z Arduino za pomocą interfejsu 1-Wire.
Tryb pracy monitorowania systemu
Drugi typ pracy to prezentacja podstawowych wartości systemowych takich jak: obciążenie procesora, pomiar temperatury, prędkości obrotowej wentylatora CPU oraz stan zajętości wybranych partycji dysku. Tryb ten aktywowany jest w momencie, kiedy przesyłane są dane z USB. Kiedy komputer jest wyłączony lub kiedy dane nie napływają w czasie dłuższym niż 5 sekund - ekran zostaje przełączony w tryb nocny.
W dolnej części ekranu znajdują się dwie zielone ikony symbolizujące ogólny stan wolnej przestrzeni na dysku i wysokiej temperatury procesora - kiedy przekroczy ona 65 stopni Celsjusza, zacznie migać symbol płomienia.
Aby układ działał również po wyłączeniu komputera, należy upewnić się czy wybrane przez nas gniazdo USB dostarcza nam wtedy zasilanie. Większość płyt głównych tak się właśnie zachowuje lub pozwala na ustawienie odpowiednich opcji w BIOS - np.: Wake on USB Events. Osobiście wykorzystałem do tego drugi kanał USB w gnieździe bezpośrednio na płycie głównej. Co ciekawe, nie wszystkie porty USB zapewniają nam napięcie po wyłączeniu komputera.
Podświetlanie diodami RGB
Do układu również podłączone są dwie diody RGB zmieniające kolor, w zależności od procentowego stopnia obciążenia procesora. Każdy kolor świecenia diod LED odpowiada określonemu przedziałowi procentowemu. Zdecydowałem się na diody RGB z jednego względu - posiadam obudowę, która fabrycznie posiada podświetlanie plastikowych pasków w błękitnej barwie - problem w tym, że jest to jeden kolor i nie mam na niego żadnego wpływu. Owe dwie diody RGB wykorzystam właśnie do ich wymiany i kolorowego podświetlania obudowy.
Podświetlanie obudowy w zależności od stopnia obciążenia procesora
Jako, że komputer jest włączony przeważnie przez 24h/dobę i nie każdy musi lubować się w świecących diodach po nocy, można przełączyć się w tryb nocny za pomocą przycisku S1 (patrz schemat), w którym domyślnie diody są wygaszone, a podświetlanie ekranu TFT zmniejszone jest o połowę, pozwalając bezproblemowy odczyt godziny.
Skrypt PHP
Dane wysyłane są za pomocą prostego skryptu napisanego w PHP uruchomionego w trybie CLI. Ważne jest, aby wybrać odpowiednie urządzenie, które w moim przypadku znajduje się pod /dev/ttyACM0. Należy zwrócić również uwagę na punkty montowania partycji oraz wybór odpowiednich dla nas czujników sensorsd.
- #!/usr/bin/php
- <?php
- require_once('monitino.class.php');
- require_once('php_serial.class.php');
- $simpleInfo = new Monitino();
- // Setup connection
- $serial = new phpSerial();
- $serial->deviceSet("/dev/ttyACM0");
- $serial->confBaudRate(57600);
- $serial->confParity("none");
- $serial->confCharacterLength(8);
- $serial->confStopBits(1);
- $serial->deviceOpen();
- while(true)
- {
- // Get CPU usage
- // Get sensorsd values
- // Get disk usage
- // Preapre message
- $message = "cpus:".$cpus."|cput:".$cput."|cpuf:".$cpuf;
- $message.= "|syst:".$syst."|sysh:".$sysh;
- // Send to Arduino
- $serial->sendMessage($message."n");
- echo $message."n";
- }
- ?>
Jak to działa?
Układ połączeń
Warto tutaj zwrócić uwagę na kondensator C2, dzięki któremu Arduino nie będzie się resetować w przypadku otworzenia portu USB. Dodatkowa zworka pozwoli nam na łatwe wyłączenie tej opcji w momencie, kiedy będziemy chcieli zaprogramować Arduino.
Lista cześci
- 1x Arduino UNO R3,
- 1x Wyświetlacz HY-1.8 SPI,
- 1x Zegar RTC DS1307,
- 1x Kwarc 32.768 kHz,
- 1x Bateria 3V CR2032,
- 1x Czujnik wilgotności i temperatury DHT11,
- 1x Bufor CD4050BE,
- 1x Kondensator 10uF,
- 1x Kondensator 1uF,
- 2x Rezystor 10kΩ,
- 2x Rezystor 2.2kΩ,
- 1x Rezystor 100Ω
- 3x Rezystor 56Ω,
Lista bibliotek
Uwagi końcowe
Podczas pierwszego programowania układu, należy ustawić zegar DS1307 poprzez definicję zmiennej #define RTCSet true. Kiedy zegar zostanie ustawiony, programujemy układ ponownie z ustawieniem #define RTCSet fasle.
Należy pamiętać, że przed programowaniem układu należy usunąć zworkę JP1.
W niedługim czasie będę zamawiał dwustronne płytki PCB w formacie shieldów do Arduino UNO R3 - jeśli jesteś zainteresowany proszę o kontakt. Im więcej płytek, tym będzie taniej za sztukę.
Strona projektu: https://www.jarzebski.pl/projekty/monitino-uno.html
Reklama
UDOO - połączenie Raspberry Pi i Arduino DUE
UDOO to kolejny projekt miniaturowego komputera, który jest w stanie uruchomić system operacyjny Linux lub Android. Jego moc ma być 4x większa niż w przypadku Raspberry Pi oraz oferować to samo co platforma Arduino DUE, umożliwiając podłączenie dodatkowych shieldów.
UDOO jak przystało na tego typ sprzęt, będzie otwartym rozwiązaniem wyposażonym w procesor ARM i.MX6 Freescale oraz ARM SAM3X znanym z Arduino DUE. Wymiary płytki to zaledwie 11 x 8.5 cm, a więc mniej niż standardowe pudełko na płytę CD.
Sugerowane ceny to 110$ i 130$ za wersję kolejno dwu- i czterordzeniową.
Pełna specyfikacja przestawia się następująco:
- Dwu- lub czterordzeniowy procesor Freescale i.MX 6 ARM Cortex-A9 1GHz,
- Zintegrowana grafika z oddzielnymi, trzema akceleratorami 2D, OpenGL® ES2.0 3D i OpenVG™,
- Procesor Atmel SAM3X8E ARM Cortex-M3,
- 1GB pamięci DDR3,
- 54 cyfrowe I/O + analogowe wejście,
- HDMI oraz LVDS + Touch (I2C),
- Złącze Ethernet RJ45 (10/100/1000 MBit)
- Moduł WiFi,
- Mini USB oraz USB OTG,
- Dwa porty USB 2.0,
- Analogowe wyjście Audio oraz wejście mikrofonowe,
- Port SATA (tylko w wersji czterordzeniowej)
- Slot kamery,
- Slot Micro SD,
- Zasilanie z gniazda 5-12 V lub złącza baterii,
Pierwsze egzemplarze mają trafić do zainteresowanych już we wrześniu 2013.
Więcej informacji na Kickstarterze.
Czasami konieczne jest szybkie wykonanie kopii bezpieczeństwa wszystkich baz danych MySQL na serwerze. Problemu nie ma, gdy baz jest kilka, jednak pojawia się przy ich większej ilości. Pomóc nam może prosty skrypt massdump.sh.
Dostępne parametry przy uruchomieniu:
- -o KATALOG_DOCELOWY
- -u NAZWA_UŻYTKOWNIKA
- -e KODOWANIE_ZNAKÓW
- -g włączenie kompresji gzip
- -b włączenie komprezji bzip2
Wystarczy wydać polecenie i gotowe: massdump.sh -u root -e utf8 -b
- #!/bin/bash
- MYSQLDUMP=`which mysqldump`
- MYSQL=`which mysql`
- USER=""
- PASSWORD=""
- OUTPUTDIR=${PWD}
- GZIP_ENABLED=0
- BZIP2_ENABLED=0
- ENCODING="latin1"
- STAMP=$(date +%Y_%m_%d_%H)
- while getopts u:e:o:gb OPTION
- do
- case ${OPTION} in
- u) USER=${OPTARG};;
- e) ENCODING=${OPTARG};;
- o) OUTPUTDIR=${OPTARG}; mkdir -p $OUTPUTDIR;;
- g) GZIP_ENABLED=1; USEZIPX="gzip"; ZIPE="gz";;
- b) BZIP2_ENABLED=1; USEZIPX="bzip2" ZIPE="bz2";;
- *) exit 2;;
- esac
- done
- if [ "$USER" != '' ]; then
- echo "Enter password for" $USER":"
- oldmodes=`stty -g`
- stty -echo
- read PASSWORD
- stty $oldmodes
- fi
- DBS=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(information_schema|Database)"`
- for db in $DBS; do
- echo "Backup database: $db / $ENCODING encoding"
- if [ $GZIP_ENABLED == 1 ] || [ $BZIP2_ENABLED == 1 ]; then
- $MYSQLDUMP --force --opt
- --user=$USER --password=$PASSWORD --databases $db
- --default-character-set=$ENCODING -N | $USEZIPX > "$OUTPUTDIR/$STAMP-$db.$ZIPE"
- else
- $MYSQLDUMP --force --opt
- --user=$USER --password=$PASSWORD --databases $db
- --default-character-set=$ENCODING -N > "$OUTPUTDIR/$STAMP-$db.sql"
- fi
- done