«0» в Serial, не ясного происхождения.

Тема в разделе "Arduino & Shields", создана пользователем Beevaa, 18 янв 2019.

  1. Beevaa

    Beevaa Нерд

    Добрый день! Постараюсь объяснить, сразу понятно))), и так на Мега 2560 залит вот этот скетч:

    Код (C++):
    #include <memorysaver.h>
    #include <UTFT.h>                                      // подключаем библиотеку UTFT

    #include   <SPI.h>                                     // подключаем библиотеку SPI            для общения с SD-картой по шине SPI
    #include   <SdFat.h>                                   // подключаем библиотеку SdFat          для работы с SD-картой
    #include   <UTFT_SdRaw.h>                              // подключаем библиотеку UTFT_SdRaw     для вывода изображений с SD-карты на дисплей

    #include <OneWire.h>                                   // Инициализация библиотеки шины OneWire.
    #include <DallasTemperature.h>                         // Инициализация библиотеки термодатчиков.

    #define    SD_CHIP_SELECT SS                           // определяем константу  SD_CHIP_SELECT которой присваиваем номер вывода Arduino подключённого к линии выбора CS шины SPI SD-карты (номер используемый по умолчанию хранится в константе SS)
                                 
    extern uint8_t SmallFont[];                            // подключаем маленький шрифт
    extern uint8_t BigFont[];                              // подключаем большой шрифт
    extern uint8_t SevenSegNumFontPlusPlus[];              // подключаем цифровой шрифт                            

    UTFT myGLCD(TFT32MEGA,   38,39,40,41);                 // тип дисплея 3,2  MEGA (480x320 chip ILI9481)

    SdFat      mySD;                                       // объявляем объект mySD класса библиотеки SdFat для работы с его функциями и методами
    UTFT_SdRaw myFiles(&myGLCD);                           // объявляем объект myFiles класса библиотеки UTFT_tinyFAT с передачей ссылки на объект myGLCD класса библиотеки UTFT

    #define ONE_WIRE_BUS 10                                // Подключение цифрового вывода датчика к 10-му пину Ардуино.
    OneWire oneWire(ONE_WIRE_BUS);                         // Запуск интерфейса OneWire для подключения OneWire устройств.
    DallasTemperature sensors(&oneWire);                   // Указание, что устройством oneWire является термодатчик от  Dallas Temperature.

    //const int relPin = 3;                                  // Реле включения насоса.
    float TempUP;
    int TempDown;
    int Test;

    void setup()
    {
      sensors.begin();
       
      //Serial.begin(9600);
      Serial1.begin(57600);
      //Serial2.begin(9600);

    // pinMode (relPin,OUTPUT);
     
     
     
      myGLCD.InitLCD ();                                   // инициируем дисплей (по умолчанию горизонтальная ориентация)
      myGLCD.clrScr  ();                                   // стираем всю информацию с дисплея
    // myGLCD.setFont (BigFont);                           // устанавливаем большой шрифт
    //  myGLCD.setColor(VGA_BLUE);                         // устанавливаем синий цвет текста
    //  myGLCD.print   ("BigFont", CENTER, 100);           // выводим текст "BigFont" на дисплей
    //  myGLCD.print("Temperatura", CENTER, 100);
     
       if (!mySD.begin(SD_CHIP_SELECT))
       {
       myGLCD.setFont(BigFont);                             // устанавливаем большой шрифт
       myGLCD.setColor(VGA_RED);                            // устанавливаем цвет текста
       myGLCD.print("SD CADR - ERROR", CENTER, 150);
       }
      // while(!mySD.begin(SD_CHIP_SELECT)){}
       myFiles.load(0,0,480,320,"test.raw");

         
    }

    void loop(){
     
      sensors.requestTemperatures();                         // Команда опроса температуры.
     
     
      Serial1.println(121);
     
     
      //Serial2.println(122);

      TempUP = sensors.getTempCByIndex(0);
      TempDown = sensors.getTempCByIndex(1);
      Test = sensors.getTempCByIndex(2);
        if (!mySD.begin(SD_CHIP_SELECT))                     // При отключении SD-CARD, выводится сообщение об ошибке, исчезает после наладки
      {
       myGLCD.setFont(BigFont);                            
       myGLCD.setColor(VGA_RED);                          
       myGLCD.print("SD CADR - ERROR", CENTER, 150);
       if (mySD.begin(SD_CHIP_SELECT));
       {
        myGLCD.clrScr  ();
        myFiles.load(0,0,480,320,"test.raw");
       }
      }
     
     
       if (sensors.getTempCByIndex(0) <= -100)              // Аварийная остановка, после обрыва датчика температы подачи и возврат в норму после наладки    
      {
       myFiles.load(0,0,480,320,"TempAlert.raw");
       while(sensors.getTempCByIndex(0) < -100){}
       if (sensors.getTempCByIndex(0) > -100)
       {
        myGLCD.clrScr  ();
        myFiles.load(0,0,480,320,"test.raw");
       }
      }

       
     

      if (TempUP > 10 | TempUP < 25 )
      {
          myGLCD.setColor(0,0,255);
      }
      if (TempUP >= 25)
      {
         
    //   digitalWrite(relPin,HIGH);
          myGLCD.setColor(255,255,0);  
      }
      if (TempUP >= 75)
      {
          myGLCD.setColor(0,255,0);
      }
      if (TempUP >= 90 | sensors.getTempCByIndex(0) <= 10 )
      {
          myGLCD.setColor(255,0,0);
      }
     
       myGLCD.setFont(SevenSegNumFontPlusPlus);                    
       myGLCD.printNumF(TempUP,1,55,75);
       myGLCD.printNumI(TempDown,295,75);
       myGLCD.printNumI(TempUP,55,175);

       
     
    }
    Mega соединена с UNO по UART, на UNO залит вот этот скетч:

    Код (C++):
    float val;
    void setup() {
      Serial.begin(57600);
    }
    void loop()
      {
        if (Serial.available() > 0) {
        val = Serial.parseFloat();
        Serial.println(val);
        //delay(1000);
       }
      }
    Мега передает всего одно значение Serial1.Println(121) UNO его благополучно принимает и выводит в монитор. Теперь самое главное к MEGE подключено 3 датчика температуры. DS18b20, значение которые выводятся на TFT, когда я объявлю float TempUP, и показываю значения на экране с 1 знаком после запятой myGLCD.printNumF(TempUP,1,55,75); все хорошо экран показывает температуру. В Мониторе порта принимающей UNO значение 121… когда я подключаю второй датчик температуры и показываю его значение на экране…. myGLCD.printNumF(TempDown,295,75); то значения отображаются на экране нормально. Но в мониторе порта принимаю UNO появляется какой то загадочный «0» т.е монитор пишет следующее: 121-0-121-0-121-0 ну и до бесконечности…. Если вывод на экран одного из датчиков температуры перевести из myGLCD.printNumF в myGLCD.printNumI. то в Мониторе порта, благополучно отображается только 121… а если подключить 3 датчика и вывести из на TFT то уже не важно в каком виде выводить в целом или дробном TFT, в мониторе принимающей УНО. Этот загадочный 0 есть всегда, 121-0-121-0-121-0… и тд) как от этого избавиться?
     
  2. Daniil

    Daniil Гуру

    На уно парсеФлоат нормально понимает входящие инты? Попробуйте все сделать флоатами
     
    Beevaa нравится это.
  3. Beevaa

    Beevaa Нерд

    да, понимает все нормально, после точки пишет 0 и все) проблему решил, прописав на УНО- Serial.setTimeout().
    2 секунды, на ожидание числа на входном потоке, видимо скетч обрабатывался уже более 1 секунды, а описании Serial.parseFloat();, если дольше одной секунды ни чего не приходит то он возвращает 0 причем в этот же порт в обратном направлении вот он и вылазил))), хорошо что обратил внимание на это в описании Serial.parseFloat(); иначе до сих пор ломал бы голову,
     
    Daniil и arkadyf нравится это.
  4. Daniil

    Daniil Гуру

    Приколько.
    Странно, что на arduino.cc об этом не пишут.
     
  5. Beevaa

    Beevaa Нерд

    видимо это всем известно))) и учитывают сразу этот момент))) я пока еще совсем нубас в этом деле))) что то мои знания в программировании игр на С# тут вооооообще ни как не пригодились)))) чувствую себя ламер-ландухом :D:D:D
     
    Daniil нравится это.
  6. Daniil

    Daniil Гуру

    Век живи - век учись...