PIAST OLED プログラム

提供: VoIP-Info.jp
移動先: 案内検索


OLED(SO1602AWxx-UC-W)表示処理用プログラム

OLED初期化

oledinit.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>

#include <linux/i2c-dev.h>


main(int argc, char *argv[])
{
        int     i2c_fd; //I2Cバス用のファイル・ディスクリプタ

        char            *i2cbus = "/dev/i2c-1"; //バス1側のデバイス名
        int             oled_addr = 0x3c;        //OLEDのアドレス
        unsigned char   oled_reg = 0x40;         //書き込み対象のレジスタ

        int             i;                      //汎用カウンタ
        unsigned char   buf[4];                 //書き込み用バッファ
        char            dmesg[256];

        if(argc < 1) exit(1);

        //I2Cバスをオープンする
        if((i2c_fd = open(i2cbus, O_RDWR))<0){
                perror("oledinit open");
                exit(1);
        }

        //スレーブのアドレスをioctlで設定
        if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){
                perror("oledinit can't set slave");
                close(i2c_fd);
                exit(1);
        }


        usleep(100);
        //OLED初期化
        //ディスプレイ消去
        buf[0] = 0x00;
        buf[1] = 0x01;
        write(i2c_fd,buf,2);
        usleep(20);
        //カーソルをホームへ
        buf[0] = 0x00;
        buf[1] = 0x02;
        write(i2c_fd,buf,2);
        usleep(20);
        //表示ON,カーソル表示なし
        buf[0] = 0x00;
        buf[1] = 0x0c;
        write(i2c_fd,buf,2);
        usleep(20);
        //表示ON
        buf[0] = 0x00;
        buf[1] = 0x01;
        write(i2c_fd,buf,2);
        usleep(20);

        close(i2c_fd);
}

OLED1行目表示用

oledsp1.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>

#include <linux/i2c-dev.h>


main(int argc, char *argv[])
{
        int     i2c_fd; //I2Cバス用のファイル・ディスクリプタ

        char            *i2cbus = "/dev/i2c-1"; //バス1側のデバイス名
        int             oled_addr = 0x3c;        //OLEDのアドレス
        unsigned char   oled_reg = 0x40;         //書き込み対象のレジスタ

        int             i;                      //汎用カウンタ
        unsigned char   buf[4];                 //書き込み用バッファ
        char            dmesg[256];

        if(argc < 2) exit(1);

        //I2Cバスをオープンする
        if((i2c_fd = open(i2cbus, O_RDWR))<0){
                perror("oledinit open");
                exit(1);
        }

        //スレーブのアドレスをioctlで設定
        if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){
                perror("oledinit can't set slave");
                close(i2c_fd);
                exit(1);
        }

        //カーソルをホームへ
        buf[0] = 0x00;
        buf[1] = 0x02;
        write(i2c_fd,buf,2);
        usleep(20);

        //1行目処理
        strncpy(dmesg, argv[1], 16);
        //メッセージ書き込み
        for(i=0;i<16;i++) {
                buf[0] = 0x40;
                if(dmesg[i] == 0) break;
                buf[1] = dmesg[i];
                write(i2c_fd,buf,2);
                usleep(20);
        }

        close(i2c_fd);
}

OLED2行目表示用

oledsp2.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/ioctl.h>

#include <linux/i2c-dev.h>


main(int argc, char *argv[])
{
        int     i2c_fd; //I2Cバス用のファイル・ディスクリプタ

        char            *i2cbus = "/dev/i2c-1"; //バス1側のデバイス名
        int             oled_addr = 0x3c;        //OLEDのアドレス
        unsigned char   oled_reg = 0x40;         //書き込み対象のレジスタ

        int             i;                      //汎用カウンタ
        unsigned char   buf[4];                 //書き込み用バッファ
        char            dmesg[256];

        if(argc < 2) exit(1);

        //I2Cバスをオープンする
        if((i2c_fd = open(i2cbus, O_RDWR))<0){
                perror("oledinit open");
                exit(1);
        }

        //スレーブのアドレスをioctlで設定
        if(ioctl(i2c_fd, I2C_SLAVE, oled_addr) < 0){
                 perror("oledinit can't set slave");
                 close(i2c_fd);
                 exit(1);
        }

        //DDRAMを2行目へ
        buf[0] = 0x00;
        buf[1] = 0xa0;
        write(i2c_fd,buf,2);
        usleep(20);

        //2行目処理
        strncpy(dmesg, argv[1], 16);
        //メッセージ書き込み
        for(i=0;i<16;i++) {
                buf[0] = 0x40;
                if(dmesg[i] == 0) break;
                buf[1] = dmesg[i];
                write(i2c_fd,buf,2);
                usleep(20);
        }

        close(i2c_fd);
}

おまけ:1行クロック

1lineclock.sh

#!/bin/sh
/home/piast/oledinit

while :
  do
  L1=`date +%m/%d`
  L2=`date +%H:%M:%S`
  /home/piast/oledsp2 "  $L1 $L2"
  sleep 1
done

1行目に表示するとチラつくので2行目に表示させる。/etc/rc.localに以下のように登録しておけば2行目は常時時計状態になる。

/home/piast/1lineclock.sh > /dev/null 2>&1 &

このスクリプトを動かしていてもoledsp1で1行目に任意の文字を表示させても問題なし。

おまけ:着信番号表示

exten => ${MYNUMBER1},n,Set(DMSG="IN:${CALLERID(num)}")
exten => ${MYNUMBER1},n,System(/home/piast/oledsp1 "                     ")
exten => ${MYNUMBER1},n,System(/home/piast/oledsp1 ${DMSG})

こんな感じでextenに仕込むと着信した番号を1行目に表示することができます。最初のoledsp1は前に出てたのを消すため。