ЖК-дисплей I2C TFT с последовательной связью UART для MLX90615 ИК-термометр замораживания ИК-выход

У меня есть один инфракрасный датчик температуры mlx90615, основанный на этом подключении, который используется только для mega2560 RX1 и TX1):

Который подключен к одному Arduino 2560 mega с одним ЖК-дисплеем TFT 2.4, как этот (Arduino mega2560 RX1 TX2 вместо Uno для подключения mlx90615 и UNO 3,5 В и заземление, используемые для питания MLX90615):

Итак, моя проблема заключается в том, что когда я вставляю какой-либо новый объект в видимую область инфракрасного датчика, вывод останавливается на несколько секунд и не показывает новое значение через последовательный порт или вывод на ЖК-дисплей.

Это таблица характеристик через техническое описание датчика mlx90615. :

Я использовал этот исходный код библиотеки для mlx90615 в своих кодах с помощью этой функции:

или (i=0;i<8i++){
я=1;
серийное событие();
если (знак)
{
знак=0;
для (i=0;i<8;i++)
сумма+=Re_buf[i];
если (сумма==Re_buf[i] )
{
TO=(float)(Re_buf[4]<<8|Re_buf[5])/100;
// Serial.print("КОМУ:");
// Serial.println(TO);
// TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
// Serial.print("ТА:");
// Serial.println(TA);
             
tft.fillScreen (ЧЕРНЫЙ);
tft.setTextColor(БЕЛЫЙ);
tft.setTextSize (3);
Serial.print("КОМУ:");
Серийный.println(TO);
            
tft.setCursor(10, 15);
tft.print("Температура:");
tft.setCursor(10, 50);
tft.print(К);
tft.setCursor(100, 30);tft.print("C");
TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
Serial.print("ТА:");
Serial.println(TA);
задержка(100);
}
}

}


недействительным серийным событием () {
символ я;
Serial1.write(0XA5);
Serial1.write(0X15);
Serial1.write(0XBA);
для (i=0;i<30;i++)
{
пока (Serial1.доступно()) {
  
Re_buf[counter]=(unsigned char)Serial1.read();
if(counter==0&&Re_buf[0]!=0x5A) return;
счетчик++;
если (счетчик == 9)
{
счетчик=0;я=600;
знак=1;
}
}
}
}

Все коды здесь:


or(i=0;i<8;i++){
  i=1;
 serialEvent();
  if(sign)
  {
     sign=0;
     for(i=0;i<8;i++)
      sum+=Re_buf[i];
     if(sum==Re_buf[i] )
     {
           TO=(float)(Re_buf[4]<<8|Re_buf[5])/100;
//           Serial.print("TO:");
//           Serial.println(TO);
//           TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
//           Serial.print("TA:");
//           Serial.println(TA);
             
             tft.fillScreen(BLACK);
             tft.setTextColor(WHITE);
             tft.setTextSize(3);
             Serial.print("TO:");
             Serial.println(TO);
            
            tft.setCursor(10, 15);
            tft.print("Temprature :");
            tft.setCursor(10, 50);
            tft.print(TO);
            tft.setCursor(100, 30);tft.print("C");
             TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
             Serial.print("TA:");
             Serial.println(TA);
             delay(100);
   }
  }

 }


void serialEvent(){ 
  char i;
  Serial1.write(0XA5);
  Serial1.write(0X15);
  Serial1.write(0XBA);
  for (i=0;i<30;i++)
  {
    while (Serial1.available()) {
  
    Re_buf[counter]=(unsigned char)Serial1.read();
    if(counter==0&&Re_buf[0]!=0x5A) return;
    counter++;
    if(counter==9)
    {
       counter=0;i=600;
       sign=1;
    }
  }
  }
}

Имеются ли у кого-нибудь проблемы с датчиками такого типа или другими датчиками? И почему это произошло?

Обновление:

Основываясь на этом сайте, я объединил пример кода blinky и mlx90615 uart, и он работает без зависаний, код показан ниже:


