Installing an OLED display on a MMDVM repeater

After the article on the configuration and installation of a Nextion screen on a MMDVM repeater, let’s see together how to integrate a small OLED display on MMDVM.

This type of display is known by the reference SSD1306, it measures 27 millimeters for a display definition of 128 x 64. There are two variants of the SSD1306 display, one running on SPI bus and the other on I2C. I chose the I2C bus model, recognizable by these SCA and SCL pins. It is monochrome but also exists in a yellow and blue two-color version. Only the lines on the top of the display are yellow. This is the model I use.

OLED SSD1306 display

Software prerequisites

You are connected to Raspberry Pi.

First of all, we will validate the SPI and I2C buses of the Raspberry Pi, thanks to the configuration menu.


sudo raspi-config


We now install software packages to manage these buses.

sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors

In order for the modules to start we must indicated them in the modules file

sudo nano /etc/modules

You must have these two lines


(Exit with Ctrl-X and Yes to save)

We restart the Raspberry Pi

sudo reboot

After reconnecting, we must find the ports i2c and spi

ls /dev/i2c*
ls /dev/spi*

Connecting the Display

The SSD1306 is an I2C bus version. The connection is made as shown below.

Detection Test

We will check that the wiring is correct and that the screen is detected on the I2C bus.

Start the following command.

i2cdetect -y 1


Equipment 3c appears. This is the SSD1306 screen.

Installing the OLED Display Communication Library

If you did not install git on your Raspberry Pi, I suggest you run this command.

sudo apt-get install git

Download now the ArduiPi_OLED library (directly on github).

git clone

then run the software compilation

cd ArduiPi_OLED
sudo make

Recompiling MMDVMHost

Let’s update MMDVMHost with these few instructions. The compilation will take several minutes.

cd /opt/MMDVMHost/
make clean
sudo make -f Makefile.Pi.OLED
pi@raspberrypi:/opt/MMDVMHost $ sudo make clean
rm -f MMDVMHost *.o *.d *.bak *~ GitVersion.h
pi@raspberrypi:/opt/MMDVMHost $ sudo make -f Makefile.Pi.OLED
echo "const char *gitversion = \"24358357e890a928f0053bcedd748123d7a6b9c2\";" > GitVersion.h
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o AMBEFEC.o AMBEFEC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o BCH.o BCH.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o BPTC19696.o BPTC19696.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Conf.o Conf.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o CRC.o CRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Display.o Display.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRControl.o DMRControl.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRCSBK.o DMRCSBK.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRData.o DMRData.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRDataHeader.o DMRDataHeader.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMREMB.o DMREMB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMREmbeddedData.o DMREmbeddedData.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRFullLC.o DMRFullLC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRLookup.o DMRLookup.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRLC.o DMRLC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRNetwork.o DMRNetwork.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRShortLC.o DMRShortLC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRSlot.o DMRSlot.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRAccessControl.o DMRAccessControl.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DMRTrellis.o DMRTrellis.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DStarControl.o DStarControl.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DStarHeader.o DStarHeader.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DStarNetwork.o DStarNetwork.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o DStarSlowData.o DStarSlowData.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Golay2087.o Golay2087.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Golay24128.o Golay24128.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Hamming.o Hamming.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o OLED.o OLED.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o LCDproc.o LCDproc.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Log.o Log.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o MMDVMHost.o MMDVMHost.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Modem.o Modem.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o ModemSerialPort.o ModemSerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Mutex.o Mutex.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Nextion.o Nextion.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o NullDisplay.o NullDisplay.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25Audio.o P25Audio.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25Control.o P25Control.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25Data.o P25Data.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25LowSpeedData.o P25LowSpeedData.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25Network.o P25Network.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25NID.o P25NID.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o P25Utils.o P25Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o QR1676.o QR1676.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o RS129.o RS129.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o RS241213.o RS241213.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o RSSIInterpolator.o RSSIInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o SHA256.o SHA256.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o StopWatch.o StopWatch.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Sync.o Sync.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o TFTSerial.o TFTSerial.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Timer.o Timer.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o UDPSocket.o UDPSocket.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o UMP.o UMP.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o YSFControl.o YSFControl.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o YSFConvolution.o YSFConvolution.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o YSFFICH.o YSFFICH.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o YSFNetwork.o YSFNetwork.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -c -o YSFPayload.o YSFPayload.cpp
g++ AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o -g -O3 -Wall -std=c++0x -pthread -DOLED -I/usr/local/include -lArduiPi_OLED -lpthread -o MMDVMHost
pi@raspberrypi:/opt/MMDVMHost $ sudo reboot

