본문 바로가기

NODE-RED

Node-RED 에서 Esp32 커스텀 제작보드와 통신

728x90

 

 

스마트팜 제품을 개발중인데 하루종일 시간경과에 따른 제어나 데이터 수집 관련 테스트가 어렵다. 그래서 강제로 시간정보를 mqtt 를 이용하여 json 형태로 보내고 통신을 한다.

 

Node-RED 에서 컨트롤러 보드에 특정시간을 보낸다.

var myGlobalVar = global.get("device_id");
msg.topic = 'balconyfarm/'+ myGlobalVar +'/virtual/time';

var timestamp = global.get("date");
var hour = global.get("hour");
var min = global.get("min");
var sec = 50

// timestamp를 Date 객체로 변환
var dateObj = new Date(timestamp);

// Date 객체에서 year, month, day 추출
var year = dateObj.getFullYear();
var month = ("0" + (dateObj.getMonth() + 1)).slice(-2); // 월은 0부터 시작하므로 1을 더함
var day = ("0" + dateObj.getDate()).slice(-2);

msg.payload = {
    "year": year,
    "month": month,
    "day": day,
    "hour": hour,
    "min": min,
    "sec" : sec
};

return msg;

 

Node-RED 에서 컨트롤러 보드에 현재시간을 보낸다.

var myGlobalVar = global.get("device_id");
msg.topic = 'balconyfarm/' + myGlobalVar + '/virtual/time';

// 현재 시간 가져오기
var dateObj = new Date();

// Date 객체에서 year, month, day, hour, minute, second 추출
var year = dateObj.getFullYear();
var month = ("0" + (dateObj.getMonth() + 1)).slice(-2); // 월은 0부터 시작하므로 1을 더함
var day = ("0" + dateObj.getDate()).slice(-2);
var hour = ("0" + dateObj.getHours()).slice(-2);
var min = ("0" + dateObj.getMinutes()).slice(-2);
var sec = ("0" + dateObj.getSeconds()).slice(-2);

msg.payload = {
    "year": year,
    "month": month,
    "day": day,
    "hour": hour,
    "min": min,
    "sec": sec
};

return msg;

 

esp32 컨트롤 보드에서 데이터를 수신하여 파싱하여 시간을 적용한 코드이다.

  if(memcmp(mqtt_topic_virtual_time, topic, strlen(mqtt_topic_virtual_time)) == 0)
  {
    const size_t bufferSize = JSON_OBJECT_SIZE(3) + 70;
    DynamicJsonDocument jsonBuffer(4 * 1000); // bufferSize);

    // String을 JSON으로 변환
    DeserializationError error = deserializeJson(jsonBuffer, message);
    if (error) {
      DEBUG_PRINTF(F("deserializeJson() failed: "));
      DEBUG_PRINTLN(error.c_str());
      return;
    }

    // if(systemStates.virtualMode == 0) return; // 

    // Extract values
    int year = jsonBuffer.containsKey("year") ? jsonBuffer["year"] : -1; // Assuming LED values are integers
    int month = jsonBuffer.containsKey("month") ? jsonBuffer["month"] : -1; // Assuming LED values are integers
    int day = jsonBuffer.containsKey("day") ? jsonBuffer["day"] : -1; // Assuming LED values are integers
    int hour = jsonBuffer.containsKey("hour") ? jsonBuffer["hour"] : -1; // Assuming LED values are integers
    int min = jsonBuffer.containsKey("min") ? jsonBuffer["min"] : -1; // Assuming LED values are integers
    int sec = jsonBuffer.containsKey("sec") ? jsonBuffer["sec"] : -1; // Assuming LED values are integers

    DEBUG_PRINTFLN("%s %d/%d/%d %d:%d:%d \r\n", mqtt_topic_virtual_time, year, month, day, hour, min, sec);

    if (year != -1 && month != -1 && day != -1 && hour != -1 && min != -1) {
      setSystemTime(year, month, day, hour, min, sec);
    } else {
      DEBUG_PRINTLN("Invalid time data in JSON");
    }

 

 

두번째는 LED 조명 밝기를 개별제어한다. 

 

Node-RED 에서

룸번호를 저장하고 

LED 밝기를 설정하고

"생장조명전송"버튼을 누른다.

아래는 esp32 에서 받은데이터이다.

 

 

테스트 동영상

 

 

 

Node-RED와 ESP32의 결합은 IoT 기능을 구현하는 데에 아주 훌륭한 궁합을 자랑합니다. 이 조합을 통해 손쉽게 센서 데이터 수집, 제어, 모니터링이 가능하며, 복잡한 프로그래밍 없이 시각적으로 IoT 환경을 구축할 수 있어 많은 이점이 있습니다.

저희 업체는 다년간 농촌진흥청과 함께 스마트팜 개발 사업을 진행하며 노지와 실내 스마트팜 팩토리 관련 프로젝트를 성공적으로 수행해 왔습니다. 이러한 경험을 통해 다양한 환경에 적합한 솔루션을 제공할 수 있으며, Node-RED와 ESP32를 활용한 스마트팜 프로젝트에 대해 궁금한 사항이 있거나 도움이 필요하시면 언제든지 문의해 주시기 바랍니다. 협업을 통해 보다 효율적이고 혁신적인 스마트팜 솔루션을 구현할 수 있습니다.