반응형
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초 카운터를 출력하는 코드를 제거하면 현저하게 재연결 횟수가 줄어들든가 아예 생기지 않는다. 코드를 다시 한 번 살펴보고 어떤 이유인지 분석해야 할 숙제다.
반응형
'개발자 > Arduino' 카테고리의 다른 글
Nano 33 IoT HC-SR04 거리 센서 코드 (6) | 2021.10.09 |
---|---|
LPS22HB 압력 센서 아두이노 실습하기 (0) | 2021.10.06 |
아두이노를 활용한 스마트 기기 제어 시스템 개발 교육과정 (0) | 2021.09.08 |
아두이노 INA219 DC 전류 센서 사용하기 (0) | 2021.07.25 |
Nano 33 IoT WiFi 연결 불안정을 해결하는 코드 (0) | 2021.05.20 |
Arduino MQTT 사용자 ID와 password로 mqtt 브로커 연결 (0) | 2021.05.17 |
미세먼지 측정기 센서와 커넥터 연결 - Harness (0) | 2021.05.13 |
How to prevent SSD1306 allocation failed error (0) | 2021.04.30 |
더욱 좋은 정보를 제공하겠습니다.~ ^^