Updating the MMDVMHost Configuration File

Here is the final step. Now, in the [General] section of the MMDVM.ini file, we have installed an OLED screen

sudo nano /opt/MMDVMHost/MMDVM.ini
# ModeHang=10

It refers to the OLED section that we do not have to change


Finally, we need to restart the Raspberry Pi

sudo reboot


The display SSD1306 lights up. It is waiting for traffic

SSD1306 I2C display connected to Raspberry Pi, and driven by MMDVMHost

On the talk group TG2, WA4BPS is displayed, it is retransmitted on the Time Slot 2 in DMR


You are experiencing difficulties in implementation, you can comment on it below.

If you would be interested to participate in a possible future new grouped order (MMDVM board, SvxLink Card), leave your email below to be reported!

23 thoughts on “Installing an OLED display on a MMDVM repeater

  1. Replace ‘armv6zk’ with ‘armv7-a’ in Makefile for Ubuntu Mate Pi3

    Remplacer ‘armv6zk’ par ‘armv7-a’ dans le Makefile d’Ubuntu Mate Pi3

  2. Hello
    I have only the first line

    ” i2c-dev ”
    But all is allright
    73 J-Y

    Je n’ai que la première ligne

    Mais tout fonctionne bien
    73 J-Y

    1. Yes, it depend of the version of oled screen (it can be a version with SPI bus).
      Oui, cela dépend de la version de l’écran Oled (cela peut être une version avec bus SPI)

      OLED SPI

  3. Advertisements
  4. Hi,

    did all above but getting following at the end of the compiling process, any idea ?
    Thanks J.

    Ai fait tout ce qui précède, mais à suivre à la fin du processus de compilation, une idée?
    Merci J.

    //usr/local/lib/ undefined reference to `i2c_smbus_write_i2c_block_data'
    //usr/local/lib/ undefined reference to `i2c_smbus_write_byte_data'
    //usr/local/lib/ undefined reference to `i2c_smbus_write_word_data'
    collect2: error: ld returned 1 exit status
    Makefile.Pi.OLED:19: recipe for target 'MMDVMHost' failed
    make: *** [MMDVMHost] Error 1

    1. Jerry,

      It seems that the library libi2c-dev is not present. Have you execute the preliminary installation ? Is there no error at this stage ?
      sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors


      Cela ressemble à la librairie libi2c-dev absente. Avez-vous exécuter l’installation en préliminaire? Il n’y a pas eu d’erreur à ce moment ?
      sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors

  5. Advertisements
  6. HI

    It does not work. The i2cdetect -y 1 detection test finds the
    display. Recompiling the mmdvmhost gives me no errors.
    I’m using Jessie Western D-Star image with Raspberry pi B+.
    Any thoughts?

    Flavio VE2ZFP


    Ça ne marche pas. Le test de détection i2cdetect -y 1 trouve l’afficheur. La recompilation du mmdvmhost ne me donne aucune erreur.
    J’utilise une image Jessie Western D-Star avec Raspberry pi B +.
    Des idées?

    Flavio VE2ZFP

    1. Hi,
      If all compilation and I2C display detection is ok, you may have missed a parameter in the MMDVM.ini file
      Have a check.
      Si la compilation et la détection de l’écran I2C est ok, alors peut-être avez vous loupé un paramètre dans le fichier MMDVM.ini

  7. Hello, if you want a file (RASBIAN) for your SD card no pb with OLED
    my mail on

    73 de F1IZL
    Bonjour, si vous voulez un fichier (RASBIAN) pour votre carte SD pas de problème avec OLED.
    Mon email sur

    73 de F1IZL

  8. Advertisements
  9. Hi everyone!

    First of all i’d like to thank Jean-Yves for his offer, but I have managed to make it work.
    I have a problem with the OLED display now. It woks perfectly for some time then for no reason
    the OLED gets misaligned, the top where it says DMR or the antenna icon goes down and Idle goes up.
    I don’t know if I can post a link here, if you want to see what;s going on just google it “OLED SSD1306 problem
    video. That’s not mine but it’s exactly what happens here. Has anyone experienced this?
    Any help is appreciated.
    73 de VE2ZFP

    Salut à tous!

    Tout d’abord, j’aimerais remercier Jean-Yves pour son offre, mais j’ai réussi à le faire fonctionner.
    J’ai maintenant un problème avec l’écran OLED. Il se passe parfaitement pendant un certain temps, sans raison l’OLED est désaligné, le haut où il dit DMR ou l’icône de l’antenne descend et Idle monte.
    Je ne sais pas si je peux publier un lien ici, si vous voulez voir ce qui se passe sur Google, il “problème OLED SSD1306
    vidéo. Ce n’est pas à moi, mais c’est exactement ce qui se passe ici. Quelqu’un at-il connu cela?
    Toute aide est appréciée.
    73 de VE2ZFP

  10. Bonjour très novice, sur le programmation du Raspberry 3, j’ai la version avec de l’écran OLED avec bus SPI, pour le faire fonctionner mis a part le branchement qui nécessite 6 fils doit-je installer une autre librairie pour le faire fonctionner avec MMDVM ?
    Stéphane F5LGW

    Hello very novice, on the programming of the Raspberry 3, I have the version with OLED screen with SPI bus, to make it work except for the connection which requires 6 wires must I install another library to make it work with MMDVM?
    Thank you
    Stéphane F5LGW

    1. Bonjour Stéphane,

      Dans le code OLED.cpp ( semble avoir prévu l’utilisation de la version SPI de l’écran OLED. Malheureusement, je ne sais pas vous dire quel serait le paramètre et le cablage correspondant. Peut être vous faut-it rechercher la réponse ou poser la question sur le groupe MMDMV sur yahoo


      In the OLED. cpp code ( seems to have foreseen the use of the SPI version of the OLED display. Unfortunately, I don’t know what the parameter and the corresponding wiring would be. Maybe you need to look for the answer or ask the question on the MMDMV group on yahoo


  11. bonjour merci de l’info sur le OLED, le miens est monté sur un Hot Spot MMDVM à base de Orange Pi
    est t’il possible de supprimer ou modifier ce message IDLE, car il y a aussi un défilement MMDVM qui passe et au bout d’un moment ce fameux message, mais je ne trouve pas dans les fichiers ou on peut changer cela

    73 merci des infos

    Hello thanks for the info about OLED, mine is mounted on an MMDVM Hot Spot MMDVM based on Orange Pi.
    is it possible to delete or modify this IDLE message, because there is also a MMDVM scrolling that passes and after a while this famous message, but I can’t find in the files where you can change it.

    73 thanks for the info

    1. Bonjour Jean-Charles,

      Le mot “idle” signifie inactif ou pas d’émission. Il s’affiche lorsque le hotspot (ou le relais) est en veille. Il s’affiche sur l’écran aléatoirement ou en défilant, comme un écran de veille.

      Si d’aventure vous voudriez remplacer le mot ‘idle’, le seul moyen que je vois est de modifier le code C de la fonction COLED::clearCWInt() qui est dans le fichier OLED.cpp puis de (re)conpiler le MMDVMHost.

      Ici ligne 363 (


      Hello Jean-Charles,

      The word “idle” means inactive or no emission. It is displayed when the hotspot (or repeater) is in standby. It is displayed on the screen randomly or by scrolling, like a screen saver.

      If by adventure you would like to replace the word’ idle’, the only way I see is to change the C code of the function COLED:: clearCWInt () which is in the OLED. cpp file and then (re)condition the MMDVMHost.

      Here line 363 (


      1. bonjour merci de l’info, je vais tester ca rapidement

        encore GRAND merci


        Hello thanks for the info, I’ll test it quickly.

        again BIG thank you


  12. Advertisements
    1. Craig,

      Can you paste here the error message you got ?



      Pouvez-vous poster ici le message d’erreur que vous avez ?

  13. Hello, got a error message while complining the #oled things at this stage:
    git clone
    cd ArduiPi_OLED
    sudo make

    got following out:
    g++ -shared -Wl,-soname, -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -o ArduiPi_OLED.o Adafruit_GFX.o bcm2835.o Wrapper.o -li2c
    /usr/bin/ld: cannot find -li2c
    collect2: error: ld returned 1 exit status
    Makefile:54: recipe for target 'ArduiPi_OLED' failed
    make: *** [ArduiPi_OLED] Error 1

    any idea what i could be?
    br and 73 Joachim DG8JT

    Hello, j’ai un message d’erreur lors de la compilation du programme OLED à cette étape :
    git clone
    cd ArduiPi_OLED
    sudo make

    Qui retourne ceci:
    g++ -shared -Wl,-soname, -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -o ArduiPi_OLED.o Adafruit_GFX.o bcm2835.o Wrapper.o -li2c
    /usr/bin/ld: cannot find -li2c
    collect2: error: ld returned 1 exit status
    Makefile:54: recipe for target 'ArduiPi_OLED' failed
    make: *** [ArduiPi_OLED] Error 1

    Une idée de ce que cela peut être ?

    br et 73 Joachim DG8JT

  14. Advertisements
  15. I am using this MMDVM open-source multi-mode digital voice modem board.
    Anyone using same board?
    The MMDVM board is connected to the Raspberry Pi first 2×5 GPIO pins.
    Can you please share where should I connect OLED SSD1306 screen? 73 de VU2UUU

    J’utilise cette carte modem open-source MMDVM.
    Quelqu’un utilise la même platine ?
    La carte MMDVM est connectée aux premières broches 2×5 GPIO de Raspberry Pi.
    Pouvez-vous s’il vous plaît partager où dois-je connecter l’écran OLED SSD1306 ? 73 de VU2UU

  16. OLED type are:
    0 Adafruit SPI 128×32
    1 Adafruit SPI 128×64
    2 Adafruit I2C 128×32
    3 Adafruit I2C 128×64
    4 Seeed I2C 128×64
    5 Seeed I2C 96×96
    6 SH1106 I2C 128×64

  17. Bonjour, j’ ai installé un écran oled 0.96″ 12C SPI sur ma carte MMDVM qui n’est pas activé. J’ai donc essayé avec la procédure indiqué ci-dessous mais sans succès. Le problème c’est l’impossibilité d’ouvrir “raspi-config” avec Putty
    pi-star@pi-star(rw):~$ sudo raspi-config
    sudo:raspi-config: command not found

    Voilà mon problème……
    Merci de votre aide
    Christian F5GJG

    Hello, I installed an oled 0.96″ 12C SPI screen on my MMDVM card that is not enabled. So I tried with the procedure below but without success. The problem is the impossibility to open “raspi-config” with Putty
    pi-star@pi-star(rw):~$ sudo raspi-config
    sudo:raspi-config: command not found

    That’s my problem………
    Thank you for your help
    Christian F5GJG

    1. Bonjour,

      A priori vous utilisez pas une distribution debian, mais une image pi-star. Vous pouvez directement mettre en service votre écran OLED depuis le menu de configuration MMDVMHost depuis le serveur pi-star.
      Pi star OLD
      Le forum de support pour pi-star est ici


      I presumable that you are not using a debian distribution, but a pi-star image. You can directly activate your OLED display from the MMDVMHost configuration menu from the pi-star server.
      Pi star OLD
      The support forum for pi-star is here

Leave a Reply

Your email address will not be published. Required fields are marked *