<?xml-stylesheet type="text/xsl" href="https://community.element14.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>MLX90640 Thermal Camera on Wio Terminal</title><link>/members-area/personalblogs/b/ralph-yamamoto-s-blog/posts/mlx90640-thermal-camera-on-wio-terminal</link><description>I&amp;#39;m want to use the MLX90640 Thermal Camera module from Adafruit with my Wio Terminal to make a diagnostic tool that I can use for thermal measurements. I tried out a module with a 55 degree FOV lens with Jupyter Notebooks on my PC Using the ML...</description><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>RE: MLX90640 Thermal Camera on Wio Terminal</title><link>https://community.element14.com/members-area/personalblogs/b/ralph-yamamoto-s-blog/posts/mlx90640-thermal-camera-on-wio-terminal</link><pubDate>Mon, 20 Feb 2023 10:52:39 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:708d3d7d-0871-46aa-bcbf-a49aa0c99b66</guid><dc:creator>Arshya</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Hi Ralph,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I am getting started with a project to use Seeed Studio Grove MLX90640 55 degree along with esp32 microcontroller. Not able to find a library for the camera breakout. Can you please guide me for the same?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Thanks,&lt;/p&gt;
&lt;p&gt;Arshya&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=22166&amp;AppID=330&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: MLX90640 Thermal Camera on Wio Terminal</title><link>https://community.element14.com/members-area/personalblogs/b/ralph-yamamoto-s-blog/posts/mlx90640-thermal-camera-on-wio-terminal</link><pubDate>Mon, 26 Sep 2022 17:12:27 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:708d3d7d-0871-46aa-bcbf-a49aa0c99b66</guid><dc:creator>tony1tf</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Hi Ralph&lt;/p&gt;
&lt;p&gt;Great project - thank you - I just got a Wio-terminal and had a MLX90640 Pimoroni breakout board. So I was looking into editing the example on the Seeed Studio page, when I came across this blog where you had already done the work. I&amp;#39;ve just modified your code to auto-scale on the max temperature, and post it here.&lt;/p&gt;
&lt;p&gt;Tony&lt;/p&gt;
&lt;p&gt;[embed:dc8ab71f-3b98-42d9-b0f6-e21e02a0f8e2:8588a4d5-369e-492a-95e1-799ea4741609:type=text&amp;text=%2F%2F%20Code%20from%20Wio_Terminal_MLX90640_noSprite.ino%20by%20Ralph%20Yamamoto%20on%20Element14%20personal%20blogs%0D%0A%2F%2F%20edit%20for%20Max%20temp%20tracking%20-%20Tony%2026%20Sept%202022%0D%0A%23include%20%3CWire.h%3E%0D%0A%23include%20%22MLX90640_API.h%22%0D%0A%23include%20%22MLX9064X_I2C_Driver.h%22%0D%0A%23include%20%3CTFT_eSPI.h%3E%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20Include%20the%20graphics%20library%20%28this%20includes%20the%20sprite%20functions%29%20%20%0D%0A%0D%0Aconst%20byte%20MLX90640_address%20%3D%200x33%3B%20%2F%2FDefault%207-bit%20unshifted%20address%20of%20the%20MLX90640%0D%0A%23define%20TA_SHIFT%208%20%2F%2FDefault%20shift%20for%20MLX90640%20in%20open%20air%0D%0A%23define%20debug%20%20Serial%0D%0Auint16_t%20eeMLX90640%5B832%5D%3B%0D%0Afloat%20MLX90640To%5B768%5D%3B%0D%0Auint16_t%20MLX90640Frame%5B834%5D%3B%0D%0AparamsMLX90640%20MLX90640%3B%0D%0Aint%20errorno%20%3D%200%3B%0D%0Afloat%20centretemp%3B%0D%0A%0D%0ATFT_eSPI%20%20%20%20tft%20%3D%20TFT_eSPI%28%29%3B%20%0D%0A%2F%2FTFT_eSprite%20Display%20%3D%20TFT_eSprite%28%26tft%29%3B%20%20%2F%2F%20Create%20Sprite%20object%20%22img%22%20with%20pointer%20to%20%22tft%22%20object%0D%0A%2F%2F%20the%20pointer%20is%20used%20by%20pushSprite%28%29%20to%20push%20it%20onto%20the%20TFT%0D%0A%0D%0Aunsigned%20long%20CurTime%3B%0D%0A%0D%0Auint16_t%20TheColor%3B%0D%0A%2F%2F%20start%20with%20some%20initial%20colors%0D%0Auint16_t%20MinTemp%20%3D%2015%3B%0D%0Auint16_t%20MaxTemp%20%3D%2020%3B%0D%0A%0D%0A%0D%0A%2F%2F%20variables%20for%20interpolated%20colors%0D%0Abyte%20red%2C%20green%2C%20blue%3B%0D%0A%0D%0A%2F%2F%20variables%20for%20row%2Fcolumn%20interpolation%0D%0Abyte%20i%2C%20j%2C%20k%2C%20row%2C%20col%2C%20incr%3B%0D%0Afloat%20intPoint%2C%20val%2C%20a%2C%20b%2C%20c%2C%20d%2C%20ii%3B%0D%0Abyte%20aLow%2C%20aHigh%3B%0D%0A%0D%0A%0D%0A%2F%2F%20size%20of%20a%20display%20%22pixel%22%0D%0Abyte%20BoxWidth%20%3D%203%3B%0D%0Abyte%20BoxHeight%20%3D%203%3B%0D%0A%0D%0A%0D%0Aint%20x%2C%20y%3B%0D%0Achar%20buf%5B20%5D%3B%0D%0A%0D%0A%2F%2F%20variable%20to%20toggle%20the%20display%20grid%0D%0Aint%20ShowGrid%20%3D%20-1%3B%0D%0A%0D%0A%2F%2F%20array%20for%20the%20interpolated%20array%0D%0Afloat%20HDTemp%5B6400%5D%3B%0D%0A%0D%0A%0D%0Avoid%20setup%28%29%20%7B%0D%0A%20%20%20%20Wire.begin%28%29%3B%0D%0A%20%20%20%20Wire.setClock%282000000%29%3B%20%2F%2FIncrease%20I2C%20clock%20speed%20to%202M%0D%0A%20%20%20%20debug.begin%28115200%29%3B%20%2F%2FFast%20debug%20as%20possible%0D%0A%2F%2F%20%20%20%20while%20%28%21debug%29%3B%20%20%2F%2F%20wait%20for%20terminal%0D%0A%20%20%20%20%0D%0A%20%20%20%20%2F%2F%20start%20the%20display%20and%20set%20the%20background%20to%20black%0D%0A%0D%0A%0D%0A%20%20%20%20if%20%28isConnected%28%29%20%3D%3D%20false%29%20%7B%0D%0A%20%20%20%20%20%20%20%20debug.println%28%22MLX90640%20not%20detected%20at%20default%20I2C%20address.%20Please%20check%20wiring.%20Freezing.%22%29%3B%0D%0A%20%20%20%20%20%20%20%20while%20%281%29%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20%2F%2FGet%20device%20parameters%20-%20We%20only%20have%20to%20do%20this%20once%0D%0A%20%20%20%20int%20status%3B%0D%0A%20%20%20%20status%20%3D%20MLX90640_DumpEE%28MLX90640_address%2C%20eeMLX90640%29%3B%0D%0A%20%20%20%20errorno%20%3D%20status%3B%2F%2FMLX90640_CheckEEPROMValid%28eeMLX90640%29%3B%2F%2FeeMLX90640%5B10%5D%20%26%200x0040%3B%2F%2F%0D%0A%20%20%20%20%0D%0A%20%20%20%20if%20%28status%20%21%3D%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20debug.println%28%22Failed%20to%20load%20system%20parameters%22%29%3B%0D%0A%20%20%20%20%20%20%20while%281%29%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%0D%0A%20%20%20%20status%20%3D%20MLX90640_ExtractParameters%28eeMLX90640%2C%20%26MLX90640%29%3B%0D%0A%20%20%20%20%2F%2Ferrorno%20%3D%20status%3B%0D%0A%20%20%20%20if%20%28status%20%21%3D%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20debug.println%28%22Parameter%20extraction%20failed%22%29%3B%0D%0A%20%20%20%20%20%20%20%20while%281%29%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%0D%0A%20%20%20%20%2F%2FOnce%20params%20are%20extracted%2C%20we%20can%20release%20eeMLX90640%20array%0D%0A%20%20%20%20%0D%0A%2F%2F%20%20%20%20MLX90640_SetRefreshRate%28MLX90640_address%2C%200x05%29%3B%20%2F%2FSet%20rate%20to%2016Hz%0D%0A%20%20%20%20MLX90640_SetRefreshRate%28MLX90640_address%2C%200x02%29%3B%20%2F%2FSet%20rate%20to%202Hz%0D%0A%0D%0A%0D%0A%20%20%20%20tft.begin%28%29%3B%0D%0A%20%20%20%20tft.setRotation%283%29%3B%0D%0A%20%20%20%20tft.fillScreen%28TFT_BLACK%29%3B%0D%0A%2F%2F%20%20%20%20Display.createSprite%28TFT_HEIGHT%2C%20TFT_WIDTH%29%3B%0D%0A%2F%2F%20%20%20%20Display.fillSprite%28TFT_BLACK%29%3B%20%0D%0A%0D%0A%0D%0A%20%20%20%20%2F%2F%20get%20the%20cutoff%20points%20for%20the%20color%20interpolation%20routines%0D%0A%20%20%20%20%2F%2F%20note%20this%20function%20called%20when%20the%20temp%20scale%20is%20changed%0D%0A%20%20%20%20Getabcd%28%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%2F%2F%20draw%20a%20legend%20with%20the%20scale%20that%20matches%20the%20sensors%20max%20and%20min%0D%0A%20%20%20%20DrawLegend%28%29%3B%20%20%0D%0A%20%20%20%20tft.fillRect%2815%2C%2015%2C%20210%2C%20210%2C%20TFT_BLUE%29%3B%20%20%0D%0A%7D%0D%0Avoid%20loop%28%29%20%7B%0D%0A%0D%0A%0D%0A%20%20%20%20%2F%2F%20draw%20a%20large%20white%20border%20for%20the%20temperature%20area%0D%0A%2F%2F%20%20%20%20tft.fillRect%2810%2C%2010%2C%20210%2C%20210%2C%20TFT_BLUE%29%3B%0D%0A%20%20%20%20for%20%28byte%20x%20%3D%200%20%3B%20x%20%3C%202%20%3B%20x%2B%2B%29%20%7B%0D%0A%20%20%20%20%20%20%20%20int%20status%20%3D%20MLX90640_GetFrameData%28MLX90640_address%2C%20MLX90640Frame%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%20%20%20%20float%20vdd%20%3D%20MLX90640_GetVdd%28MLX90640Frame%2C%20%26MLX90640%29%3B%0D%0A%20%20%20%20%20%20%20%20float%20Ta%20%3D%20MLX90640_GetTa%28MLX90640Frame%2C%20%26MLX90640%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%20%20%20%20float%20tr%20%3D%20Ta%20-%20TA_SHIFT%3B%20%2F%2FReflected%20temperature%20based%20on%20the%20sensor%20ambient%20temperature%0D%0A%20%20%20%20%20%20%20%20float%20emissivity%20%3D%200.95%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%20%20%20%20MLX90640_CalculateTo%28MLX90640Frame%2C%20%26MLX90640%2C%20emissivity%2C%20tr%2C%20MLX90640To%29%3B%0D%0A%20%20%20%20%7D%0D%0A%0D%0A%0D%0A%20%20%20%20interpolate_image%28MLX90640To%2C24%2C32%2CHDTemp%2C80%2C80%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%2F%2Fdisplay%20the%2080%20x%2080%20array%0D%0A%20%20%20%20DisplayGradient%28%29%3B%0D%0A%20%20%20%20%0D%0A%20%20%20%20%2F%2FCrosshair%20in%20the%20middle%20of%20the%20screen%0D%0A%20%20%20%20tft.drawCircle%28115%2C%20115%2C%205%2C%20TFT_WHITE%29%3B%0D%0A%20%20%20%20tft.drawFastVLine%28115%2C%20105%2C%2020%2C%20TFT_WHITE%29%3B%0D%0A%20%20%20%20tft.drawFastHLine%28105%2C%20115%2C%2020%2C%20TFT_WHITE%29%3B%0D%0A%20%20%20%20%2F%2FDisplaying%20the%20temp%20at%20the%20middle%20of%20the%20Screen%0D%0A%20%20%20%20%20%0D%0A%20%20%20%20%2F%2FPush%20the%20Sprite%20to%20the%20screen%0D%0A%2F%2F%20%20%20%20Display.pushSprite%280%2C%200%29%3B%0D%0A%0D%0A%20%20%20%20tft.setRotation%283%29%3B%0D%0A%20%20%20%20tft.setTextColor%28TFT_WHITE%29%3B%0D%0A%20%20%20%20centretemp%3DHDTemp%5B35%20%2A%2080%20%2B%2035%5D%2C%202%2C%2090%2C%2020%3B%0D%0A%20%20%20%20tft.drawFloat%28centretemp%2C2%2C90%2C20%29%3B%0D%0A%20%2F%2F%20%20%20tft.drawFloat%28HDTemp%5B35%20%2A%2080%20%2B%2035%5D%2C%202%2C%2090%2C%2020%29%3B%20%0D%0A%20%2F%2F%20Code%20added%20by%20Tony%2026%20Sep%202022%20for%20auto%20scaling%20of%20max%20temp%0D%0A%20%20%20%20if%20%28centretemp%20%3E%20MaxTemp%29%20%7B%0D%0A%20%20%20%20MaxTemp%3Dcentretemp%3B%20%0D%0A%20%20%20%20Getabcd%28%29%3B%0D%0A%20%20%20%20DrawLegend%28%29%3B%20%0D%0A%20%20%20%20%7D%20%20%0D%0A%20%20%20%20delay%28400%29%3B%0D%0A%7D%0D%0A%2F%2FReturns%20true%20if%20the%20MLX90640%20is%20detected%20on%20the%20I2C%20bus%0D%0Aboolean%20isConnected%28%29%20%7B%0D%0A%20%20%20%20Wire.beginTransmission%28%28uint8_t%29MLX90640_address%29%3B%0D%0A%20%20%20%20if%20%28Wire.endTransmission%28%29%20%21%3D%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20%28false%29%3B%20%20%20%20%2F%2FSensor%20did%20not%20ACK%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20return%20%28true%29%3B%0D%0A%7D%0D%0A%2F%2F%20function%20to%20display%20the%20results%0D%0Avoid%20DisplayGradient%28%29%20%7B%0D%0A%0D%0A%20%20tft.setRotation%284%29%3B%0D%0A%0D%0A%20%20%2F%2F%20rip%20through%2070%20rows%0D%0A%20%20for%20%28row%20%3D%200%3B%20row%20%3C%2070%3B%20row%20%2B%2B%29%20%7B%0D%0A%0D%0A%20%20%20%20%2F%2F%20fast%20way%20to%20draw%20a%20non-flicker%20grid--just%20make%20every%2010%20MLX90640To%202x2%20as%20opposed%20to%203x3%0D%0A%20%20%20%20%2F%2F%20drawing%20lines%20after%20the%20grid%20will%20just%20flicker%20too%20much%0D%0A%20%20%20%20if%20%28ShowGrid%20%3C%200%29%20%7B%0D%0A%20%20%20%20%20%20BoxWidth%20%3D%203%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20if%20%28%28row%20%25%2010%20%3D%3D%209%29%20%29%20%7B%0D%0A%20%20%20%20%20%20%20%20BoxWidth%20%3D%202%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20BoxWidth%20%3D%203%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20%2F%2F%20then%20rip%20through%20each%2070%20cols%0D%0A%20%20%20%20for%20%28col%20%3D%200%3B%20col%20%3C%2070%3B%20col%2B%2B%29%20%7B%0D%0A%0D%0A%20%20%20%20%20%20%2F%2F%20fast%20way%20to%20draw%20a%20non-flicker%20grid--just%20make%20every%2010%20MLX90640To%202x2%20as%20opposed%20to%203x3%0D%0A%20%20%20%20%20%20if%20%28ShowGrid%20%3C%200%29%20%7B%0D%0A%20%20%20%20%20%20%20%20BoxHeight%20%3D%203%3B%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20if%20%28%20%28col%20%25%2010%20%3D%3D%209%29%29%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20BoxHeight%20%3D%202%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%20%20else%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20BoxHeight%20%3D%203%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%20%20%2F%2F%20finally%20we%20can%20draw%20each%20the%2070%20x%2070%20points%2C%20note%20the%20call%20to%20get%20interpolated%20color%0D%0A%20%20%20%20%20%20tft.fillRect%28%28row%20%2A%203%29%20%2B%2015%2C%20%28col%20%2A%203%29%20%2B%2015%2C%20BoxWidth%2C%20BoxHeight%2C%20GetColor%28HDTemp%5Brow%20%2A%2080%20%2B%20col%5D%29%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%7D%0D%0A%20%20%7D%0D%0A%0D%0A%7D%0D%0A%2F%2F%20my%20fast%20yet%20effective%20color%20interpolation%20routine%0D%0Auint16_t%20GetColor%28float%20val%29%20%7B%0D%0A%0D%0A%20%20%2F%2A%0D%0A%20%20%20%20pass%20in%20value%20and%20figure%20out%20R%20G%20B%0D%0A%20%20%20%20several%20published%20ways%20to%20do%20this%20I%20basically%20graphed%20R%20G%20B%20and%20developed%20simple%20linear%20equations%0D%0A%20%20%20%20again%20a%205-6-5%20color%20display%20will%20not%20need%20accurate%20temp%20to%20R%20G%20B%20color%20calculation%0D%0A%0D%0A%20%20%20%20equations%20based%20on%0D%0A%20%20%20%20http%3A%2F%2Fweb-tech.ga-usa.com%2F2012%2F05%2Fcreating-a-custom-hot-to-cold-temperature-color-gradient-for-use-with-rrdtool%2Findex.html%0D%0A%0D%0A%20%20%2A%2F%0D%0A%0D%0A%20%20red%20%3D%20constrain%28255.0%20%2F%20%28c%20-%20b%29%20%2A%20val%20-%20%28%28b%20%2A%20255.0%29%20%2F%20%28c%20-%20b%29%29%2C%200%2C%20255%29%3B%0D%0A%0D%0A%20%20if%20%28%28val%20%3E%20MinTemp%29%20%26%20%28val%20%3C%20a%29%29%20%7B%0D%0A%20%20%20%20green%20%3D%20constrain%28255.0%20%2F%20%28a%20-%20MinTemp%29%20%2A%20val%20-%20%28255.0%20%2A%20MinTemp%29%20%2F%20%28a%20-%20MinTemp%29%2C%200%2C%20255%29%3B%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28%28val%20%3E%3D%20a%29%20%26%20%28val%20%3C%3D%20c%29%29%20%7B%0D%0A%20%20%20%20green%20%3D%20255%3B%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28val%20%3E%20c%29%20%7B%0D%0A%20%20%20%20green%20%3D%20constrain%28255.0%20%2F%20%28c%20-%20d%29%20%2A%20val%20-%20%28d%20%2A%20255.0%29%20%2F%20%28c%20-%20d%29%2C%200%2C%20255%29%3B%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28%28val%20%3E%20d%29%20%7C%20%28val%20%3C%20a%29%29%20%7B%0D%0A%20%20%20%20green%20%3D%200%3B%0D%0A%20%20%7D%0D%0A%0D%0A%20%20if%20%28val%20%3C%3D%20b%29%20%7B%0D%0A%20%20%20%20blue%20%3D%20constrain%28255.0%20%2F%20%28a%20-%20b%29%20%2A%20val%20-%20%28255.0%20%2A%20b%29%20%2F%20%28a%20-%20b%29%2C%200%2C%20255%29%3B%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28%28val%20%3E%20b%29%20%26%20%28val%20%3C%3D%20d%29%29%20%7B%0D%0A%20%20%20%20blue%20%3D%200%3B%0D%0A%20%20%7D%0D%0A%20%20else%20if%20%28val%20%3E%20d%29%20%7B%0D%0A%20%20%20%20blue%20%3D%20constrain%28240.0%20%2F%20%28MaxTemp%20-%20d%29%20%2A%20val%20-%20%28d%20%2A%20240.0%29%20%2F%20%28MaxTemp%20-%20d%29%2C%200%2C%20240%29%3B%0D%0A%20%20%7D%0D%0A%0D%0A%20%20%2F%2F%20use%20the%20displays%20color%20mapping%20function%20to%20get%205-6-5%20color%20palet%20%28R%3D5%20bits%2C%20G%3D6%20bits%2C%20B-5%20bits%29%0D%0A%20%20return%20tft.color565%28red%2C%20green%2C%20blue%29%3B%0D%0A%0D%0A%0D%0A%0D%0A%7D%0D%0A%0D%0A%2F%2F%20function%20to%20get%20the%20cutoff%20points%20in%20the%20temp%20vs%20RGB%20graph%0D%0Avoid%20Getabcd%28%29%20%7B%0D%0A%0D%0A%20%20a%20%3D%20MinTemp%20%2B%20%28MaxTemp%20-%20MinTemp%29%20%2A%200.2121%3B%0D%0A%20%20b%20%3D%20MinTemp%20%2B%20%28MaxTemp%20-%20MinTemp%29%20%2A%200.3182%3B%0D%0A%20%20c%20%3D%20MinTemp%20%2B%20%28MaxTemp%20-%20MinTemp%29%20%2A%200.4242%3B%0D%0A%20%20d%20%3D%20MinTemp%20%2B%20%28MaxTemp%20-%20MinTemp%29%20%2A%200.8182%3B%0D%0A%0D%0A%7D%0D%0Afloat%20get_point%28float%20%2Ap%2C%20uint8_t%20rows%2C%20uint8_t%20cols%2C%20int8_t%20x%2C%20int8_t%20y%29%0D%0A%7B%0D%0A%20%20%20%20if%20%28x%20%3C%200%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20x%20%3D%200%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20if%20%28y%20%3C%200%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20y%20%3D%200%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20if%20%28x%20%3E%3D%20cols%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20x%20%3D%20cols%20-%201%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20if%20%28y%20%3E%3D%20rows%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20y%20%3D%20rows%20-%201%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20return%20p%5By%20%2A%20cols%20%2B%20x%5D%3B%0D%0A%7D%0D%0A%0D%0A%0D%0Avoid%20set_point%28float%20%2Ap%2C%20uint8_t%20rows%2C%20uint8_t%20cols%2C%20int8_t%20x%2C%20int8_t%20y%2C%20float%20f%29%0D%0A%7B%0D%0A%20%20%20%20if%20%28%28x%20%3C%200%29%20%7C%7C%20%28x%20%3E%3D%20cols%29%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20if%20%28%28y%20%3C%200%29%20%7C%7C%20%28y%20%3E%3D%20rows%29%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20return%3B%0D%0A%20%20%20%20%7D%0D%0A%20%20%20%20p%5By%20%2A%20cols%20%2B%20x%5D%20%3D%20f%3B%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20src%20is%20a%20grid%20src_rows%20%2A%20src_cols%0D%0A%2F%2F%20dest%20is%20a%20pre-allocated%20grid%2C%20dest_rows%2Adest_cols%0D%0Avoid%20interpolate_image%28float%20%2Asrc%2C%20uint8_t%20src_rows%2C%20uint8_t%20src_cols%2C%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20float%20%2Adest%2C%20uint8_t%20dest_rows%2C%20uint8_t%20dest_cols%29%0D%0A%7B%0D%0A%20%20%20%20float%20mu_x%20%3D%20%28src_cols%20-%201.0%29%20%2F%20%28dest_cols%20-%201.0%29%3B%0D%0A%20%20%20%20float%20mu_y%20%3D%20%28src_rows%20-%201.0%29%20%2F%20%28dest_rows%20-%201.0%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20float%20adj_2d%5B16%5D%3B%20%2F%2F%20matrix%20for%20storing%20adjacents%0D%0A%0D%0A%0D%0A%20%20%20%20for%20%28uint8_t%20y_idx%20%3D%200%3B%20y_idx%20%3C%20dest_rows%3B%20y_idx%2B%2B%29%0D%0A%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20for%20%28uint8_t%20x_idx%20%3D%200%3B%20x_idx%20%3C%20dest_cols%3B%20x_idx%2B%2B%29%0D%0A%20%20%20%20%20%20%20%20%7B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20x%20%3D%20x_idx%20%2A%20mu_x%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20y%20%3D%20y_idx%20%2A%20mu_y%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20get_adjacents_2d%28src%2C%20adj_2d%2C%20src_rows%2C%20src_cols%2C%20x%2C%20y%29%3B%0D%0A%0D%0A%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20frac_x%20%3D%20x%20-%20%28int%29x%3B%20%2F%2F%20we%20only%20need%20the%20~delta~%20between%20the%20points%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20frac_y%20%3D%20y%20-%20%28int%29y%3B%20%2F%2F%20we%20only%20need%20the%20~delta~%20between%20the%20points%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20float%20out%20%3D%20bicubicInterpolate%28adj_2d%2C%20frac_x%2C%20frac_y%29%3B%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20set_point%28dest%2C%20dest_rows%2C%20dest_cols%2C%20x_idx%2C%20y_idx%2C%20out%29%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20p%20is%20a%20list%20of%204%20points%2C%202%20to%20the%20left%2C%202%20to%20the%20right%0D%0Afloat%20cubicInterpolate%28float%20p%5B%5D%2C%20float%20x%29%0D%0A%7B%0D%0A%20%20%20%20float%20r%20%3D%20p%5B1%5D%20%2B%20%280.5%20%2A%20x%20%2A%20%28p%5B2%5D%20-%20p%5B0%5D%20%2B%20x%20%2A%20%282.0%20%2A%20p%5B0%5D%20-%205.0%20%2A%20p%5B1%5D%20%2B%204.0%20%2A%20p%5B2%5D%20-%20p%5B3%5D%20%2B%20x%20%2A%20%283.0%20%2A%20%28p%5B1%5D%20-%20p%5B2%5D%29%20%2B%20p%5B3%5D%20-%20p%5B0%5D%29%29%29%29%3B%0D%0A%20%20%20%20return%20r%3B%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20p%20is%20a%2016-point%204x4%20array%20of%20the%202%20rows%20%26%20columns%20left%2Fright%2Fabove%2Fbelow%0D%0Afloat%20bicubicInterpolate%28float%20p%5B%5D%2C%20float%20x%2C%20float%20y%29%0D%0A%7B%0D%0A%20%20%20%20float%20arr%5B4%5D%20%3D%20%7B0%2C%200%2C%200%2C%200%7D%3B%0D%0A%20%20%20%20arr%5B0%5D%20%3D%20cubicInterpolate%28p%20%2B%200%2C%20x%29%3B%0D%0A%20%20%20%20arr%5B1%5D%20%3D%20cubicInterpolate%28p%20%2B%204%2C%20x%29%3B%0D%0A%20%20%20%20arr%5B2%5D%20%3D%20cubicInterpolate%28p%20%2B%208%2C%20x%29%3B%0D%0A%20%20%20%20arr%5B3%5D%20%3D%20cubicInterpolate%28p%20%2B%2012%2C%20x%29%3B%0D%0A%20%20%20%20return%20cubicInterpolate%28arr%2C%20y%29%3B%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20src%20is%20rows%2Acols%20and%20dest%20is%20a%204-point%20array%20passed%20in%20already%20allocated%21%0D%0Avoid%20get_adjacents_1d%28float%20%2Asrc%2C%20float%20%2Adest%2C%20uint8_t%20rows%2C%20uint8_t%20cols%2C%20int8_t%20x%2C%20int8_t%20y%29%0D%0A%7B%0D%0A%20%20%20%20%2F%2F%20pick%20two%20items%20to%20the%20left%0D%0A%20%20%20%20dest%5B0%5D%20%3D%20get_point%28src%2C%20rows%2C%20cols%2C%20x%20-%201%2C%20y%29%3B%0D%0A%20%20%20%20dest%5B1%5D%20%3D%20get_point%28src%2C%20rows%2C%20cols%2C%20x%2C%20y%29%3B%0D%0A%20%20%20%20%2F%2F%20pick%20two%20items%20to%20the%20right%0D%0A%20%20%20%20dest%5B2%5D%20%3D%20get_point%28src%2C%20rows%2C%20cols%2C%20x%20%2B%201%2C%20y%29%3B%0D%0A%20%20%20%20dest%5B3%5D%20%3D%20get_point%28src%2C%20rows%2C%20cols%2C%20x%20%2B%202%2C%20y%29%3B%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20src%20is%20rows%2Acols%20and%20dest%20is%20a%2016-point%20array%20passed%20in%20already%20allocated%21%0D%0Avoid%20get_adjacents_2d%28float%20%2Asrc%2C%20float%20%2Adest%2C%20uint8_t%20rows%2C%20uint8_t%20cols%2C%20int8_t%20x%2C%20int8_t%20y%29%0D%0A%7B%0D%0A%20%20%20%20float%20arr%5B4%5D%3B%0D%0A%20%20%20%20for%20%28int8_t%20delta_y%20%3D%20-1%3B%20delta_y%20%3C%203%3B%20delta_y%2B%2B%29%0D%0A%20%20%20%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20-1%2C%200%2C%201%2C%202%0D%0A%20%20%20%20%20%20%20%20float%20%2Arow%20%3D%20dest%20%2B%204%20%2A%20%28delta_y%20%2B%201%29%3B%20%2F%2F%20index%20into%20each%20chunk%20of%204%0D%0A%20%20%20%20%20%20%20%20for%20%28int8_t%20delta_x%20%3D%20-1%3B%20delta_x%20%3C%203%3B%20delta_x%2B%2B%29%0D%0A%20%20%20%20%20%20%20%20%7B%20%2F%2F%20-1%2C%200%2C%201%2C%202%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20row%5Bdelta_x%20%2B%201%5D%20%3D%20get_point%28src%2C%20rows%2C%20cols%2C%20x%20%2B%20delta_x%2C%20y%20%2B%20delta_y%29%3B%0D%0A%20%20%20%20%20%20%20%20%7D%0D%0A%20%20%20%20%7D%0D%0A%7D%0D%0A%0D%0A%0D%0A%2F%2F%20function%20to%20draw%20a%20legend%0D%0Avoid%20DrawLegend%28%29%20%7B%0D%0A%0D%0A%20%20%2F%2Fcolor%20legend%20with%20max%20and%20min%20text%0D%0A%20%20j%20%3D%200%3B%0D%0A%0D%0A%20%20float%20inc%20%3D%20%28MaxTemp%20-%20MinTemp%20%29%20%2F%20160.0%3B%0D%0A%0D%0A%20%20for%20%28ii%20%3D%20MinTemp%3B%20ii%20%3C%20MaxTemp%3B%20ii%20%2B%3D%20inc%29%20%7B%0D%0A%20%20%20%20tft.drawFastHLine%28260%2C%20200%20-%20j%2B%2B%2C%2030%2C%20GetColor%28ii%29%29%3B%0D%0A%20%20%7D%0D%0A%0D%0A%20%20tft.setTextSize%282%29%3B%0D%0A%20%20tft.setCursor%28245%2C%2020%29%3B%0D%0A%20%20tft.setTextColor%28TFT_WHITE%2C%20TFT_BLACK%29%3B%0D%0A%20%20sprintf%28buf%2C%20%22%252d%2F%252d%22%2C%20MaxTemp%2C%20%28int%29%20%28MaxTemp%20%2A%201.8%29%20%2B%2032%29%3B%0D%0A%20%20tft.print%28buf%29%3B%0D%0A%0D%0A%20%20tft.setTextSize%282%29%3B%0D%0A%20%20tft.setCursor%28245%2C%20210%29%3B%0D%0A%20%20tft.setTextColor%28TFT_WHITE%2C%20TFT_BLACK%29%3B%0D%0A%20%20sprintf%28buf%2C%20%22%252d%2F%252d%22%2C%20MinTemp%2C%20%28int%29%20%28MinTemp%20%2A%201.8%29%20%2B%2032%29%3B%0D%0A%20%20tft.print%28buf%29%3B%0D%0A%0D%0A%7D]&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=22166&amp;AppID=330&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: MLX90640 Thermal Camera on Wio Terminal</title><link>https://community.element14.com/members-area/personalblogs/b/ralph-yamamoto-s-blog/posts/mlx90640-thermal-camera-on-wio-terminal</link><pubDate>Thu, 11 Nov 2021 09:47:31 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:708d3d7d-0871-46aa-bcbf-a49aa0c99b66</guid><dc:creator>rsjawale24</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Very useful for detecting shorted components on a PCB. Commercial thermal cams are quite expensive, this one seems like a good DIY alternative to the commercial ones. &lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=22166&amp;AppID=330&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item><item><title>RE: MLX90640 Thermal Camera on Wio Terminal</title><link>https://community.element14.com/members-area/personalblogs/b/ralph-yamamoto-s-blog/posts/mlx90640-thermal-camera-on-wio-terminal</link><pubDate>Wed, 10 Nov 2021 16:19:02 GMT</pubDate><guid isPermaLink="false">93d5dcb4-84c2-446f-b2cb-99731719e767:708d3d7d-0871-46aa-bcbf-a49aa0c99b66</guid><dc:creator>genebren</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Very cool project!&amp;nbsp; I have been thinking a lot of building something similar to assist in monitoring heat in some of the projects/products that I build.&amp;nbsp; Thanks for sharing this information.&lt;/p&gt;&lt;img src="https://community.element14.com/aggbug?PostID=22166&amp;AppID=330&amp;AppType=Weblog&amp;ContentType=0" width="1" height="1"&gt;</description></item></channel></rss>