# Announcement Box Linux box with a loudspeaker and an emergency light to be used for announcements and notifications. ## Hardware * SBC with GPIOs and sound output :: OrangePi Zero with an expansion board * PA system * speaker :: 30W, 4 Ohms horn loudspeaker * sound amplifier :: mono 18W sound amplifier * relay module :: 12V low trigger relay * Warning Light system * warning light :: 12V 10W rotary orange warning light * relay module :: 12V low trigger relay ## Software * Operating System - Linux :: Armbian Bullseye for the OrangePi Zero * PA System * Voice Synthesizer :: Festival / ESpeak ## Implementation Notes ### Armbian + OrangePi Zero Installation #### Enable analog soundcard ``` sudo armbian-config # System > Hardware > [*] analog-codec ``` #### Software Dependencies ##### OS Packages ```bash apt install mplayer espeak-ng ``` ##### GPIO toolkit ```bash # upstream: #git clone https://github.com/orangepi-xunlong/wiringOP # enhanced: git clone https://github.com/Dejvino/wiringOP cd wiringOP ./build clean ./build ``` #### Initialize GPIOs ```bash # System Activity Indicator PIN_SALIGHT=11 gpio mode $PIN_SALIGHT output # Emergency Light system PIN_ELIGHT=7 gpio mode $PIN_ELIGHT output # PA system PIN_PASOUND=5 gpio mode $PIN_PASOUND output ``` ### PA System #### Text to Speech ```bash ## Festival # reading ... # to file text2wave text.txt > wave.wav ## ESpeak # voices: ls /usr/lib/arm-linux-gnueabihf/espeak-data/voices/ # reading espeak -f text.txt -p 40 -s 160 -v "en-us" # to file espeak -f text.txt -p 40 -s 160 -k15 -g 1 -w wave.wav # using SSML (e.g.: https://www.xml.com/pub/a/2004/10/20/ssml.html) espeak -f ssml.txt -m ``` #### Converting into a low-quality broadcast audio ```bash sox infile.wav outfile.wav downsample echo 0.5 1 1 1 ``` #### Playing a sound file ```bash aplay file.wav mplayer file.mp3 ``` ### Emergency Light #### Control Script ```bash cat /usr/local/bin/emergency-light #!/bin/bash PIN_ELIGHT=7 # init gpio mode $PIN_ELIGHT output # command if [[ "$1" == "on" ]]; then gpio write $PIN_ELIGHT 1 elif [[ "$1" == "off" ]]; then gpio write $PIN_ELIGHT 0 elif [[ "$1" == "read" ]]; then gpio read $PIN_ELIGHT else gpio toggle $PIN_ELIGHT fi ``` ### System Activity Light #### System Usage ```bash uptime | head -n 1 | cut -f3 -d, | cut -f2 -d: ``` #### Daemon ```bash cat /etc/systemd/system/system-activity-light.service [Unit] Description=System Activity Light Daemon [Service] ExecStart=/usr/sbin/system-activity-light-daemon [Install] WantedBy=multi-user.target ``` ```bash cat /usr/sbin/system-activity-light-daemon #!/bin/bash DELAY=10000 while [[ true ]]; do ACTIVITY=2000 TOP=`system-usage` if (( $(echo "$TOP > 1.0" | bc -l) )); then ACTIVITY=50 elif (( $(echo "$TOP > 0.75" | bc -l) )); then ACTIVITY=100 elif (( $(echo "$TOP > 0.5" | bc -l) )); then ACTIVITY=500 elif (( $(echo "$TOP > 0.2" | bc -l) )); then ACTIVITY=1000 fi echo $TOP system-activity-light blink $ACTIVITY $DELAY done ``` ```bash sudo systemctl enable --now system-activity-light.service ```