1

Тема: Доброго дня , не можу зрозуміти в чому проблема (Програмування чіпу)

проблема в тому , що контролер по запиту в телеграм повинен включити світодіод на 4хв але він його включає через 239 секунд і в 240 секунд виключає. Час задавав різний проблема залишалася.

void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";
      
    String text = bot.messages[i].text;
  
    
    if (text == "/alarn")
    {
      ledStatus = 3;
     bot.sendMessage(chat_id, "alarn is ON", "");
      }

    if (text == "/ledon")
    {
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led is ON", "");
    }

    if (text == "/ledoff")
    {
      ledStatus = 0;
      bot.sendMessage(chat_id, "Led is OFF", "");
    }
  }
}


void setup()
{
  Serial.begin(115200);
  Serial.println();

  pinMode(2, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(2, HIGH); // initialize pin as off (active LOW)

  // attempt to connect to Wifi network:
  configTime(0, 0, "pool.ntp.org");      // get UTC time via NTP
  secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org
  Serial.print("Connecting to Wifi SSID ");
  Serial.print(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi подключено. IP address: ");
  Serial.println(WiFi.localIP());

  // Check NTP/Time, usually it is instantaneous and you can delete the code below.
  Serial.print("Retrieving time: ");
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }
  Serial.println(now);
}

void loop()
{
 
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    
    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    if((ledStatus == 0) && (lastledStatus !=0)){
      digitalWrite(2, HIGH);
      lastledStatus = 0;
      }
    if((ledStatus == 1) && (lastledStatus !=1)){
      digitalWrite(2, LOW);
      lastledStatus = 1;
      }
      if((ledStatus == 3) && (lastledStatus !=3)){
      digitalWrite(2, HIGH);
      bot_lasttime = millis();
      lastledStatus = 3;
      }
      if((ledStatus == 3) && (lastledStatus == 3) && ((millis() - bot_lasttime) >= 240000)){
      digitalWrite(2, LOW);
      ledStatus = 0;
      lastledStatus = 1;
      }
}

2

Re: Доброго дня , не можу зрозуміти в чому проблема (Програмування чіпу)

Наскільки я зрозумів, світлодіод включений на втік струму, тобто між +Vcc та піном контролера.
Тоді для вмикання діоду потрібно робити:

digitalWrite(2, LOW);

А для вимикання, відповідно:

digitalWrite(2, HIGH);

У вас логіка навпаки.

Далі, у разі (ledStatus == 3) && (lastledStatus !=3) у вас відбувається нормальне перемикання діоду (якщо не зважати на інверсію, про яку написано вище).

Але наступна умова (ledStatus == 3) && (lastledStatus == 3) && ((millis() - bot_lasttime) >= 240000) через інтервал часу окрім зворотнього перемикання діоду, також встановлює значення ledStatus = 0 та lastledStatus = 1.

А це в свою чергу означає, що у наступному ж циклі спрацює перша умова (ledStatus == 0) && (lastledStatus !=0) і знову перемкне діод назад, що ви і бачите.

Подякували: Iakol1

3

Re: Доброго дня , не можу зрозуміти в чому проблема (Програмування чіпу)

Боже, велике вам дякую. 10 раз переписував програму і постійно робив одну й ту саму помилку.