I have one Ir temperature mlx90615 sensor based of this connection only used for mega2560 RX1&TX1) :
Which is connected to one Arduino 2560 mega with one LCD TFT 2.4 like this (Arduino mega2560 RX1 TX2 instead of Uno for mlx90615 connection and UNO 3.5V and Ground used to power supply the MLX90615):
So my problem is when i insert some new object in the seen area of Ir sensor the output halt for some second delay and don't show new value via serial point or LCD output.
it characteristic table via datasheet of mlx90615 sensor is :
I have use this source code on library for mlx90615 into my codes by this function:
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;
}
}
}
}
The total codes are here:
#include "LiquidCrystal.h"
#include <Adafruit_GFX.h> // Adafruit's core graphics library
#include <Adafruit_TFTLCD.h> // Adafruit's hardware-specific library
#include <TouchScreen.h> //Touchscreen library
///#include <Fonts/Org_01.h> //Include a different font
#include <EEPROM.h> //Include the EEPROM library to score the highscore
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
#include <TimeLib.h>
bool backsensed = false;
bool resetsensed = false;
// most mcufriend shields use these pins and Portrait mode:
uint8_t YP = A1; // must be an analog pin, use "An" notation!
uint8_t XM = A2; // must be an analog pin, use "An" notation!
uint8_t YM = 7; // can be a digital pin
uint8_t XP = 6; // can be a digital pin
#define TS_MINX 100
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
//Create the touchscreen object
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); //(data,data,data,data,sensitivity);
//Some of the tft pins
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
// Optional, used to reset the display
#define LCD_RESET A4
#define REDBAR_MINX 80
#define GREENBAR_MINX 130
#define BLUEBAR_MINX 180
#define BAR_MINY 30
#define BAR_HEIGHT 250
#define BAR_WIDTH 30
//Create the tft object
//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
// Define some TFT readable colour codes to human readable names
#define BLACK 0x0000
int BLUE = tft.color565(50, 50, 255);
#define DARKBLUE 0x0010
#define VIOLET 0x8888
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
int GREY = tft.color565(64, 64, 64);
#define GOLD 0xFEA0
#define BROWN 0xA145
#define SILVER 0xC618
#define LIME 0x07E0
int currentpcolour;
//Minimum and maximum pressure to sense the touch
#define MINPRESSURE 10
#define MAXPRESSURE 1000
#define DRAW_LOOP_INTERVAL 50 //The interval used instead of delay();
//Define the address used in the eeprom memory to store highscores
#define addr 0
int currentpage;
int currentWing; //Used to flap the wings
int flX, flY, fallRate; //Used to calculete and store the bird's position
int pillarPos, gapPosition; //Used tho draw the pillars
int score; //Store the score
int highScore = 0; //Store the highscore
bool running = false; //Store weather flying or not
bool crashed = false; //Store weather crashed or not
bool scrPress = false; //Store weather sensed some touch and store
long nextDrawLoopRunTime;
int redval;
int greenval;
int blueval;
int redpos = BAR_MINY + 12;
int greenpos = BAR_MINY + 12;
int bluepos = BAR_MINY + 12;
int oldrpos = redpos;
int oldgpos = greenpos;
int oldbpos = bluepos;
int x, y;
int lastDay = 0;
int lastMonth = 0;
int lastYear = 0;
int lastHour = 0;
int lastMinute = 0;
int lastSecond=0;
int movementTimer = 0;
int menuOptions = 4;
int menuOption = 0;
int alarmHours = 0;
//int Heater_alarmMinutes = 0;
//int Heater_alarmSecond=10;
//int Motor_alarmSecond=10;
//int Motor_alarmMinutes=0;
byte Heater_alarmMinutes_end ;
byte Heater_alarmSecond_end;
byte Motor_alarmSecond_end;
byte Motor_alarmMinutes_end;
bool heater_key = 0;
bool backLightOn = 1;
int fadeValue = 255;
byte address=0;
byte value;
bool state=1;
//#$############# MLX9615 ##################
unsigned char Re_buf[11],counter=0;
char sign=0;
float TO=0,TA=0;
void serialEvent();
//########################################
void DrawTriangle() {
int n, i, cx = tft.width() / 2 - 1, cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
n = min(cx, cy);
for (i = 0; i < n; i += 15) {
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(0, 0, i));
}
}
void drawHome()
{
tft.fillScreen(BLACK);
tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //Page border
tft.fillRoundRect(60, 180, 200, 40, 8, RED);
tft.drawRoundRect(60, 180, 200, 40, 8, WHITE); //Game
tft.fillRoundRect(60, 130, 200, 40, 8, RED); //RGB led
tft.drawRoundRect(60, 130, 200, 40, 8, WHITE);
tft.fillRoundRect(60, 80, 200, 40, 8, RED);
tft.drawRoundRect(60, 80, 200, 40, 8, WHITE); //Oscilloscope
tft.setCursor(60, 20);
tft.setTextSize(2);
/// tft.setFont();
tft.setTextColor(WHITE);
tft.print("Select on Option");
tft.setCursor(70, 50);
tft.setTextSize(2);
tft.setTextColor(LIME);
tft.print("GSH.ir");
tft.setTextColor(BLACK);
tft.setCursor(80, 95);
tft.print("Heater Setting");
tft.setCursor(80, 145);
tft.print("Motor Setting");
tft.setCursor(70, 195);
tft.print(" Start");
//tft.drawCircle(30, 30, 20, RED);
//tft.fillCircle(111, 111, 30, WHITE);
// delay(500);
//tft.drawRoundRect(120, 192, 60, 64, 15, YELLOW);
// tft.fillRoundRect(0, 192, 60, 64, 15, CYAN);
// tft.drawRect(0, 0, 60, 64, CYAN);
// tft.fillRect(180, 192, 60, 64, GREY);
//DrawTriangle();
}
void drawstart(bool k)
{
tft.fillScreen(BLACK);
tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //Page border
// tft.fillRoundRect(60, 180, 200, 40, 8, RED);
// tft.drawRoundRect(60, 180, 200, 40, 8, WHITE); //Game
//
// tft.fillRoundRect(60, 130, 200, 40, 8, RED); //RGB led
// tft.drawRoundRect(60, 130, 200, 40, 8, WHITE);
//
tft.fillRoundRect(90, 60, 160, 60, 18, RED);
tft.drawRoundRect(90, 60, 160, 60, 18, WHITE); //Oscilloscope
tft.setCursor(40, 180);
tft.setTextSize(3);
/// tft.setFont();
tft.setTextColor(WHITE);
if (k) {
tft.print("Motor on time");
}else{
tft.print("Heater on time");
}
}
void drawMenu(bool k)
{
tft.fillScreen(BLACK);
tft.drawRoundRect(0, 0, 319, 240, 8, WHITE); //Page border
// tft.fillRoundRect(60, 180, 200, 40, 8, RED);
// tft.drawRoundRect(60, 180, 200, 40, 8, WHITE); //Game
//
// tft.fillRoundRect(60, 130, 200, 40, 8, RED); //RGB led
// tft.drawRoundRect(60, 130, 200, 40, 8, WHITE);
//
// tft.fillRoundRect(75, 80, 160, 60, 18, BLUE);
// tft.drawRoundRect(700, 60, 160, 80, 18, WHITE); //Oscilloscope
//tft.fillTriangle(60,60,20,120,180,180,RED);
tft.fillRoundRect(70, 75, 180, 70, 18, GREEN);
//tft.fillTriangle(42, 20, 42, 60, 90, 40, RED);
tft.fillTriangle(260,90, 260, 130, 300, 110, RED);
tft.fillTriangle(60,90, 60, 130, 20, 110, RED);
tft.setCursor(45, 180);
tft.setTextSize(2.95);
/// tft.setFont();
tft.setTextColor(WHITE);
if (k) {
tft.print("Motor Timer Setting");
}else{
tft.print("Heater Timer Setting");
}
// tft.fillRoundRect(5, 5, 80, 60, 8, WHITE);
// delay(70);
tft.setTextSize(4);
tft.fillRoundRect(5, 5, 80, 60, 8, RED);
tft.drawRoundRect(5, 5, 80, 60, 8, WHITE);
tft.setCursor(20,20);
tft.print("<-");
tft.fillRoundRect(230, 5, 85, 60, 8, BLUE);
tft.drawRoundRect(230, 5, 85, 60, 8, WHITE);
tft.setCursor(250, 20);
tft.print("OK");
}
void start(){
tft.fillScreen(BLACK);
drawstart(0);
setTime(0, 0, 1, 20, 1, 2013); // hour, min, sec, day, month, year
lastHour = hour();
//check for heater key pressed
heater_key=1;state =1;
while (state ){
if ( lastSecond!=second())
{
lastMinute = minute();
lastSecond=second();
tft.setTextSize(6);
tft.fillRoundRect(60, 60, 200, 100, 18, RED);
//tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setCursor(110, 85);
tft.print(lastMinute);
tft.setCursor(140,85);
tft.print(":");
tft.setCursor(170, 85);
tft.print(lastSecond);
//delay(1000);
}
if (heater_key)
{
// alarm set
if ((Heater_alarmSecond_end <= lastSecond) && (Heater_alarmMinutes_end == lastMinute))
{
state=0;
digitalWrite(A5, LOW);
}
if ((Heater_alarmSecond_end >= lastSecond) || (Heater_alarmMinutes_end >= lastMinute))
{
//sound alarm
digitalWrite(A5, HIGH);
//setOffAlarm();
}
}
}
drawstart(1);
state =1;
setTime(0, 0, 0, 20, 1, 2013); // hour, min, sec, day, month, year
while (state){
if ( lastSecond!=second())
{
lastMinute = minute();
lastSecond=second();
tft.setTextSize(6);
tft.fillRoundRect(60, 60, 200, 100, 18, RED);
//tft.fillScreen(BLACK);
tft.setTextColor(WHITE);
tft.setCursor(110, 85);
tft.print(lastMinute);
tft.setCursor(140,85);
tft.print(":");
tft.setCursor(170, 85);
tft.print(lastSecond);
//delay(1000);
}
if (1)
{
// alarm set
if ((Motor_alarmSecond_end <= lastSecond) && (Motor_alarmMinutes_end == lastMinute))
{
state=0;
digitalWrite(A6, LOW);
}
if ((Motor_alarmSecond_end >= lastSecond) || (Motor_alarmMinutes_end >= lastMinute))
{
//sound alarm
digitalWrite(A6, HIGH);
//setOffAlarm();
}
}
}
//########### MLX90615 @#############
char i=0,sum=0;
// for (i=0;i<100;i++){
score=1;
while(score==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;
if ((int)TO>=30){
score=0;
}
tft.setTextSize(3);
Serial.print("TO:");
Serial.println(TO);
tft.fillScreen(BLACK);
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);
}
}
}
//####################
delay(100);
drawHome();
return;
}
void menu(){
// drawMenu();
TSPoint p = ts.getPoint(); // Read touchscreen
state =1;
// while(state){
// if (p.z > MINPRESSURE && p.z < MAXPRESSURE)
if (p.z > 10 && p.z < 1000)
{
tft.setTextSize(3);
tft.setTextColor(RED);
tft.setCursor(10, 10);
tft.print(p.x);
delay(500);
/* if (p.y > 743 && p.x < 247 && p.x > 150 && p.y < 875)
{
tft.fillRoundRect(5, 5, 50, 30, 8, WHITE);
delay(70);
tft.fillRoundRect(5, 5, 50, 30, 8, BLUE);
tft.drawRoundRect(5, 5, 50, 30, 8, WHITE);
tft.setCursor(15, 15);
tft.print("<-");
delay(70);
tft.fillRoundRect(5, 5, 50, 30, 8, BLACK);
currentpage = 0;
drawHome();
p.x = 160;
p.y = 760;
return;
}
if (p.x > 736 && p.x < 855 && p.y > 255 && p.y < 725 )
{
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(10, 10);
tft.print("UP2");
delay(500);
}
x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0) + 30;
//tft.fillTriangle(250,90, 250, 130, 290, 110, RED);
// tft.fillTriangle(60,90, 60, 130, 20, 110, RED);
if (y > 70 && y < 130)
{
if (x > 20 && x < 120)
{
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(50, 140);
tft.print("DOWN");
}
if (x > 220 && x < 320)
{
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(50, 140);
tft.print("UP");
}
}
*/
}
// }
}
////########## MLX90615 #############
//void serialEvent(){
// while (Serial1.available()) {
// Re_buf[counter]=(unsigned char)Serial1.read();
// if(counter==0&&Re_buf[0]!=0x5A) return;
// counter++;
// if(counter==9)
// {
// counter=0;
// sign=1;
// }
// }
//}
////########################
// initialize the library by providing the nuber of pins to it
LiquidCrystal lcd(8,9,4,5,6,7);
void setup()
{
time_t t = now(); // store the current time in time variable t
pinMode(A5, OUTPUT);pinMode(A6, OUTPUT);
tft.reset();
tft.begin(tft.readID());
// Serial.begin(9600);
// Serial.println();
// Serial.print("reading id...");
// delay(500);
// Serial.println(tft.readID(), HEX);
tft.fillScreen(BLACK);
tft.setRotation(1);
currentpage = 0;
tft.setTextSize(3);
tft.setTextColor(WHITE);
tft.setCursor(50, 140);
tft.print("Loading...");
tft.setTextColor(tft.color565(255, 255, 0));
tft.setCursor(30, 70);
tft.print("By:");
tft.setCursor(30, 100);
tft.print("NotesPoint.com GSH.IR");
for (int i; i < 250; i++)
{
tft.fillRect(BAR_MINY - 10, BLUEBAR_MINX, i, 10, RED);
delay(0.000000000000000000000000000000000000000000000000001);
}
tft.fillScreen(BLACK);
score=14;
if (EEPROM.read(1)==score){
address=2;
tft.setCursor(300, 100);
tft.print("eeprom writed beffor");
Heater_alarmSecond_end = EEPROM.read(address);
Heater_alarmMinutes_end= EEPROM.read(address+1);
Motor_alarmSecond_end = EEPROM.read(address+2);
Motor_alarmMinutes_end = EEPROM.read(address+3);
}
else{
tft.setCursor(300, 100);
tft.print("new eeprom");
address=1;
EEPROM.write(address,14);
EEPROM.write(address+1,10);
EEPROM.write(address+2,4);
EEPROM.write(address+3,10);
EEPROM.write(address+4,0);
address=1;
Heater_alarmSecond_end = EEPROM.read(address);
Heater_alarmMinutes_end= EEPROM.read(address+1);
Motor_alarmSecond_end = EEPROM.read(address+2);
Motor_alarmMinutes_end = EEPROM.read(address+3);
}
delay(100);
drawHome();
setTime(0, 0, 0, 20, 1, 2013); // hour, min, sec, day, month, year
//########### MLX90615 ############
Serial1.begin(115200);Serial.begin(115200);
delay(1);
// Serial1.write(0XA5);
// Serial1.write(0X45);
// Serial1.write(0XEA);
Serial.write(0XA5);
Serial1.write(0XA5);
Serial1.write(0X15);
Serial1.write(0XBA);
//buadrate 115200
Serial1.write(0XA5);
Serial1.write(0XAF);
Serial1.write(0X54);
//#############################
}
//void setup() {
//
//lcd.begin(16,2);
//
//// set cursor position to start of first line on the LCD
//lcd.setCursor(0,0);
////text to print
//lcd.print(" 16x2 LCD");
//// set cusor position to start of next line
//lcd.setCursor(0,1);
//lcd.print(" DISPLAY");
// Serial1.begin(115200);
// Serial.begin(115200);
// delay(1);
// Serial1.write(0XA5);
// Serial1.write(0X45);
// Serial1.write(0XEA);
//}
void loop() {
//
//
//
char cc,i=0,sum=0;
// digitalWrite(13, HIGH);
TSPoint p = ts.getPoint(); // Read touchscreen
// digitalWrite(13, LOW);
pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);
// score=1;
// while(score==1){
for(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;
}
}
}
}
So has anybody this problem with this kind of sensors or other sensors?and why this happened?
Update:
Based of this site i have combined the blinky and mlx90615 uart sample code, and it's working without freeze, the code is shown below:
unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
float TO=0,TA=0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(115200);
delay(1);
Serial.write(0XA5);
Serial.write(0X45);
Serial.write(0XEA);
}
void loop() {
unsigned char i=0,sum=0;
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(50);
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);
}
}
}
void serialEvent() {
while (Serial.available()) {
Re_buf[counter]=(unsigned char)Serial.read();
if(counter==0&&Re_buf[0]!=0x5A) return;
counter++;
if(counter==9)
{
counter=0;
sign=1;
}
}
}
I have read this queston: Hardware Serial causes hang-up and i think its related to I2C comunication with TFT LCD by this:
I think I found the solution. As you can see on the photo above, I used unscreened wires in comparison with the Breadboard. I2C is definitely very sensitive against EMP, which causes the bus freezes. I now use screened wires and don´t use the Breadboard anymore. The issue now occurs very rarely. Unfortunately I still don´t understand the interdependency to the UART interface. I will now improve the screening of my wireing. Hopefully, the breakdowns will totaly diappear.
Re: Hardware Serial causes hang-up Summary: My final solution, after weeks of detective work is, to use another sensor board. :smiley-fat: Obviously the ADXL 345 together with connected UART, provoked by EMP is the problem. I still don´t know why, but now, using the 10DOF GY-86 board with the MCU5060 IMU, it runs stable in a longtime test, for over 60 hours! No more freeze!!! I hope this will help someone having similar problems!
Now it the end of week and i will go to holiday so i wil try newx two days by 16X2 Crystal LCD and printed board to check will it happen again?
Until next two days i will appriciate any sugestion or help.
Thanks a lot.