본문 바로가기

개발자/Arduino

nano 33 iot Serial Port Outputs make unstable WiFi Connection

반응형

 

 

nano 33 iot Serial Port Outputs make unstable WiFi Connection 

 

Nano 33 IoT 보드에서 타이머 인터럽트와 함께 Serial Port 출력을 자주 사용하는 것은 wifi 연결을 불안정하게, 그러니까 자주 연결을 끊어지게 만든다. 자세한 원인은 아직 확인중이라서 모르겠는데 테스트를 해보니 확실히 드러난다.

 

1초 주기마다 카운터를 증가시키는 타이머 인터럽트에서 씨리얼 모니터로 타이머 값을 프린트 하는 코드는 아래와 같다.

 

//Here Start Timer function
//this function gets called by the interrupt at <sampleRate>Hertz

void TC5_Handler (void) {
  //YOUR CODE HERE  
  time_tick_onesecond++;
  flag_300seconds++;

  Serial.println(time_tick_onesecond);
  
  // END OF YOUR CODE
  TC5->COUNT16.INTFLAG.bit.MC0 = 1; //Writing a 1 to INTFLAG.bit.MC0 clears the interrupt so that it will run again
}

 

그리고 루프를 돌면서 wifi 연결을 검사하고 다시 연결하는 코드는 아래와 같다. 메인 루프에서 WL_CONNECTED를 검사하여 setup_wifi() 를 호출하는 코드를 동시에 나타내는 데 여하튼 WiFi가 끊어지면 잘 작동한다. wifi 가 새로 연결되면 바로 아래에서 mqtt 서버에 다시 연결하여 브로커를 등록하는 과정도 있다.

 

if(WiFi.status() != WL_CONNECTED)
    {
        setup_wifi();
        Serial.print("reconnected times: ");
        Serial.println(reconnectCounter);

        //setup MQTT server
        client.setServer(mqtt_server, 1883); // Wait----MQTT 서버에 연결합니다.
        if(client.connect(machine_code, mqtt_username, mqtt_password)) //27second
        {
            client.subscribe("operate"); //20210520 insert
            Serial.println("\tMQTT Connected");
        }
        client.setCallback(callback);        
}

void setup_wifi()
{
    int statusWiFi = WiFi.status();

    // attempt to connect to Wifi network:
    while ( statusWiFi != WL_CONNECTED) {
        Serial.print("Attempting to connect to SSID: ");
        Serial.println(ssid);
        Serial.print("Status: ");
        Serial.println(statusWiFi);

        // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
        statusWiFi = WiFi.begin(ssid, pass);
        reconnectCounter ++;
        if( statusWiFi != WL_CONNECTED )
        {
            Serial.print("Connect Fail - call end() wait 5s status:");
            Serial.println(statusWiFi);      

            Serial.print("Reason code: ");
            Serial.println(WiFi.reasonCode());

            // Connect was not successful... retry
            WiFi.end();
            delay( 5000 );
        } 
        else 
        {
            // Give it 1s connected...
            delay( 1000 );
        }
    
    }
}


 

위와 같은 코드를 실행하면 재연결 횟수가 너무 많이 나온다. 연결이 끊겨 재 연결할 때 출력 메시지는 아래와 같다.

 

923
924
Attempting to connect to SSID: PISnet_032AC8
Status: 255
Connect Fail - call end() wait 5s status:4
Reason code: 1
925
926
927
928
Attempting to connect to SSID: PISnet_032AC8
Status: 4
929
930
931
932
933
934
935
936
937
reconnected times: 5
        MQTT Connected
938
939
940

 

테스트 해보면 타이머 인터럽트에서 1초 카운터를 출력하는 코드를 제거하면 현저하게 재연결 횟수가 줄어들든가 아예 생기지 않는다. 코드를 다시 한 번 살펴보고 어떤 이유인지 분석해야 할 숙제다.

 

 

계획이라는 것을 갖고 싶었다.

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^