🍓
Ras Piで7セグLEDでカウントダウンした話
書いた記事消えた!!!
書き直し
7セグLEDでカウントダウンした話
物理的に動かした。もっといい書き方は死ぬほどある。
とりあえず動いたやり方書きます。
4つのファイルを実行ファイルで実行しLEDを光らせました
ファイル詳細
光る(0)を司るファイル↓
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
// 全てon
int allon() {
int fd = 0;
fd = open("/sys/class/gpio/gpio25/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio27/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio24/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio5/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio6/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio22/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
fd = open("/sys/class/gpio/gpio23/value", O_WRONLY);
write(fd, "0", 2);
close(fd);
}
カウントダウンしたんだけど長すぎるので割愛。
数字の形になるように光るところを調整したプログラミング。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int alloff() {
int fd = 0;
fd = open("/sys/class/gpio/gpio25/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio27/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio24/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio5/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio6/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio22/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio23/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
}
int dottooff() {
int fd = 0;
fd = open("/sys/class/gpio/gpio23/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
}
int off0() {
int fd = 0;
fd = open("/sys/class/gpio/gpio25/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio27/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio22/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio6/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
fd = open("/sys/class/gpio/gpio5/value", O_WRONLY);
write(fd, "1", 2);
close(fd);
}
offになるように調整したプログラム。
上のコードの割愛した部分は部分的に光らせなくなるようなコードを書いた
gpio起動ファイル↓
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void standby2(void) {
int fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "27", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio27/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "17", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio17/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "24", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio24/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "25", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio25/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "5", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio5/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "6", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio6/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "23", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio23/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/export", O_WRONLY);
write(fd, "22", 2);
close(fd);
fd = 0;
fd = open("/sys/class/gpio/gpio22/direction", O_WRONLY);
write(fd, "out", 3);
close(fd);
}
gpio終了ファイル
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void deleteFile2(void) {
int fd = 0;
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "27", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "17", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "24", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "25", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "5", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "6", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "23", 2);
close(fd);
fd = open("/sys/class/gpio/unexport", O_WRONLY);
write(fd, "22", 2);
close(fd);
}
実行ファイル
5つのファイル(.c,.h)を受け取り1~9までのカウントダウンをした
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include "onoff.h"
//プロトタイプ宣言
int standby2();
int deleteFile2();
int main() {
int len = 0;
int (*on[])(void) = {on0,on1,on2,on3,on4,on5,on6,on7,on8,on9,};
int (*off[])(void) = { off0,off1,off2,off3,off4,off5,off6,off7,off8,off9 };
len = sizeof(on) / sizeof(on[0]);
standby2(); //起動準備、valueが全て1になる
usleep(1000000);
alloff(); //全off
for (int i = 0; i < len; i++) {
dottoon();
usleep(2000000);
dottooff();
usleep(1000000);
on[i]();
usleep(2000000);
off[i]();
usleep(1000000);
} //9回数字表示している
deleteFile2();
}
for文を使ってonとoff関数をぐるぐる回してる。
usleepを使って表示時間や待機時間をコントロールしている。
こんな感じです
Discussion