ЖК-дисплей 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 и печатной платой, чтобы проверить, произойдет ли это снова?
До следующих двух дней я буду признателен за любое предложение или помощь.
Большое спасибо.
@Soheil Paper, 👍0
Обсуждение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 (но я рекомендую использовать меньшую скорость передачи данных, если это возможно).
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Сокращение времени считывания показаний датчиков температуры DS18B20.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Как изменить разрешение DS18B20?
Если у вас есть проблемы с шумом интерфейса I2C, вам следует добавить более мощные подтягивающие резисторы к линиям (SDA и SCL). Например 4,7кОм или чуть меньше., @chrisl