๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ์Šคํ…œ๊ฐœ๋ฐœ/์•„๋‘์ด๋…ธ&๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด

RS-485 master/slave ํ†ต์‹ ํ•˜๊ธฐ - ์†Œ์Šค์ฝ”๋“œ ํฌํ•จ

by ์ด๋…ธํ‚ค_ 2019. 10. 17.

https://yonglimlee.tistory.com/entry/485-Serial-%ED%86%B5%EC%8B%A0%ED%95%98%EA%B8%B0?category=734072

 

 

485 Serial ํ†ต์‹ ํ•˜๊ธฐ

1. ์ค€๋น„๋ฌผ (1) TTL to RS485 ์ž๋™ ํ๋ฆ„์ œ์–ด ์ปจ๋ฒ„ํ„ฐ ๋ชจ๋“ˆ [SZH-CVBE-010] (2) ์•„๋‘์ด๋…ธ ๋‚˜๋…ธ (Slave#1 ์—ญํ• ) (3) ์•„๋‘์ด๋…ธ ๋ฉ”๊ฐ€ (Slave#2 ์—ญํ• ) (4) ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด (Master ์—ญํ• ) ์•„๋ž˜์˜ ์‚ฌ์ง„์€ TTL to RS485 ์ปจ๋ฒ„ํ„ฐ..

yonglimlee.tistory.com

1. ํ†ต์‹  ๋ฐฉ๋ฒ•

- RS-485

 

2. ๊ตฌ์„ฑ

- master node 1๊ฐœ

- slave node 2๊ฐœ

 

3. master์ธก ์†Œ์Šค

#include "Definition.h" //๊ตฌ์กฐ์ฒด๊ฐ€ ์„ ์–ธ
#define MAX_FAIL_CNT 2

int t = 0;
//Slave ๋…ธ๋“œ์˜ ์•„์ด๋””์ด๋ฉฐ
//Slave ๋…ธ๋“œ๋Š” ๊ฐ์ž์˜ ์•„์ด๋””๊ฐ’์ด ๋‹ฌ๋ฆฌํ•ด์„œ ์ €์žฅ๋˜์–ด์žˆ์Œ.
int id[NODE_CNT] = {101, 102}; 
int curIdx = 1;
enum eNode {e101=0, e102};

char ch = 'a';
//์‹œ๋ฆฌ์–ผ ํ†ต์‹  ๋ฐ์ดํ„ฐ ์‹œ์ž‘ ๋ฌธ์ž์—ด
char chAt = '@';
//์‹œ๋ฆฌ์–ผ ํ†ต์‹  ๋ฐ์ดํ„ฐ ์ข…๋ฃŒ ๋ฌธ์ž์—ด
char chExclam = '!';

char buf[BUFFER_SIZE] = {0, };
char reqID[5] = {0, };
String str = "";
bool bTransmitt = false;
bool bRead = false;
int failCnt = 0;

//slave ๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•˜๋Š” ๊ฐ’
enum envData {eTemp, eHumidity, eWater, eLight, eCnt};

unsigned long reqTime = 0;
unsigned long curTime = 0;

DATA nodes[NODE_CNT] = {0x00, };

//๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜
void parseDataFromPkt(String str)
{
  char* token = NULL;
  char tok[] = ",";
  float arrValue[eCnt] = {0,};
  DATA node = {0x00, };

  char pkt[BUFFER_SIZE] = {0, };
  strcpy(pkt, str.c_str());
  
  token = strtok(pkt, tok);
  int thisId = atoi(token);
  
  int i = 0;
  while(token != NULL && i < eCnt)
  {
    token = strtok(NULL, tok);
    arrValue[i] = atof(token);
    i++;
  }
  token = NULL;
  //ํŒŒ์‹ฑํ•œํ›„ ๋ฐฐ์—ด์— ์ €์žฅ
  node.head.id           = thisId;
  node.body.temperature  = arrValue[eTemp];
  node.body.humidity     = arrValue[eHumidity];
  node.body.water        = 0;
  node.body.light        = arrValue[eLight];
  if ( thisId == 101)
    nodes[e101] = node;
  else if (thisId = 102)
    nodes[e102] = node;
}


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // ์ง๋ ฌ ํ†ต์‹  ์ดˆ๊ธฐํ™”
  Serial.println("I am a master!");
  delay(100);
  
  Serial.print("Slave node ID is ");
  for(int i = 0 ; i < NODE_CNT ; ++i)
  {
   Serial.print(id[i]);
   Serial.print(", ");
  }
  Serial.println("\nMaster node start...");
  Serial.setTimeout(5000);

}

