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

Beevaa
Offline
Зарегистрирован: 11.01.2019

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

#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);

    
  
}

 

Beevaa
Offline
Зарегистрирован: 11.01.2019

не туда нажал и так продолжим, Мега Mega соединена с UNO по UART, на UNO залит вот этот скетч:

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… и тд) как от этого избавиться?

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

67 строку посмотри, а?

Beevaa
Offline
Зарегистрирован: 11.01.2019

Мега передает всего одно значение Serial1.Println(121) UNO его благополучно принимает и выводит в монитор, там как раз об этой строке

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Похоже идет переполнение RAM, вот глюки и вылезают. Скорее всего стек переполняется. Слишком много на бедную Мегу нагрузили.

Подключение дополниетельного датчика и работа с FLoat требует дополнительной памяти. Надо скетч оптимизировать по потребляемой RAM

 

Beevaa
Offline
Зарегистрирован: 11.01.2019

при прошивке пишет что паямти использовано 15% первой и 12% второй))) т

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

asam пишет:

Похоже идет переполнение RAM, вот глюки и вылезают. Скорее всего стек переполняется. Слишком много на бедную Мегу нагрузили.

Подключение дополниетельного датчика и работа с FLoat требует дополнительной памяти. Надо скетч оптимизировать по потребляемой RAM

 

Да там программы две строки в два ряда. ТС - поставьте эщо сериал.принт

Beevaa
Offline
Зарегистрирован: 11.01.2019

я думаю для тебя не составить труда дать совет по этой программе в две строки))) ты же проффи)))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Beevaa пишет:

я думаю для тебя не составить труда дать совет по этой программе в две строки))) ты же проффи)))

Не - после 90-х меня "на слабо" не возьмешь. А нахрена мне это? Добавляй Serial.print() и отслеживай переменные, двоешник!

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

mykaida пишет:

asam пишет:
Похоже идет переполнение RAM, вот глюки и вылезают. Скорее всего стек переполняется. Слишком много на бедную Мегу нагрузили.

Подключение дополниетельного датчика и работа с FLoat требует дополнительной памяти. Надо скетч оптимизировать по потребляемой RAM

Да там программы две строки в два ряда. ТС - поставьте эщо сериал.принт

Уважаемый, если вы посмотрите на начало скетча, то увидете там подключение большого количества толстых библиотек. 

А что касается "там программы две строки в два ряда", так и одной строкой можно всю память отожрать.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

asam]</p> <p>[quote=mykaida пишет:

Уважаемый, если вы посмотрите на начало скетча, то увидете там подключение большого количества толстых библиотек. 

А что касается "там программы две строки в два ряда", так и одной строкой можно всю память отожрать.

Да...а Извините, но не привык что п/п пишут идиоты....

Beevaa
Offline
Зарегистрирован: 11.01.2019

ты по делу можешь сказать, или слюни лить только можешь?))) то на строку посмотри, то код тебе маленький, ты внимательно прочитал все что я написал???))) куда, какие переменные отслеживать?))) какой Serial.print...?))) там все просто было, прописал Serial.setTimeout(). На 2 секунды и все… у принимающей УНО, и все прошло… т.к,у Serial.parseInt() если дольше 1 секунды ни чего не приходит возвращает значение 0… сопляк.

Модератор: предлагаю убавить эмоций.

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Beevaa пишет:

при прошивке пишет что паямти использовано 15% первой и 12% второй))) т

Так это статической, а при работе память еще динамически выделяется под разные нужды, вот ее и не хватает.

Попробуйте, например, один из шрифтов не использовать.

Или, лучше, уберите пока работу с SD cards