DTS_L300_V2 체온 측정 모듈 파이썬에서 사용하기
09 Mar 2021 | Python RaspberryPi이 모듈은 국산이다.
그래서 그런가 예제코드가 없더라
제공되는 예제코드는 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 파일과 같은 폴더에 넣어논 다음 실행시키면 실행이 된다.