CastleJo의 개발일지

DTS_L300_V2 체온 측정 모듈 파이썬에서 사용하기

|

이 모듈은 국산이다.
그래서 그런가 예제코드가 없더라
제공되는 예제코드는 C로만 되어있고..

나는 이 코드를 C++ 클래스로 변환시킨 뒤 cdll 라이브러리를 이용하여 파이썬으로 이식시켰다.

나는 입맛대로 바꾸었지만, 원본 코드 그대로 이식만 한 것을 아래 적어두겠다.

방법은 여기에 있다.

C -> C++

#include <iostream>
#include <wiringPi.h>
#include <wiringPiSPI.h>

class Temperature
{
private:
    int16_t iSensor; 
    int16_t iObject;
    double temperature;

    const int SCE = 22;
    const int spi_chn0 = 0;
    const int SPEED_1MHz = 1000000;
    const int SPI_MODE3 = 3;
    const int OBJECT = 0xA0;
    const int SENSOR = 0xA1;
    
    int16_t SPI_COMMAND(uint8_t ADR){
	    uint8_t Data_Buf[3];

	    Data_Buf[0] = ADR;
	    Data_Buf[1] = 0x22;
	    Data_Buf[2] = 0x22;
	
	    digitalWrite(SCE, 0);  				// SCE LOW
	    delayMicroseconds(10);				// delay 10us

	    wiringPiSPIDataRW (spi_chn0, Data_Buf, 1);		// transfer 1st byte.
	    delayMicroseconds(10);				// delay 10us
	    wiringPiSPIDataRW (spi_chn0, Data_Buf+1, 1);	            // transfer 2nd byte
	    delayMicroseconds(10);				// delay 10us
	    wiringPiSPIDataRW (spi_chn0, Data_Buf+2, 1);		// transfer 3rd byte
	    delayMicroseconds(10);				// delay 10us

	    digitalWrite(SCE, 1);  				// SCE HIGH
	    return (Data_Buf[2]*256+Data_Buf[1]);			// High + Lo byte
    }

public: // Constructor
    Temperature(){
        temperature = 0;
        wiringPiSetup();					// Wiring Pi setup
 	    if(wiringPiSetupGpio() == -1) { return; }
	    pinMode(SCE, OUTPUT);				// SCE Port Output
	    digitalWrite(SCE,1);					// SCE high

	    wiringPiSPISetupMode(spi_chn0, SPEED_1MHz, SPI_MODE3); //SPI0, 1Mhz, SPI Mode3 Setting
	    delay(500);					// wait 500ms
    }

public: // public func
    
    void check(){
        iSensor = SPI_COMMAND(SENSOR);
        delayMicroseconds(10);
        iObject = SPI_COMMAND(OBJECT);
        delay(500);				// Wait 500ms
        std::cout.precision(4); //자릿수 지정
        std::cout<<("Sensor : "<<(double)iSensor/100  ", Object : "<<(double)iObject/100)<<std::endl;    
    }

};

extern "C" {
    Temperature* Temperature_new(){
        return new Temperature();
    }

    void Temperature_check(Temperature* f){
        f->check();
    }
}

Makefile

CC = g++
TARGET = temperature.dll
LIB = -lwiringPi -lwiringPiDev

$(TARGET) : temperature.o
	$(CC) --shared $(LIB) -o $@ $?
	rm *.o

temperature.o : temperature.cpp
	$(CC) -fPIC -c $?

clean :
	rm $(TARGET)

Python

from ctypes import cdll
import time
class Temperature(object):
 
    def __init__( self , libPath):
        self.lib = cdll.LoadLibrary(libPath)
        self.obj = self.lib.Temperature_new()
     
    def check(self, tick=0.5) :
        self.lib.Temperature_check(self.obj)
        time.sleep(tick)

if __name__ == '__main__':
 
    f = Temperature(libPath='./temperature.dll')

    while True:
        print("체온 측정 시작")
        f.check()

이렇게 c++파일을 만든 뒤 Makefile로 dll파일을 만든 다음 python 파일과 같은 폴더에 넣어논 다음 실행시키면 실행이 된다.