ESP8266 NtpClient анализирует ответ int в символ * с 2 цифрами

#c #esp8266 #arduino-ide #arduino-esp8266

#c #esp8266 #arduino-ide #arduino-esp8266

Вопрос:

Я пишу планировщик времени для переключения сокетов в определенное время для микропроцессорного узла NodeMCU. Я столкнулся с проблемой синтаксического анализа значений. Я извлек значения (например, ’08:30′) из базы данных и сохранил в char *. Я извлекаю текущее время с помощью NtpClient, но это значение int. Моя идея состоит в том, чтобы создать char * из hour, ‘:’ и minutes и сравнить с моим значением из базы данных, но у меня есть 2 проблемы:

  • Мне нужно создать 2-значный символ * из часов и минут.
  • Мне нужно соединить эти две строки

У меня нет большого опыта в c , и я могу сделать это самостоятельно, но я хочу сделать это наиболее эффективным способом, потому что я буду запускать этот скрипт по крайней мере каждые 50 секунд.

Комментарии:

1. не делайте преждевременной оптимизации, если вам нужно анализировать один int раз каждые 50 секунд, тогда попытка найти «наиболее эффективный» должна быть вашей последней заботой

2. @largest_prime_is_463035818 Я могу делать это каждую секунду, чтобы запланированная задача выполнялась в начале определенной минуты. Но я не думаю, что это хорошая идея.

3. I'm writing scheduler .. I fetched values (eg. '08:30') from database Зачем вам нужно текущее время для планировщика? Ооочень, это настоящий планировщик, а не планировщик процессов .

4. @KamilCuk правильно. Извините. Я отредактировал описание

5. Я бы сравнил числа, а не строки

Ответ №1:

У меня минимальный опыт работы с C . Кроме того, Arduino IDE не является полноценным C . Мое решение для этого:

 int intLength( int N )
{
   if      ( N < 0  ) return 1   intLength( -N );
   else if ( N < 10 ) return 1;
   else               return 1   intLength( N / 10 );
}


void setSocketsState() {
      int currentHour = timeClient.getHours();
      int currentMinute = timeClient.getMinutes();
      char currentHourChar[10];
      char currentMinuteChar[10];
      itoa(currentHour, currentHourChar, 10);
      itoa(currentMinute, currentMinuteChar, 10);
    
      char dest[24] = "";
      if (intLength(currentHour) == 1) {
        strcat(dest, "0");
      }
      
      strcat(dest, currentHourChar);
      strcat(dest, ":");
      if (intLength(currentMinute) == 1) {
        strcat(dest, "0");
      }
      strcat(dest, currentMinuteChar);
    
      char* dateToCompare = dest;  // result: HH:MM
      socket1.handleCurrentTime(dateToCompare);
      socket2.handleCurrentTime(dateToCompare);
      socket3.handleCurrentTime(dateToCompare);
      socket4.handleCurrentTime(dateToCompare);
    }
 

У меня еще долгий путь впереди. Если вы хотите увидеть эту часть моего проекта, вот ссылка:
https://github.com/wojtaszek171/SmartHome/blob/master/esp8266/ESP1/ESP1.ino