void loop() {
  curTime = millis()/1000;
  //์ฒ˜์Œ์— bTransmitt์€ false๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด์žˆ์Œ.
  if(bTransmitt == false){
    int cnt = curIdx%2;
	//@101! or @102!์˜ ํ˜•์‹์œผ๋กœ slave id ์š”์ฒญ
    sprintf(buf, "@%d!", id[cnt]);
    Serial.write(buf);
    bTransmitt = true;
    reqTime = millis()/1000;
  }

  if(bTransmitt == true && curTime - reqTime > 5){
    bTransmitt = false;
    curIdx++;
  }
  
  if(Serial.available())
  {
    char ch = Serial.read();
    //์‘๋‹ด์ด @์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด SerialRead ์ฝ๊ธฐ ์‹œ์ž‘
   if (ch == '@')
   {
    bRead = true;
   }
   else
   {
     //๋งˆ์ง€๋ง‰ '!'๋ฅผ ๋ฌธ์ž๋ฅผ ๋ฐ›์œผ๋ฉด 
     //string ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ parsingํ•˜์—ฌ ์ €์žฅ
     if (ch == '!')
     {
      bRead = false;
      parseDataFromPkt(str);
      str = "";
      bTransmitt = false;
      curIdx++;
      delay(30000);
     }
	 //์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ ๊ณ„์†ํ•ด์„œ string ๋ณ€์ˆ˜์— ์ €์žฅ
     if(bRead)
     {
      str += ch;
     }
   }

  }

  if(curIdx == 10000){
    curIdx = 1;
  }
}

 

4. Slave๋…ธ๋“œ ์†Œ์Šค

#include <DHT.h>  // Including library for dht
#include <Timer.h>
//Slave NODE๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ MYID ๊ฐ’์„ ๊ฐ€์ง
//ํ…Œ์ŠคํŠธ์‹œ์—๋Š” 101, 102๊ฐ’์„ ๊ฐ€์ง€๋Š” slave node2๊ฐœ๋กœ ํ…Œ์ŠคํŠธํ•จ.
#define MYID 101
#define HEADER_SIZE 4
#define DATA_SIZE 16
#define BUFFER_SIZE 30
#define LIGHT   A1      
#define WATER   A0

bool bRead = false;
String str = "";
char buf[BUFFER_SIZE] = {0, };

bool isMyId(char* pkt);

int water = 1;
int light = 0;
float hum = 0.0f;
float tem = 0.0f;

Timer t;

#define DHTPIN 12     // NodeMCU D7 Pin          //pin where the dht11 is connected
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void readHumTem(void* context)
{
  hum = dht.readHumidity();
  tem = dht.readTemperature();
  light  = analogRead(LIGHT); 
  water = analogRead(WATER);
  if(water > 10 )
    water = 1;
  else
    water = 0;
  
  if( isnan(hum) || isnan(tem))
  {
    Serial.println("Failed to read data from DHT Sensor!!!");
    return;
  }

}

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Serial.print("Slave Id is ");
  Serial.println(MYID);

  //์˜จ์Šต๋„์„ผ์„œ ์ดˆ๊ธฐํ™”
  dht.begin();
  Serial.print("DHT is beginning...");
  delay(10);

  //ํ™˜๊ฒฝ๋ฐ์ดํ„ฐ๋Š” master node์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ
  //1์ดˆ๋งˆ๋‹ค ํ•œ๋ฒˆ์”ฉ ์ „์—ญ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•จ.
  t.every(1000, readHumTem, 0);
  
}
 
void loop() // run over and over
{
  if(Serial.available())
  {
    char ch = Serial.read();
    
    //'@'๊ฐ’์„ ์ฝ์œผ๋ฉด Serial ๊ฐ’์„ ์ฝ๊ธฐ ์‹œ์ž‘ํ•จ.
    if(ch == '@')
    {
      bRead = true;
    }
    else
    {
      if (ch == '!')
      {
        bRead = false;
        //'!' ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ฝ๊ธฐ ์ค‘๋‹จ.
        //ํ˜„์žฌ MYID์™€ ์ˆ˜์‹ ๋œ ์‹œ๋ฆฌ์–ผ๋ฐ์ดํ„ฐ์˜ ID๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ 
        //๊ฐ™์„ ๊ฒฝ์šฐ์— ์‘๋‹ต์„ ๋ณด๋ƒ„.
        if( isMyId(str) == true )
        {
            memset(buf, 0x00, BUFFER_SIZE);
            char chTem[8] = {0, };
            char chHum[8] = {0, };
          
            dtostrf(tem, 5, 2, chTem);
            dtostrf(hum, 5, 2, chHum);
            sprintf(buf, "@%d,%s,%s,%d,%d!", MYID, chTem, chHum, water, light);
            Serial.write(buf);
        }
        str = "";
      }
      if(bRead)
      {
       str += ch;
      }
    }
  }
  //1์ดˆ๋งˆ๋‹ค ํ™˜๊ฒฝ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
  t.update();
}

bool isMyId(String s)
{
  char pkt[10] = {0,};
  strcpy(pkt, s.c_str());
  char* id = strtok(pkt, "!");
  int nId = atoi(id);
  bool bSame = false;
  if( MYID == nId)
    bSame = true;
  return bSame;
}

๋Œ“๊ธ€