「PIAST OLED プログラム」の版間の差分
提供: VoIP-Info.jp
(ページの作成:「OLED(SO1602AWYB-UC-XX)表示処理用プログラム ==OLED初期化== #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <unistd.h> #include <fc...」) |
(→おまけ:1行クロック) |
||
(同じ利用者による、間の6版が非表示) | |||
1行目: | 1行目: | ||
− | OLED( | + | [[カテゴリ:PIAST]] |
+ | |||
+ | OLED(SO1602AWxx-UC-W)表示処理用プログラム | ||
==OLED初期化== | ==OLED初期化== | ||
+ | oledinit.c | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
66行目: | 69行目: | ||
close(i2c_fd); | close(i2c_fd); | ||
} | } | ||
+ | |||
==OLED1行目表示用== | ==OLED1行目表示用== | ||
+ | oledsp1.c | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
125行目: | 130行目: | ||
close(i2c_fd); | close(i2c_fd); | ||
} | } | ||
+ | |||
==OLED2行目表示用== | ==OLED2行目表示用== | ||
+ | oledsp2.c | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
184行目: | 191行目: | ||
close(i2c_fd); | 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は前に出てたのを消すため。 |
2016年3月30日 (水) 18:38時点における最新版
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は前に出てたのを消すため。