RaspberryPi[37] I2C 1602モジュール FNK0079 Freenove LCD Module

Freenove製の液晶2列ラインモジュールです。I2Cで制御します。Freenoveのチュートリアルサイトで情報得ることができます。

charset=InvalidCharsetId
信号線名ラズパイ ピン番号FNK0079ピン番号
3.3V12
SDA33
SCL54
GND91
各ピン対応

接続もチュートリアルにあります。接続が終わったら、i2cdetect コマンドでアドレスを確認します。

i2cdetect -y 1

27が表示されるのでアドレスは 0x27 となります。ちなみに、ラズパイのI2Cは複数設定できると書いてあるWEBがありますが、今のところ、i2c1 しか使えていません。

LCD Libraryはここにあります。普段使う関数を載せておきます。

#include <wiringPi.h> // 二つのヘッダをインクルードします。
#include <lcd.h>

lcdhd = lcdInit(2,16,4,RS,EN,D4,D5,D6,D7,0,0,0,0); // チュートリアルから持ってきました。戻り値がハンドルになります。
lcdHome (lcdhd);//LCDのカーソルを初期位置(1行目の1文字目)に戻します。
lcdClear (lcdhd); // 画面クリア
lcdPosition (lcdhd,x,y); // カーソルを移動します。
lcdPrintf (lcdhd, char *message, …) //文字を表示します。 printf()と同じ書式で行けます。

以下はチュートリアルにあるサンプルコードです。


/**********************************************************************
* Filename    : I2CLCD1602.c
* Description : Use the LCD display data
* Author      : www.freenove.com
* modification: 2020/07/23
**********************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <pcf8574.h>
#include <lcd.h>
#include <time.h>

int pcf8574_address = 0x27;        // PCF8574T:0x27, PCF8574AT:0x3F
#define BASE 64         // BASE any number above 64
//Define the output pins of the PCF8574, which are directly connected to the LCD1602 pin.
#define RS      BASE+0
#define RW      BASE+1
#define EN      BASE+2
#define LED     BASE+3
#define D4      BASE+4
#define D5      BASE+5
#define D6      BASE+6
#define D7      BASE+7

int lcdhd;// used to handle LCD
void printCPUTemperature(){// sub function used to print CPU temperature
    FILE *fp;
    char str_temp[15];
    float CPU_temp;
    // CPU temperature data is stored in this directory.
    fp=fopen("/sys/class/thermal/thermal_zone0/temp","r");
    fgets(str_temp,15,fp);      // read file temp
    CPU_temp = atof(str_temp)/1000.0;   // convert to Celsius degrees
    printf("CPU's temperature : %.2f \n",CPU_temp);
    lcdPosition(lcdhd,0,0);     // set the LCD cursor position to (0,0) 
    lcdPrintf(lcdhd,"CPU:%.2fC",CPU_temp);// Display CPU temperature on LCD
    fclose(fp);
}
void printDataTime(){//used to print system time 
    time_t rawtime;
    struct tm *timeinfo;
    time(&rawtime);// get system time
    timeinfo = localtime(&rawtime);//convert to local time
    printf("%s \n",asctime(timeinfo));
    lcdPosition(lcdhd,0,1);// set the LCD cursor position to (0,1) 
    lcdPrintf(lcdhd,"Time:%02d:%02d:%02d",timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); //Display system time on LCD
}
int detectI2C(int addr){  //Used to detect i2c address of LCD
    int _fd = wiringPiI2CSetup (addr);   
    if (_fd < 0){		
        printf("Error address : 0x%x \n",addr);
        return 0 ;
    } 
    else{	
        if(wiringPiI2CWrite(_fd,0) < 0){
            printf("Not found device in address 0x%x \n",addr);
            return 0;
        }
        else{
            printf("Found device in address 0x%x \n",addr);
            return 1 ;
        }
    }
}
int main(void){
    int i;
    printf("Program is starting ...\n");
    wiringPiSetup();  
    if(detectI2C(0x27)){
        pcf8574_address = 0x27;
    }else if(detectI2C(0x3F)){
        pcf8574_address = 0x3F;
    }else{
        printf("No correct I2C address found, \n"
        "Please use command 'i2cdetect -y 1' to check the I2C address! \n"
        "Program Exit. \n");
        return -1;
    }
    pcf8574Setup(BASE,pcf8574_address);//initialize PCF8574
    for(i=0;i<8;i++){
        pinMode(BASE+i,OUTPUT);     //set PCF8574 port to output mode
    } 
    digitalWrite(LED,HIGH);     //turn on LCD backlight
    digitalWrite(RW,LOW);       //allow writing to LCD
	lcdhd = lcdInit(2,16,4,RS,EN,D4,D5,D6,D7,0,0,0,0);// initialize LCD and return “handle” used to handle LCD
    if(lcdhd == -1){
        printf("lcdInit failed !");
        return 1;
    }
    while(1){
        printCPUTemperature();//print CPU temperature
        printDataTime();        // print system time
        delay(1000);
    }
    return 0;
}

コンパイルには、wiringPi ライブラリが必要です。

gcc I2CLCD1602.c -o I2CLCD1602 -lwiringPi -lwiringPiDev