SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

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 nocny

Płytka prototypowa

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.

Tryb pomiarowy

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.

  1. #!/usr/bin/php
  2.  
  3. <?php
  4.  
  5.         error_reporting(E_ALL | E_NOTICE | E_WARNING | E_STRICT);
  6.  
  7.         require_once('monitino.class.php');
  8.         require_once('php_serial.class.php');
  9.  
  10.         $simpleInfo = new Monitino();
  11.  
  12.         // Setup connection
  13.         $serial = new phpSerial();
  14.         $serial->deviceSet("/dev/ttyACM0");
  15.         $serial->confBaudRate(57600);
  16.         $serial->confParity("none");
  17.         $serial->confCharacterLength(8);
  18.         $serial->confStopBits(1);
  19.         $serial->deviceOpen();
  20.  
  21.         while(true)
  22.         {
  23.                 // Get CPU usage
  24.                 $cpus = trim(round($simpleInfo->getCPU()));
  25.  
  26.                 // Get sensorsd values
  27.                 $cput = trim(round($simpleInfo->getSensor('coretemp-isa-0000', 'temp1_input')));
  28.                 $cpuf = trim(round($simpleInfo->getSensor('f71889a-isa-0290', 'fan1_input')));
  29.  
  30.                 // Get disk usage
  31.                 $syst = trim(round($simpleInfo->getDF('/dev/sda2')));
  32.                 $sysh = trim(round($simpleInfo->getDF('/dev/sda5')));
  33.  
  34.                 // Preapre message
  35.                 $message = "cpus:".$cpus."|cput:".$cput."|cpuf:".$cpuf;
  36.                 $message.= "|syst:".$syst."|sysh:".$sysh;
  37.  
  38.                 // Send to Arduino
  39.                 $serial->sendMessage($message."n");
  40.                 echo $message."n";
  41.                 sleep(1);
  42.         }
  43.  
  44. ?>

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Ω,

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 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

  1. #!/bin/bash
  2.  
  3. MYSQLDUMP=`which mysqldump`
  4. MYSQL=`which mysql`
  5.  
  6. USER=""
  7. PASSWORD=""
  8.  
  9. OUTPUTDIR=${PWD}
  10. GZIP_ENABLED=0
  11. BZIP2_ENABLED=0
  12. ENCODING="latin1"
  13. STAMP=$(date +%Y_%m_%d_%H)
  14.  
  15. while getopts u:e:o:gb OPTION
  16. do
  17.     case ${OPTION} in
  18.         u) USER=${OPTARG};;
  19.         e) ENCODING=${OPTARG};;
  20.         o) OUTPUTDIR=${OPTARG}; mkdir -p $OUTPUTDIR;;
  21.         g) GZIP_ENABLED=1; USEZIPX="gzip"; ZIPE="gz";;
  22.         b) BZIP2_ENABLED=1; USEZIPX="bzip2" ZIPE="bz2";;
  23.         *) exit 2;;
  24.     esac
  25. done
  26.  
  27. if [ "$USER" != '' ]; then
  28.     echo "Enter password for" $USER":"
  29.     oldmodes=`stty -g`
  30.     stty -echo
  31.     read PASSWORD
  32.     stty $oldmodes
  33. fi
  34.  
  35. DBS=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(information_schema|Database)"`
  36.  
  37. for db in $DBS; do
  38.     echo "Backup database: $db / $ENCODING encoding"
  39.     if [ $GZIP_ENABLED == 1 ] || [ $BZIP2_ENABLED == 1 ]; then
  40.     $MYSQLDUMP --force --opt
  41.     --user=$USER --password=$PASSWORD --databases $db
  42.     --default-character-set=$ENCODING -N | $USEZIPX > "$OUTPUTDIR/$STAMP-$db.$ZIPE"
  43.     else
  44.     $MYSQLDUMP --force --opt
  45.     --user=$USER --password=$PASSWORD --databases $db
  46.     --default-character-set=$ENCODING -N > "$OUTPUTDIR/$STAMP-$db.sql"
  47.     fi
  48. done