DIPマイコンLPC1114FNでmbed入門 Ledマトリックス ~その7 気圧変化をグラフ化~
DIPマイコンLPC1114FNでmbed入門
Ledマトリックスで遊びましょう ~その7 ~
mbed LPC1114FN(以後、1114FN)は安価に購入できて、mbedクラウド開発環境を使ってプログラムを開発することができるマイコンです。1114FNを使って、8×8ドット=64個のLEDを使ったLEDマトリックスに文字を表示します。
2枚に増やしたLEDマトリックスユニットに、I2C気圧・気温・湿度センサBME280(以後、BME280)を搭載し、気圧・気温・湿度をスクロール表示することはできましたか。
今回はLEDマトリックスユニットを3枚に増やします。表示面積が増えたことを利用して、気圧変化をグラフ化して表示します。
天気をある程度予想するためには、気圧変化の観察が重要です。気圧変化をグラフ表示することにより、天気予想が可能になります。
8列×3=24列を利用して、23時間分(0列目はレンジ表示)の気圧変化グラフを表示することができます。写真は低気圧が接近して、気圧が低下中のグラフです。
注)
mbed LPC1114FNは発売からずいぶん経過しており、
Arm社が提供する「Mbed OS」および「Mbedプラットフォーム」は、2026年7月をもって完全にサポートを終了します。期間終了後はウェブサイトがアーカイブされ、オンラインでのプロジェクトビルドやコンパイルは一切できなくなります。回路図やプログラムは参考資料として公表します。
写真と解説しているプログラムではフォントや細部の表示が異なる場合があります。
○回路図
3枚目のLEDマトリックスユニットは2枚目のユニットの出力端子に接続します。
○ハードウェアの完成
写真のブレッドボードには1114FNと3枚のLEDマトリックスユニットを搭載することができます。
3枚搭載したLEDマトリックスユニットです。でこぼこすることなく、隣となるべくぴったりになるように並べてください。
電源配線は、ブレッドボードの電源配線部を使っています。
○プログラミング
LEDマトリックスユニット2枚との違いを中心に説明します。表示文字数は増えていないので、文字表示部は2枚の時と同じです。
■LEDマトリックスユニット枚数設定
枚数設定部分は3枚を忘れないように指定します。
int maxInUse = 3; //change this variable to set how many MAX7219's you'll use
■LEDマトリックス増加部分の設定
LEDマトリックスユニットが2枚から3枚に増えたことにより、
maxOne(1,2,bitline[k+1]);
などの部分を中心に記述を変更します。
■気圧グラフ表示部
気圧グラフは23時間分を表示します。23時間の気圧変化は予測できません。LEDマトリックスユニットは8ドットなので、8気圧の変化までは1気圧1ドットで対応します。これ以上の変化はレンジ計算を行い、気圧変化に追従してレンジを変更するオートレンジを搭載しています。また、変化が少ないときにはグラフができる限り真ん中に表示されるようにオートトリムを搭載しています。
hpascal=long(pp1);
hpdata[23]=hpascal; //最新気圧データの読み込み
for(m=1;m<24;m++){ //最高気圧と最低気圧を求めます。
if(hpmax <= hpdata[m]){
hpmax=hpdata[m]; //最高気圧
}
if(hpmin >= hpdata[m]){
hpmin=hpdata[m]; //最低気圧
}
}//for
hprange=hpmax-hpmin;//オートレンジ表示部
hpscope=double(hprange)/8.0;//オートレンジ計算
if(hprange < 4){
gctrim=double(3-hprange);// オートトリム計算
}
else {
gctrim=0;
}
for(m=1;m<24;m++){//気圧データをグラフデータに変換します。
dotdata[m]=int(double(hpdata[m]-hpmin)/hpscope)+gctrim;
if(dotdata[m] < 0){
dotdata[m]=0;
}
if(dotdata[m] > 7){
dotdata[m]=7;
}
gbit[m]=gdot[dotdata[m]];
}
gbit[0]=gdot[int(hpscope+0.5)];//0列目はレンジ表示部
for(i=0;i<24;i++){// グラフのスクロールデータ前半部の処理
gbit_s[i]=0; // zenhan 0
}
for(i=24;i<48;i++){// グラフのスクロールデータ後半部の処理
gbit_s[i]=gbit[i-24];
}
for(k=0;k<24;k++){//前半部のグラフ表示
maxOne(1,1,gbit_s[k]);// graph scroll
maxOne(1,2,gbit_s[k+1]);
maxOne(1,3,gbit_s[k+2]);
maxOne(1,4,gbit_s[k+3]);
maxOne(1,5,gbit_s[k+4]);
maxOne(1,6,gbit_s[k+5]);
maxOne(1,7,gbit_s[k+6]);
maxOne(1,8,gbit_s[k+7]);
maxOne(2,1,gbit_s[k+8]);
maxOne(2,2,gbit_s[k+9]);
maxOne(2,3,gbit_s[k+10]);
maxOne(2,4,gbit_s[k+11]);
maxOne(2,5,gbit_s[k+12]);
maxOne(2,6,gbit_s[k+13]);
maxOne(2,7,gbit_s[k+14]);
maxOne(2,8,gbit_s[k+15]);
maxOne(3,1,gbit_s[k+16]);
maxOne(3,2,gbit_s[k+17]);
maxOne(3,3,gbit_s[k+18]);
maxOne(3,4,gbit_s[k+19]);
maxOne(3,5,gbit_s[k+20]);
maxOne(3,6,gbit_s[k+21]);
maxOne(3,7,gbit_s[k+22]);
maxOne(3,8,gbit_s[k+23]);
wait(0.1);
}
k=0;
maxOne(1,1,gbit[k]);// 後半部のグラフ表示
maxOne(1,2,gbit[k+1]);
maxOne(1,3,gbit[k+2]);
maxOne(1,4,gbit[k+3]);
maxOne(1,5,gbit[k+4]);
maxOne(1,6,gbit[k+5]);
maxOne(1,7,gbit[k+6]);
maxOne(1,8,gbit[k+7]);
maxOne(2,1,gbit[k+8]);
maxOne(2,2,gbit[k+9]);
maxOne(2,3,gbit[k+10]);
maxOne(2,4,gbit[k+11]);
maxOne(2,5,gbit[k+12]);
maxOne(2,6,gbit[k+13]);
maxOne(2,7,gbit[k+14]);
maxOne(2,8,gbit[k+15]);
maxOne(3,1,gbit[k+16]);
maxOne(3,2,gbit[k+17]);
maxOne(3,3,gbit[k+18]);
maxOne(3,4,gbit[k+19]);
maxOne(3,5,gbit[k+20]);
maxOne(3,6,gbit[k+21]);
maxOne(3,7,gbit[k+22]);
maxOne(3,8,gbit[k+23]);
for(i=0;i<4;i++){
wait(0.5);
maxOne(3,8,0);
maxOne(1,1,0);
wait(0.5);
maxOne(1,1,gbit[k]);
maxOne(3,8,gbit[k+23]);
}
fshuuki=130;// kousin jikan
wtime++;
if(wtime == fshuuki){
for(m=1;m<=22;m++){
hpdata[m]=hpdata[m+1];
}
wtime=0;
}
○プログラム全体
プログラム全体を示します。
// LedMatrix 3mai Ondo,Situdo,Kiatu
#include "mbed.h"
#include "BME280.h"
DigitalOut led(dp28);
BME280 sensor1(dp5,dp27,0x76 << 1);
// spi(mosi,miso,sck)
SPI max72_spi(dp2, NC, dp6);
DigitalOut load(dp14);//spi load
// CPU MT7219
// dp1 mosi(Master In Salve Out) => DIN
// dp2 miso(Master OutSlave) => nc
// dp6 sck (Serial Clock) => clk
// dp14 =>(Slave Select) load
int maxInUse = 3; //change this variable to set how many MAX7219's you'll use
// define max7219 registers
#define max7219_reg_noop 0x00
#define max7219_reg_digit0 0x01
#define max7219_reg_digit1 0x02
#define max7219_reg_digit2 0x03
#define max7219_reg_digit3 0x04
#define max7219_reg_digit4 0x05
#define max7219_reg_digit5 0x06
#define max7219_reg_digit6 0x07
#define max7219_reg_digit7 0x08
#define max7219_reg_decodeMode 0x09
#define max7219_reg_intensity 0x0a
#define max7219_reg_scanLimit 0x0b
#define max7219_reg_shutdown 0x0c
#define max7219_reg_displayTest 0x0f
#define LOW 0
#define HIGH 1
#define MHZ 1000000
#define ON 1
#define OFF 0
double p1,t1,h1,pp1;
void maxSingle( int reg, int col) {
//maxSingle is the "easy" function to use for a
//single max7219
load = LOW; // begin
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS)
}
void maxAll (int reg, int col) { // initialize all MAX7219's in the system
load = LOW; // begin
for ( int c=1; c<= maxInUse; c++) {
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
}
load = HIGH;
}
void maxOne(int maxNr, int reg, int col) {
//maxOne is for adressing different MAX7219's,
//while having a couple of them cascaded
int c = 0;
load = LOW;
for ( c = maxInUse; c >= maxNr; c--) {
max72_spi.write(0); // no-op
max72_spi.write(0); // no-op
}
max72_spi.write(reg); // specify register
max72_spi.write(col); // put data
for ( c=maxNr-1; c >= 1; c--) {
max72_spi.write(0); // no-op
max72_spi.write(0); // no-op
}
load = HIGH;
}
void setup () {
// initiation of the max 7219
// SPI setup: 8 bits, mode 0
max72_spi.format(8, 0);
// going by the datasheet, min clk is 100ns so theoretically 10MHz should work...
// max72_spi.frequency(10*MHZ);
maxAll(max7219_reg_scanLimit, 0x07);
maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits)
maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
maxAll(max7219_reg_displayTest, 0x00); // no display test
for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off
maxAll(e,0);
}
maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set
// range: 0x00 to 0x0f
}
void get_sensor1(void){
t1=sensor1.getTemperature();
if(t1 > 85.0){
t1=t1-409.0-1;
}
h1=sensor1.getHumidity();
pp1=sensor1.getPressure();
pp1=pp1+int(700/9);// 700はお住まいの標高を入力してください。
}
int main(void) {
const uint64_t moji_font[] = {// bold font , kagami moji font
/0x3c66666e76663c00,//0~9
0x7e1818181c181800,
0x7e060c3060663c00,
0x3c66603860663c00,
0x30307e3234383000,
0x3c6660603e067e00,
0x3c66663e06663c00,
0x1818183030667e00,
0x3c66663c66663c00,
0x3c66607c66663c00,/
0x1c2222222222221c,//0~9
0x1c08080808080c08,
0x3e0408102020221c,
0x1c2220201820221c,
0x20203e2224283020,
0x1c2220201e02023e,
0x1c2222221e02221c,
0x040404081020203e,
0x1c2222221c22221c,
0x1c22203c2222221c,
0x6666663e06060600,// 10 h
0x06063e66663e0000,// 11 p
0x1818000000000000,// 12 .
0x30480848340a0a04, // 13 dc
0x1010157555770101,// 14 hp
0x0010107c10100000,// 15 +
0x0000007e00000000,// 16 -
0x082a1c771c2a0800, //17 asuta1
0x007e424a52427e00, // 18 sikaku2
0x0000000000000000, // 19 blank
0x60660c1830660600, // 20 %
0x4242665a5a7e1800, // 21 uchi
0x220424692e2a2c00, // 22 soto
0x126a3a22227a2200,// 23 ha
0x44c6444c56640400,// 24 re
0x2010080408102000,// 25 ku
0x1028483e083e1000,// 26 mo
0x1020404044444400,// 27 ri
0x2874d27c107c1000,// 28 a
0x449a9aaaaa7c2800,// 29 me
0x6c927cc482443800,// 30 kumo
0x30309254ba10aa28,// 31 ame
0x082a1c771c2a0800,// 32 hare
0x1010101054381000,// 33 ue yajirusi
0x02040890a0c0f000,// 34 naname ue
0xf0c0a09008040200,// 35 naname sita
0x1038541010101000, // 36 sita
0x0000183c3c180000, // 37 asuta2
0x102040fe40201000, // 38 onaji yajirusi
0x5050557553550503 // 39 RH
};
/*
const uint64_t moji_font[]={
0x006e333e301e0000,//a
0x003b66663e060607,//b
0x001e3303331e0000,//c
0x006e33333e303038,//d
0x001e033f331e0000,//e
0x000f06060f06361c,//f
0x1f303e33336e0000,//g
0x006766666e360607,//h
0x001e0c0c0c0e000c,//i
0x1e33333030300030,//j
0x0067361e36660607,//k
0x001e0c0c0c0c0c0e,//l
0x00636b7f7f330000,//m
0x00333333331f0000,//n
0x001e3333331e0000,//o
0x0f063e66663b0000,//p
0x78303e33336e0000,//q
0x000f06666e3b0000,//r
0x001f301e033e0000,//s
0x00182c0c0c3e0c08,//t
0x006e333333330000,//u
0x000c1e3333330000,//v
0x00367f7f6b630000,//w
0x0063361c36630000,//x
0x1f303e3333330000,//y
0x003f260c193f0000 //z
};
*/
// // Jissainiha konoyouni mieru
// maxSingle(1,1); |-| -------+
// maxSingle(2,2); |-| ------+-
// maxSingle(3,4); |-| -----+--
// maxSingle(4,8); |-| ----+---
// maxSingle(5,16); |-| ---+----
// maxSingle(6,32); |-| --+-----
// maxSingle(7,64); |-| -+------
// maxSingle(8,128); |-| +-------
int i,j,k,m,n;
uint8_t bitsum[22][9],bit1gyou,bitline[250];
uint64_t moji1,load_image[30];
long hpascal,ttemp,sitemp;
int hpketa[4],tpketa[3],siketa[3];
int gdot[]={128,64,32,16,8,4,2,1};
int gbit[24],gbit_s[48];
long wtime=0;
long hpdata[24],hprange,hpmax,hpmin;
long hpcenter;
int dotdata[24],fstloop,fshuuki;
double hpscope;
double gctrim=0.0;
int henka=0;
setup();
wait(0.1);
get_sensor1();
hpascal=long(pp1);
hpmin=hpascal;
hpmax=hpascal;
hpscope=1;
hprange=0;
for(i=0;i<24;i++){
hpdata[i]=hpascal-3;
}
while(1){
get_sensor1();
hpascal=long(pp1);
ttemp=long(t1*10); // seisuuchi henkan
sitemp=long(h1);
hpketa[0]=int(hpascal/1000);hpascal=hpascal-hpketa[0]*1000;
hpketa[1]=int(hpascal/100); hpascal=hpascal-hpketa[1]*100;
hpketa[2]=int(hpascal/10); hpascal=hpascal-hpketa[2]*10;
hpketa[3]=hpascal;
tpketa[0]=int(ttemp/100);ttemp=ttemp-tpketa[0]*100;// jyuu noketa
tpketa[1]=int(ttemp/10);ttemp=ttemp-tpketa[1]*10;// ichi no keta
tpketa[2]=int(ttemp); // shousuutenika no keta
siketa[0]=int(sitemp/100);sitemp=sitemp-siketa[0]*100;
siketa[1]=int(sitemp/10);sitemp=sitemp-siketa[1]*10;
siketa[2]=int(sitemp);
load_image[0]=moji_font[19]; //blank
load_image[1]=moji_font[19]; //blank
if(hpdata[23] > hpdata[22]){
load_image[2]=moji_font[34];//naname ue
}
else if(hpdata[23] < hpdata[22]){
load_image[2]=moji_font[35];//naname sita
}
else{
load_image[2]=moji_font[38];//onaji
}
for(i=3;i<=6;i++){// kiatu 4keta suuji [3 ~ 6]
for(j=0;j<=9;j++){
if(hpketa[i-3] == j){
load_image[i]=moji_font[j];
}
}
}
load_image[7]=moji_font[14];//hp
load_image[8]=moji_font[19]; //blank
if(t1 >=0){
load_image[9]=moji_font[15];//+
}
else {
load_image[9]=moji_font[16];// -
}
for(i=0;i<=1;i++){// kion seisuuketa
for(j=0;j<=9;j++){
if(tpketa[i] == j){
load_image[i+10]=moji_font[j];
}
}
}
load_image[12]=moji_font[12];// .
for(j=0;j<=9;j++){// kion shousuu keta
if(tpketa[2] == j){
load_image[13]=moji_font[j];
}
}
load_image[14]=moji_font[13]; //dc
load_image[15]=moji_font[19];//blank
for(i=0;i<=2;i++){ // situdo 3 keta
for(j=0;j<=9;j++){
if(siketa[i] == j){
load_image[i+16]=moji_font[j];
}
}
}
if(siketa[0]==0){// 0 shouryaku
load_image[16]=moji_font[39];// situdo
}
load_image[19]=moji_font[20]; // %
load_image[20]=moji_font[19];//blank
// Tenki yosoku
henka=0;
for(m=23;m>=17;m--){
henka=henka+(hpdata[m]-hpdata[m-1]);
}
if(henka >= 3){
//tyosou=1;//hare
load_image[21]=moji_font[32];//hare
load_image[22]=moji_font[23];//ha
load_image[23]=moji_font[24];//re
load_image[24]=moji_font[33];//ue yajirusi
load_image[25]=moji_font[33];//ue yajirusi
}
else if(henka >= 0){
//tyosou=2;//kumori => hare
load_image[21]=moji_font[30];//kumo
load_image[22]=moji_font[25];//ku
load_image[23]=moji_font[26];//mo
load_image[24]=moji_font[27];//ri
load_image[25]=moji_font[34];//naname ue
}
else if(henka >= -3){
//tyosou=3;// kumori => ame
load_image[21]=moji_font[30];//kumo
load_image[22]=moji_font[25];//ku
load_image[23]=moji_font[26];//mo
load_image[24]=moji_font[27];//ri
load_image[25]=moji_font[35];//naname sita
}
else{
//tyosou=4;// ame
load_image[21]=moji_font[31];//ame
load_image[22]=moji_font[28];//a
load_image[23]=moji_font[29];//me
load_image[24]=moji_font[36];// sita
load_image[25]=moji_font[36];// sita
}
load_image[26]=moji_font[19];//blank
load_image[27]=moji_font[19];//blank
load_image[28]=moji_font[19];//blank
for(i=0;i<29;i++){ // 0~28 29 moji
moji1=load_image[i];
for(j=0;j<8;j++){// bitsum[1]
bitsum[i][j]=0;
}//j
for(j=0;j<8;j++){
bit1gyou=moji1 & 0xff;
for(k=0;k<8;k++){// kagami moji no font
//for(k=8;k>=1;k--){ // futuu no font
bitsum[i][k]=bitsum[i][k]+(bit1gyou & 0x01)*pow((double)2,(double)(j));
bit1gyou=bit1gyou >> 1;
}//k
moji1=moji1 >> 8;
}//j
}// i
k=0;// bitline henkan
for(i=0;i<29;i++){
for(j=0;j<8;j++){
bitline[k]=bitsum[i][j];
k++;
}
}
for(i=0;i<=(29*8-1-23);i++){// bitline hyouji
k=i;
maxOne(1,1,bitline[k]);
maxOne(1,2,bitline[k+1]);
maxOne(1,3,bitline[k+2]);
maxOne(1,4,bitline[k+3]);
maxOne(1,5,bitline[k+4]);
maxOne(1,6,bitline[k+5]);
maxOne(1,7,bitline[k+6]);
maxOne(1,8,bitline[k+7]);
maxOne(2,1,bitline[k+8]);
maxOne(2,2,bitline[k+9]);
maxOne(2,3,bitline[k+10]);
maxOne(2,4,bitline[k+11]);
maxOne(2,5,bitline[k+12]);
maxOne(2,6,bitline[k+13]);
maxOne(2,7,bitline[k+14]);
maxOne(2,8,bitline[k+15]);
maxOne(3,1,bitline[k+16]);
maxOne(3,2,bitline[k+17]);
maxOne(3,3,bitline[k+18]);
maxOne(3,4,bitline[k+19]);
maxOne(3,5,bitline[k+20]);
maxOne(3,6,bitline[k+21]);
maxOne(3,7,bitline[k+22]);
maxOne(3,8,bitline[k+23]);
wait(0.1);
}
wait(0.1);
hpascal=long(pp1);
hpdata[23]=hpascal;
for(m=1;m<24;m++){
if(hpmax <= hpdata[m]){
hpmax=hpdata[m];
}
if(hpmin >= hpdata[m]){
hpmin=hpdata[m];
}
}//for
hprange=hpmax-hpmin;
hpscope=double(hprange)/8.0;//auto range
if(hprange < 4){
gctrim=double(3-hprange);// auto center trim
}
else {
gctrim=0;
}
for(m=1;m<24;m++){
dotdata[m]=int(double(hpdata[m]-hpmin)/hpscope)+gctrim;
if(dotdata[m] < 0){
dotdata[m]=0;
}
if(dotdata[m] > 7){
dotdata[m]=7;
}
gbit[m]=gdot[dotdata[m]];
}
gbit[0]=gdot[int(hpscope+0.5)];//range hyouji
for(i=0;i<24;i++){// graph scroll data
gbit_s[i]=0; // zenhan 0
}
for(i=24;i<48;i++){// kouhan jitu data
gbit_s[i]=gbit[i-24];
}
for(k=0;k<24;k++){
maxOne(1,1,gbit_s[k]);// graph scroll
maxOne(1,2,gbit_s[k+1]);
maxOne(1,3,gbit_s[k+2]);
maxOne(1,4,gbit_s[k+3]);
maxOne(1,5,gbit_s[k+4]);
maxOne(1,6,gbit_s[k+5]);
maxOne(1,7,gbit_s[k+6]);
maxOne(1,8,gbit_s[k+7]);
maxOne(2,1,gbit_s[k+8]);
maxOne(2,2,gbit_s[k+9]);
maxOne(2,3,gbit_s[k+10]);
maxOne(2,4,gbit_s[k+11]);
maxOne(2,5,gbit_s[k+12]);
maxOne(2,6,gbit_s[k+13]);
maxOne(2,7,gbit_s[k+14]);
maxOne(2,8,gbit_s[k+15]);
maxOne(3,1,gbit_s[k+16]);
maxOne(3,2,gbit_s[k+17]);
maxOne(3,3,gbit_s[k+18]);
maxOne(3,4,gbit_s[k+19]);
maxOne(3,5,gbit_s[k+20]);
maxOne(3,6,gbit_s[k+21]);
maxOne(3,7,gbit_s[k+22]);
maxOne(3,8,gbit_s[k+23]);
wait(0.1);
}
k=0;
maxOne(1,1,gbit[k]);// kiatu graph hyouji
maxOne(1,2,gbit[k+1]);
maxOne(1,3,gbit[k+2]);
maxOne(1,4,gbit[k+3]);
maxOne(1,5,gbit[k+4]);
maxOne(1,6,gbit[k+5]);
maxOne(1,7,gbit[k+6]);
maxOne(1,8,gbit[k+7]);
maxOne(2,1,gbit[k+8]);
maxOne(2,2,gbit[k+9]);
maxOne(2,3,gbit[k+10]);
maxOne(2,4,gbit[k+11]);
maxOne(2,5,gbit[k+12]);
maxOne(2,6,gbit[k+13]);
maxOne(2,7,gbit[k+14]);
maxOne(2,8,gbit[k+15]);
maxOne(3,1,gbit[k+16]);
maxOne(3,2,gbit[k+17]);
maxOne(3,3,gbit[k+18]);
maxOne(3,4,gbit[k+19]);
maxOne(3,5,gbit[k+20]);
maxOne(3,6,gbit[k+21]);
maxOne(3,7,gbit[k+22]);
maxOne(3,8,gbit[k+23]);
for(i=0;i<4;i++){
wait(0.5);
maxOne(3,8,0);
maxOne(1,1,0);
wait(0.5);
maxOne(1,1,gbit[k]);
maxOne(3,8,gbit[k+23]);
}
fshuuki=130;// kousin jikan
wtime++;
if(wtime == fshuuki){
for(m=1;m<=22;m++){
hpdata[m]=hpdata[m+1];
}
wtime=0;
}
}//while
}//main
○Publish
下記URLにてPublishしています。
https://developer.mbed.org/users/takeuchi/code/20160530_V31_1s_LedMatrix/
○完成!
気圧、温度、湿度、グラフの順番にスクロール表示します。グラフのスクロール後、グラフの0列目と23列目をブリンク表示します。0列目はレンジ表示、23列目は最新気圧データです。
気圧データの測定が一巡する約23時間が経過するまでは、平坦なグラフを表示します。
グラフ表示を搭載後は、気圧が大きく変化する低気圧の接近を興味を持って観測するようになりました。グラフを参考にして自前の天気予想をお楽しみください。
投稿者の人気記事

-
taketea2018
さんが
2026/07/17
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する