Lecture 강의

Undergrads 학부 Graduates 대학원 역학(Mech)/설계(Design)/FEM 인공지능(AI)/기계학습(ML)/IoT SAP/ETABS OpenSees/FeView/STKO 아바쿠스(Abaqus) 파이썬(Python)/매트랩(Matlab) 엑셀(Excel) VBA 마이다스(MIDAS)

[박주민][파이썬과 아두이노] 14. 엑셀을 통한 실시간 데이터 저장

작성자 : 박주민

(2024-06-02)

조회수 : 783

▪ 확장파일

    이번주는 엑셀을 활용한 실시간 데이터를 저장하는 방식을 진행해보려합니다.

 

[CODE] 이거는 엑셀로 실시간 데이터 받을때 사용할 코드입니다 [LINK]

[ZIP] 아두이노 확장 파일입니다. [LINK]

 

[1] 가속도 센서(mm출력)

const int TriggerPin = 8;
const int EchoPin = 9;
long Duration = 0;
float Distance;
int i = 1;
unsigned long startTime;

void setup() { 
  Serial.begin(9600);
  pinMode(TriggerPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  Serial.println("CLEARDATA"); //처음에 데이터 리셋
  Serial.println("LABEL,No.,Distance(mm)"); //엑셀 첫행 데이터 이름 설정
  startTime = millis(); // 프로그램 시작 시간을 저장
}

void loop() { 
  if (millis() - startTime > 60000) { // 1분(60000ms) 경과 확인
    Serial.println("1분이 경과하여 프로그램을 종료합니다.");
    noInterrupts(); // 인터럽트를 비활성화하여 프로그램을 멈춤
    while(true); // 무한 루프를 돌려 프로그램을 완전히 멈춤
  }

  digitalWrite(TriggerPin, HIGH); 
  delay(15); 
  digitalWrite(TriggerPin, LOW);

  Duration = pulseIn(EchoPin, HIGH);
  Distance = (Duration / 2.0) * 0.34; // 속도를 340m/s에서 0.34mm/µs로 변환

  Serial.print("DATA,"); // 데이터 행에 데이터를 받겠다는 말
  Serial.print(i++); // No. 데이터를 출력
  Serial.print(","); // ,로 데이터를 구분하고 엑셀에는 셀을 구분
  Serial.println(Distance); // Distance 데이터 출력

  delay(500); // 0.5초마다 측정
}

[2] 가속도 cm출력

const int TriggerPin = 8;
const int EchoPin = 9;
long Duration = 0;
float Distance;
int i = 1;
unsigned long startTime;

void setup() { 
  Serial.begin(9600);
  pinMode(TriggerPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  Serial.println("CLEARDATA"); //처음에 데이터 리셋
  Serial.println("LABEL,No.,Distance"); //엑셀 첫행 데이터 이름 설정
  startTime = millis(); // 프로그램 시작 시간을 저장
}

void loop() { 
  if (millis() - startTime > 60000) { // 1분(60000ms) 경과 확인
    Serial.println("1분이 경과하여 프로그램을 종료합니다.");
    noInterrupts(); // 인터럽트를 비활성화하여 프로그램을 멈춤
    while(true); // 무한 루프를 돌려 프로그램을 완전히 멈춤
  }

  digitalWrite(TriggerPin, HIGH); 
  delay(15); 
  digitalWrite(TriggerPin, LOW);

  Duration = pulseIn(EchoPin, HIGH);
  Distance = ((340 * Duration) / 10000) / 2;

  Serial.print("DATA,"); // 데이터 행에 데이터를 받겠다는 말
  Serial.print(i++); // No. 데이터를 출력
  Serial.print(","); // ,로 데이터를 구분하고 엑셀에는 셀을 구분
  Serial.println(Distance); // Distance 데이터 출력

  delay(500); // 0.5초마다 측정
}

[3] 습온도 출력

#include // DFRobot_DHT11 라이브러리 포함

DFRobot_DHT11 DHT;  // DHT 객체 생성
#define DHT11_PIN A0  // DHT11 센서 데이터 핀 번호 정의
float hum; // 습도 값을 저장
float temp; // 온도 값을 저장
unsigned long counter = 0; // 카운터 변수

void setup() {
    Serial.begin(9600);
    Serial.println("CLEARDATA");
    Serial.println("LABEL,Counter,Temp,Humi");
}

void loop() {
    DHT.read(DHT11_PIN);
    hum = DHT.humidity;
    temp = DHT.temperature;

    counter++; // 카운터 증가

    Serial.print("DATA,");
    Serial.print(counter);
    Serial.print(",");
    Serial.print(temp);
    Serial.print(",");
    Serial.println(hum);
    delay(1000); // 1초 지연
}