Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*This is a project by Vrishak and Krishna Vemuri. This takes the temperature from the AMG8833 sensor and distance from HC-SR04. This corrects the temperature with the distance. Then, the pixels are shown on the SD card. The temperature is reported to NodeMcu, LCD, and SD card
- **************************************************************************
- This is a library for the AMG88xx GridEYE 8x8 IR camera
- This sketch makes a 64 pixel thermal camera with the GridEYE sensor
- and a 128x128 tft screen https://www.adafruit.com/product/2088
- Designed specifically to work with the Adafruit AMG88 breakout
- ----> http://www.adafruit.com/products/3538
- These sensors use I2C to communicate. The device's I2C address is 0x69
- Adafruit invests time and resources providing this open source code,
- please support Adafruit andopen-source hardware by purchasing products
- from Adafruit!
- Written by Dean Miller for Adafruit Industries.
- BSD license, all text above must be included in any redistribution
- ***************************************************************************/
- // هذه المكتبات التي يتم استدعاءها في بداية الكود لتسهل عملية كتابة الكود
- #include <Adafruit_GFX.h> // Core graphics library
- #include <Adafruit_ST7735.h> // Hardware-specific library
- #include <SPI.h>
- #include <LiquidCrystal_I2C.h>
- #include <Wire.h>
- #include <Adafruit_AMG88xx.h>
- #include <SR04.h>
- //#include <LiquidCrystal.h>
- #include <SD.h>
- // هذه تعريفات لأماكن اتصال الحساسات بالأردوينو
- #define TFT_CS 53 //chip select pin for the TFT screen
- #define TFT_RST 9 // you can also connect this to the Arduino reset
- // in which case, set this #define pin to 0!
- #define TFT_DC 8
- #define trig 12
- #define echo 11
- int cardpin = 10;
- //هذه أقل درجة يتم عرضها على الشاشة باللون الأزرق
- //low range of the sensor (this will be blue on the screen)
- #define MINTEMP 22
- //هذه أعلى درجة يتم عرضها على الشاشة باللون الأحمر
- //high range of the sensor (this will be red on the screen)
- #define MAXTEMP 34
- //هذا الأمر يقوم بتعريف عنصر حساس قياس المسافة ومكان اتصاله مع الأردوينو
- SR04 sr04 = SR04(echo, trig);
- //هذا الأمر يقوم بتعريف عنصر الشاشة الصغيرة لعرض الكلام وتحديد حجمها وعدد الأسطر وترميزها
- LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
- //LiquidCrystal lcd(27, 28, 29, 30, 31, 32);
- File file;
- // هذا متغير يتم استخدامه من عدة توابع يتم حفظ المسافة فيه
- long dist;
- // هذه مصفوفة تحتوي على جميع الألوان التي يمكن عرضها على الشاشة الحرارية
- //the colors we will be using
- const uint16_t camColors[] = {0x480F,
- 0x400F, 0x400F, 0x400F, 0x4010, 0x3810, 0x3810, 0x3810, 0x3810, 0x3010, 0x3010,
- 0x3010, 0x2810, 0x2810, 0x2810, 0x2810, 0x2010, 0x2010, 0x2010, 0x1810, 0x1810,
- 0x1811, 0x1811, 0x1011, 0x1011, 0x1011, 0x0811, 0x0811, 0x0811, 0x0011, 0x0011,
- 0x0011, 0x0011, 0x0011, 0x0031, 0x0031, 0x0051, 0x0072, 0x0072, 0x0092, 0x00B2,
- 0x00B2, 0x00D2, 0x00F2, 0x00F2, 0x0112, 0x0132, 0x0152, 0x0152, 0x0172, 0x0192,
- 0x0192, 0x01B2, 0x01D2, 0x01F3, 0x01F3, 0x0213, 0x0233, 0x0253, 0x0253, 0x0273,
- 0x0293, 0x02B3, 0x02D3, 0x02D3, 0x02F3, 0x0313, 0x0333, 0x0333, 0x0353, 0x0373,
- 0x0394, 0x03B4, 0x03D4, 0x03D4, 0x03F4, 0x0414, 0x0434, 0x0454, 0x0474, 0x0474,
- 0x0494, 0x04B4, 0x04D4, 0x04F4, 0x0514, 0x0534, 0x0534, 0x0554, 0x0554, 0x0574,
- 0x0574, 0x0573, 0x0573, 0x0573, 0x0572, 0x0572, 0x0572, 0x0571, 0x0591, 0x0591,
- 0x0590, 0x0590, 0x058F, 0x058F, 0x058F, 0x058E, 0x05AE, 0x05AE, 0x05AD, 0x05AD,
- 0x05AD, 0x05AC, 0x05AC, 0x05AB, 0x05CB, 0x05CB, 0x05CA, 0x05CA, 0x05CA, 0x05C9,
- 0x05C9, 0x05C8, 0x05E8, 0x05E8, 0x05E7, 0x05E7, 0x05E6, 0x05E6, 0x05E6, 0x05E5,
- 0x05E5, 0x0604, 0x0604, 0x0604, 0x0603, 0x0603, 0x0602, 0x0602, 0x0601, 0x0621,
- 0x0621, 0x0620, 0x0620, 0x0620, 0x0620, 0x0E20, 0x0E20, 0x0E40, 0x1640, 0x1640,
- 0x1E40, 0x1E40, 0x2640, 0x2640, 0x2E40, 0x2E60, 0x3660, 0x3660, 0x3E60, 0x3E60,
- 0x3E60, 0x4660, 0x4660, 0x4E60, 0x4E80, 0x5680, 0x5680, 0x5E80, 0x5E80, 0x6680,
- 0x6680, 0x6E80, 0x6EA0, 0x76A0, 0x76A0, 0x7EA0, 0x7EA0, 0x86A0, 0x86A0, 0x8EA0,
- 0x8EC0, 0x96C0, 0x96C0, 0x9EC0, 0x9EC0, 0xA6C0, 0xAEC0, 0xAEC0, 0xB6E0, 0xB6E0,
- 0xBEE0, 0xBEE0, 0xC6E0, 0xC6E0, 0xCEE0, 0xCEE0, 0xD6E0, 0xD700, 0xDF00, 0xDEE0,
- 0xDEC0, 0xDEA0, 0xDE80, 0xDE80, 0xE660, 0xE640, 0xE620, 0xE600, 0xE5E0, 0xE5C0,
- 0xE5A0, 0xE580, 0xE560, 0xE540, 0xE520, 0xE500, 0xE4E0, 0xE4C0, 0xE4A0, 0xE480,
- 0xE460, 0xEC40, 0xEC20, 0xEC00, 0xEBE0, 0xEBC0, 0xEBA0, 0xEB80, 0xEB60, 0xEB40,
- 0xEB20, 0xEB00, 0xEAE0, 0xEAC0, 0xEAA0, 0xEA80, 0xEA60, 0xEA40, 0xF220, 0xF200,
- 0xF1E0, 0xF1C0, 0xF1A0, 0xF180, 0xF160, 0xF140, 0xF100, 0xF0E0, 0xF0C0, 0xF0A0,
- 0xF080, 0xF060, 0xF040, 0xF020, 0xF800,
- };
- //هذا الأمر يقوم بتعريف عنصر الشاشة الحرارية ومكان اتصالها مع الأردوينو
- Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
- //هذا الأمر يقوم بتعريف عنصر الكاميرا الحرارية
- Adafruit_AMG88xx amg;
- //هذه متغيرات لتحديد حجم الكاميرا الحرارية
- unsigned long delayTime;
- float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
- uint16_t displayPixelWidth, displayPixelHeight;
- //هذا التابع يعمل لمرة واحد عند تشغيل الأردوينو
- void setup() {
- // هذا الأمر يقوم بفتح منفذ تسلسلي بين الأردوينو والكمبيوتر لحل الأخطاء وعرض البيانات التي يتم اتسقبالها من الحساسات
- Serial.begin(9600);
- Serial1.begin(9600);
- ////////////////////////////////////////////////////////////
- // هذه الأوامر تقوم بتشغيل الشاشة الصغيرة لعرض البيانات عليها
- ////////////////////////////////////////////////////////////
- lcd.init();
- lcd.init();
- lcd.backlight();
- ////////////////////////////////////////////////////////////
- //هذا الأمر يقوم بعرض جملة على شاشة الكمبيوتر توضح أن الكاميرا الحرارية متصلة
- Serial.println(F("AMG88xx thermal camera!"));
- ////////////////////////////////////////////////////////////
- //هذه الأوامر تقوم بتشغيل الشاشة الحرارية وتحديد طولها وعرضها
- ////////////////////////////////////////////////////////////
- tft.initR(INITR_144GREENTAB); // initialize ST7735S chip
- tft.fillScreen(ST7735_BLACK);
- displayPixelWidth = tft.width() / 8;
- displayPixelHeight = tft.height() / 8;
- //tft.setRotation(3);
- ////////////////////////////////////////////////////////////
- // هذا متغير يتم حفظ حالة الكاميرا الحرارية تعمل/لا تعمل
- bool status;
- //هذا الأمر يقوم بالتأكد من عمل الكاميرا الحرارية وعرض جملة الخطأ إذا كانت الكاميرا غير متصلة بشكل صحيح مع الأردوينو
- // default settings
- status = amg.begin();
- if (!status) {
- Serial.println("Could not find a valid AMG88xx sensor, check wiring!");
- while (1);
- }
- Serial.println("-- Thermal Camera Test --");
- //lcd.begin(16, 2);
- delay(100); // let sensor boot up
- /////////////////////////////////////////////////////////
- //هذه أوامر تختص بحفظ البيانات على كرت الذاكرة الخارجية
- /////////////////////////////////////////////////////////
- pinMode(cardpin, OUTPUT);
- if (!SD.begin(cardpin)) {
- Serial.println("SD card initialization failed");
- }
- if (SD.exists("data.txt")) {
- Serial.println("data.txt exists.");
- if (SD.remove("data.txt")) {
- Serial.println("Successfully removed file.");
- } else {
- Serial.println("Could not remove data file.");
- }
- }
- //////////////////////////////////////////////////////////
- }// END OF SETUP
- //هذا التابع يعمل بشكل مستمر بعد الانتهاء من عمل التابع الأول
- // يتكرر تنفيذ الأوامر بداخل هذا التابع إلى أن يتم توفيق عمل الأردوينو
- void loop() {
- //هذا الأمر يقوم بقراءة جميع النقاط الحرارية من الكاميرا
- //read all the pixels
- amg.readPixels(pixels);
- ////////////////////////////////////////////////////////////////////////////////
- //هذه الأوامر تقوم بعرض النقاط الحرارية على الشاشة الحرارية
- ////////////////////////////////////////////////////////////////////////////////
- float maxx = -99.9;
- for (int i = 0; i < AMG88xx_PIXEL_ARRAY_SIZE; i++) {
- uint8_t colorIndex = map(pixels[i], MINTEMP, MAXTEMP, 0, 255);
- colorIndex = constrain(colorIndex, 0, 255);
- //draw the pixels!
- tft.fillRect(displayPixelHeight * floor(i / 8), displayPixelWidth * (i % 8),
- displayPixelHeight, displayPixelWidth, camColors[colorIndex]);
- if (pixels[i] > maxx) {
- maxx = pixels[i];
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- // هذا الأمر يقوم بقياس المسافة من حساس المسافة ووضع النتيجة في المتغير dist المسافة تقاس بالـ(cm)
- dist = sr04.Distance();
- //هذه جملة شرطية اذا كانت المسافة أعلى من 40سم سيتم تنفيذ الأوامر التالية
- if (dist > 40) {
- // هذا الأمر يظهر على شاشة الكمبيوتر جملة "أقترب من الحساس"
- Serial.println("Come closer");
- // هذا الأمر يظهر على الشاشة الصغيرة جملة "أقترب من الحساس"
- lcd.print("Come closer");
- }
- else {
- //هذه جملة شرطية اذا كانت المسافة أقل من 6سم سيتم تنفيذ الأوامر التالية
- if (dist < 6) {
- // هذا الأمر يظهر على شاشة الكمبيوتر جملة "أبتعد عن الحساس"
- Serial.println("Go farther");
- // هذا الأمر يظهر على الشاشة الصغيرة جملة "أبتعد عن الحساس"
- lcd.print("Go farther");
- }
- // هذه الجملة الشرطية ستتنفذ إذا كانت المسافة أعلى من 6سم وأقل من 40سم سيتم تنفيذ الأوامر التالية
- else {
- // هذه الأوامر تظهر على شاشة الكمبيوتر المسافة بالـ(cm)
- Serial.print(dist);
- Serial.println(" cm");
- // هذه الأوامر تقوم بحساب درجة الحرارة بالدرجة المئوية
- float newmax = round((maxx + 5.25 + (dist / 9)) * 100);
- float new2 = newmax / 100;
- float degreesF = (new2);//(1.8*new2+32)*100;
- int intF = (int) degreesF;
- //هذا الأمر يقوم بعرض درجة الحرارة بالدرجة المئوية بفواصل عشرية على شاشة الكمبيوتر
- // مثال 36.24 درجة مئوية
- Serial.println(degreesF);
- //هذا الأمر يقوم بعرض درجة الحرارة بالدرجة المئوية بدون فواصل عشرية على شاشة الكمبيوتر
- //مثال 36 درجة مئوية
- Serial.println(intF);
- //هذا الأمر يقوم بتحديد محرف الكتابة على المحرف الأول في السطر الأول
- lcd.setCursor(0, 0);
- //lcd.print("Temp: "+String(degreesF/100));
- //هذا الأمر يقوم بعرض درجة الحرارة على الشاشة الصغيرة بعد تحويل درجة الحرارة الى مصفوفة محارف STRING
- lcd.print("Temp: " + String(degreesF));
- Serial1.println(intF);
- //هذا الأمر يقوم بتحديد محرف الكتابة على المحرف الأول في السطر الثاني
- lcd.setCursor(0, 1);
- //هذه جملة شرطية إذا كانت حرارة الشخص أقل من الحرارة هذه يتم تنفيذ الأوامر التالية
- //Degrees F is the degree measure without the decimal point.
- if (degreesF < 10040) {
- // هذا الأمر يظهر على الشاشة الصغيرة جملة "هذا الشخص سليم"
- lcd.print("Person is safe");
- }
- else {
- //هذه جملة شرطية إذا كانت حرارة الشخص أقل من الحرارة هذه يتم تنفيذ الأوامر التالية
- if (degreesF <= 10220) {
- // هذا الأمر يظهر على الشاشة الصغيرة جملة "إذهب إلى المنزل"
- lcd.print("Send person home");
- }
- //هذه جملة شرطية إذا كانت حرارة الشخص أعلى من الحرارة المذكورة في الشرط السابق يتم تنفيذ الأوامر التالية
- else {
- // هذا الأمر يظهر على الشاشة الصغيرة جملة "إذهب إلى الطوارئ"
- lcd.print("Person go to ER");
- }
- }
- ////////////////////////////////////////////////////////////////////////////////
- //هذه الأوامر تقوم بفتح ملف داخل كرت الذاكرة وتقوم بحفظ درجة الحرارة بداخله
- ////////////////////////////////////////////////////////////////////////////////
- file = SD.open("data.txt", FILE_WRITE);
- if (file) {
- String fulldata = "Temp: " + String(degreesF);
- file.println(fulldata);
- file.close();
- }
- else {
- // هذا الأمر يظهر على شاشة الكمبيوتر وجود خطأ في كتابة البيانات على كرت الذاكرة
- Serial.println("Error in writing data file");
- }
- ////////////////////////////////////////////////////////////////////////////////
- }
- }
- // هذا الأمر يقوم بتوقيف الكود لمدة 200 ميلي ثانية حتى يستقر المتحكم
- delay(200);
- //هذا الأمر يقوم بمسح المحتويات من الشاشة
- lcd.clear();
- }//END OF LOOP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement