Индикация времени, как добавить *0* к секундам и минутам ? РЕШЕНО (спасибо DIYMan и Mitrandir)

Тема в разделе "Arduino & Shields", создана пользователем Саша_да_да_Саша, 22 июн 2018.

  1. Вечер добрый. Если так, то это уже хорошо )).
    У меня такая проблема. Не хочет компилироваться с мега 2560, а на 8266 работает без проблем, почему, кто виноват и что делать ))
    Код (Text):

    [== Undefined ==]
    void printDigits(int digits)       // prints leading 0
    {
      Serial.print(":");
      if (digits < 10)
        Serial.print('0');
      Serial.print(digits);
    }
     
    В сериал порт выводит правильно с нулём
    Serial.print (" : ");
    printDigits((time_min_2));
    Serial.print ("m");
    --------------------------------------------------------
    а на страницу не получается не компилится.
    client.print (printDigits((time_min_2)); Скобки пробовал по разному не помогает
     
  2. SergeiL

    SergeiL Оракул Модератор

    А ошибку-то какую пишет?
     
  3. На этой строчке подсвечивает, не помню, пока без неё сделал, зато в сериал правильно работает 0:00:00
     
  4. SergeiL

    SergeiL Оракул Модератор

    Я понял,
    Функция " printDigits" у Вас определена как void, то есть она ничего не возвращает.
    А здесь Вы пытаетесь передать в функцию client.print возвращаемое значение функции " printDigits", которого нет.
     
  5. Я в поиске пытался посмотреть чей то код, как там этот *0* реализован, но там всё про часы с РТС, или готовые дисплейные библиотеки и ни слова по выводу в ВЭБ страницу, мне проще DHT22 получилось напечатать, чем этот ноль )))
     
  6. Ошибок не пишет, но в любом случае как печатало 0ч 0м 0с так и печатает

    byte printDigits(int digits) // prints leading 0
    {
    if (digits < 10)
    Serial.print('0');
    Serial.print(digits);
    return(digits);
    }
    ---------------------------------------------------
    client.print (printDigits(time_min));
    client.print("m . ");
    client.print (printDigits(time_sec));
    client.print("s");
    ----------------------------------------------------
    так пробовал (printDigits((time_sec))); тоже самое
     
  7. Mitrandir

    Mitrandir Гуру

    Чему равна переменная time_sec?
     
  8. unsigned long time_sec = 0;
     
  9. Mitrandir

    Mitrandir Гуру

    И правильно я понимаю, что в Serial пишет 00, в client 0?
     
  10. Mitrandir

    Mitrandir Гуру

    ну так функция printDigits получает на входе 0, рисует два 0 в сериал, и 1 ноль возращает обратно
     
  11. Ну на странице время обновляется тикает, а мне что 1 ноль возвращает обратно, разве не это надо, но его там нет
     
  12. Только теперь в сериал начал дублироваться ненужный мне мусор
    0h : 00m : 16s
    00000016
     
  13. DIYMan

    DIYMan Guest

    Не смущает, что один ноль печатаем в Serial, а второй - печатаем в клиента? Не? Пробуй так:
    Код (C++):
    void printDigits(Stream& s, int digits)
    {
    if (digits < 10)
      s.print('0');
      s.print(digits);  
    }

      printDigits(client, time_min);
      client.print("m . ");
      printDigits(client, time_sec);
      client.print("s");
    Теперь функция printDigits может печатать в любой наследник Stream, коим и является экземпляр client, емнип.
     
    Саша_да_да_Саша нравится это.
  14. Mitrandir

    Mitrandir Гуру

    Код (C++):

    /** функция превращает число в строку
      *  t - число
      * buf - куда полдожить результат
    */


    void getStr(int t, char* buff){

      if(t<10){ // если меньше 10 то рисуем ведущий ноль
        ret[0]= '0'; // первый символ 0
    /*
    переведем цифру в символ, так как в ASCII коды цифр идут последоватьельно,
    то прибавим нашу цифру к коду 0, то что 0 в кавычках важно, это не 0, а  код аски символа 0
    */

      ret[1] = '0'+t;
    /**
    строка должна кончаться нулем
    */

        ret[2] = 0;
      }else{
    // если больше 10 юзаем стандартную функцию конвертации
          itoa( t,ret,10);
      }
    }

    //-----------------------
    // выделим память в куче
    char* buff = new char[3];
    //получим минуты
    getStr(time_min, buff);
    //отправим минуты
    client.print (buff);
    client.print("m . ");

    //получим секунды
    getStr(time_sec, buff);
    client.print (buff);
    client.print("s");

    // почистим кучу
    delete buff;
     
     
    Последнее редактирование: 23 июн 2018
    Саша_да_да_Саша нравится это.
  15. 'client' was not declared in this scope
    Это по первому варианту выдало, а 2й ваш это для меня что то совсем непонятное, это избавиться от printDigits вообще как я понял и применить 2й??
     
  16. Mitrandir

    Mitrandir Гуру

    ваш код даст тоже
    'client' was not declared in this scope

    увы я не знаю что за client вы используете

    я просто переписал ваш printDigits
     
  17. Вы мне очень помогли, как только я убрал printDigits из
    Код (C++):

      Serial.print(time_hrs);
      Serial.print ("h");
      Serial.print (" : ");
      Serial.print(time_min);
      Serial.print ("m");
      Serial.print (" : ");
      Serial.print(time_sec);
      Serial.print ("s");
     
    Часы в вэб стали правильными 0 00 00, а что в сериал 0 0 0 ну и бог с нем, он мне не нужен
    ПС Что касается *Stream&* первый раз вижу нигде не встречал и не узнал бы.
    СССППААААССИИББООООООООООООО