беззнаковый символ Re_buf[11],counter=0;
знак беззнакового символа = 0;
float ТО=0,ТА=0;
недействительная установка () {
pinMode (LED_BUILTIN, ВЫХОД);
Серийный.начать(115200);
задержка (1);
Серийный.запись(0XA5);
Серийный.запись(0X45);
Серийный.записать(0XEA);
}
 
недействительный цикл () {
беззнаковый символ i=0,sum=0;
цифровая запись (LED_BUILTIN, ВЫСОКАЯ); // включаем светодиод (HIGH - уровень напряжения)
задержка(50); // ждем секунду
цифровая запись (LED_BUILTIN, НИЗКИЙ); // выключаем светодиод, понижая напряжение
задержка(50);
если (знак)
{
знак=0;
для (i=0;i<8;i++)
сумма+=Re_buf[i];
если (сумма==Re_buf[i] )
{
TO=(float)(Re_buf[4]<<8|Re_buf[5])/100;
Serial.print("КОМУ:");
Серийный.println(TO);
TA=(float)(Re_buf[6]<<8|Re_buf[7])/100;
Serial.print("ТА:");
Serial.println(TA);
}
}
 
}
недействительным серийным событием () {
в то время как (серийный.доступный()) {
Re_buf[counter]=(unsigned char)Serial.read();
if(counter==0&&Re_buf[0]!=0x5A) return;
счетчик++;
если (счетчик == 9)
{
счетчик=0;
знак=1;
}
}
}

Я прочитал этот вопрос: Hardware Serial вызывает зависание и думаю, что это связано с I2C связь с TFT LCD следующим образом:

Кажется, я нашел решение. Как вы можете видеть на фото выше, я использовались неэкранированные провода по сравнению с макетной платой. I2C это определенно очень чувствителен к ЭМИ, из-за которого шина зависает. я теперь используйте экранированные провода и больше не используйте макетную плату. Проблема сейчас встречается очень редко. К сожалению, я до сих пор не понимаю, взаимозависимость с интерфейсом UART. теперь буду улучшать проверка моей проводки. Надеюсь поломки будут полными исчезнуть.

Re: Аппаратный серийный номер вызывает зависание Резюме: Мое окончательное решение после нескольких недель детективной работы — использовать другую сенсорную плату. :смайл-жир: Очевидно, ADXL 345 вместе с подключенным UART, вызванным ЭМИ это проблема. Я до сих пор не знаю почему, но теперь, используя 10DOF GY-86 плата с IMU MCU5060, она стабильно работает в длительном тесте, для более 60 часов! Больше никаких заморочек!!! Я надеюсь, что это поможет кому-то, у кого есть похожие проблемы!

Сейчас конец недели, и я поеду в отпуск, так что я попробую newx два дня с 16X2 Crystal LCD и печатной платой, чтобы проверить, произойдет ли это снова?

До следующих двух дней я буду признателен за любое предложение или помощь.

Большое спасибо.

, 👍0

Обсуждение

Если у вас есть проблемы с шумом интерфейса I2C, вам следует добавить более мощные подтягивающие резисторы к линиям (SDA и SCL). Например 4,7кОм или чуть меньше., @chrisl


1 ответ


1

TBH, я много раз читал ваш вопрос, но так и не понял, в чем ваша проблема. Я вижу следующее:

  • Вы предоставили изображение с проводкой для Arduino Uno, а не для Arduino Mega. Если вы используете экран LCD TFT, предназначенный для I2C и Arduino Uno, он не будет работать на Mega — эта плата имеет I2C на выводах 20 (SDA) и 21 (SCL), а не Uno на выводах A4 (SDA) и A5 (SCL). ). Но я предполагаю, что экран LCD TFT использует SPI, а не I2C. Даже если это SPI, он тоже не будет работать (опять же, другая распиновка).
  • Вы используете HW Serial #1 для отладки, а также для связи с датчиком. Это может быть источником ваших проблем. Используйте другой серийный номер аппаратного обеспечения для отладки (рекомендуется №1) и другой для связи с датчиком (например, серийный номер №2). Arduino Mega имеет 3 последовательных интерфейса HW. Если вы используете Uno, а не Mega, используйте SoftwareSerial (но я рекомендую использовать меньшую скорость передачи данных, если это возможно).
,