Arduino и датчик температуры термопары на основе MAX6675
- Войдите на сайт для отправки комментариев
Чт, 23/05/2019 - 22:23
Добрый день!
Столкнулся вот с таким скетчем:
#include "U8glib.h" #include <SPI.h> #include <Wire.h> #include "max6675.h" boolean centigrade = true; // по шкале Цельсия // boolean centigrade = false; // о шкале Фаренгейта // настроить объект u8g U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C double max = 215; // Максимальная температура double min = -215; // Минимальная температура float currentTemp = 0.00; String thisTemp = ""; int maxTemp = 0; // Максимальная температура достигнута int minTemp = 0; // Минимальная температура достигнута int pad = 0; // Модуль термопары MAX6675 int thermoDO = 4; int thermoCS = 5; int thermoCLK = 6; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); int vccPin = 3; int gndPin = 2; void draw(void) { u8g.setFont(u8g_font_profont12); u8g.drawStr(20, 10, "Temperature"); u8g.setFont(u8g_font_profont12); // Показать максимальную достигнутую температуру u8g.drawStr(10, 25, "max"); if (maxTemp <= int(currentTemp)) { maxTemp = int(currentTemp); } thisTemp = String(maxTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* maxTempC = (const char*) thisTemp.c_str(); u8g.drawStr(30, 25, maxTempC); // Показать минимально достигнутую температуру u8g.drawStr(70, 25, "min"); if (minTemp >= int(currentTemp)) { minTemp = int(currentTemp); } thisTemp = String(minTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* minTempC = (const char*) thisTemp.c_str(); u8g.drawStr(90, 25, minTempC); u8g.setFont(u8g_font_profont29); if (currentTemp > 99) { pad = 2; } if (currentTemp > 9 && currentTemp < 100) { pad = 10; } if (currentTemp < 10) { pad = 18; } thisTemp = String(currentTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* newDispC = (const char*) thisTemp.c_str(); u8g.drawStr(pad, 50, newDispC); } void setup(void) { pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); Serial.begin(9600); // Последовательная передача данных Wire.begin(); delay(500); // Время стабилизации if (centigrade) { currentTemp = thermocouple.readCelsius(); minTemp = int(thermocouple.readCelsius()); maxTemp = int(thermocouple.readCelsius()); } else { currentTemp = thermocouple.readFahrenheit(); minTemp = int(thermocouple.readFahrenheit()); maxTemp = int(thermocouple.readFahrenheit()); } } void loop(void) { currentTemp = 0; for (int f = 0; f < 25; f++) { if (centigrade) { currentTemp = thermocouple.readCelsius() + currentTemp; } else { currentTemp = thermocouple.readFahrenheit() + currentTemp; } } currentTemp = currentTemp / 25; // Усредняем 25 считываний // Draw u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(50); // Время обновления }
Решил повторить подвиг автора кода, но столкнулся с проблемой, которая заключается в том, что в наличии у меня есть всё, кроме необходимого дисплея. В наличии лишь OLED дисплей 1.30" 128x64, SPI, SH1106.
Что я предпринял:
1. Поменял библиотеку (#include <Adafruit_SSD1306.h>)
2. Выставил необходимые пины
#define OLED_MOSI 12 #define OLED_CLK 13 #define OLED_DC 10 #define OLED_CS 9 #define OLED_RESET 11
В общем, накуралесил примерное на вот такое:
#include <Adafruit_SSD1306.h> #include <splash.h> #include <SPI.h> #include <Wire.h> #include "max6675.h" boolean centigrade = true; // по шкале Цельсия // boolean centigrade = false; // о шкале Фаренгейта // настроить объект u8g //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C #define OLED_MOSI 12 #define OLED_CLK 13 #define OLED_DC 10 #define OLED_CS 9 #define OLED_RESET 11 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); double max = 215; // Максимальная температура double min = -215; // Минимальная температура float currentTemp = 0.00; String thisTemp = ""; int maxTemp = 0; // Максимальная температура достигнута int minTemp = 0; // Минимальная температура достигнута int pad = 0; // Модуль термопары MAX6675 int thermoDO = 4; int thermoCS = 5; int thermoCLK = 6; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); int vccPin = 3; int gndPin = 2; void draw(void) { u8g.setFont(u8g_font_profont12); u8g.drawStr(20, 10, "Temperature"); u8g.setFont(u8g_font_profont12); // Показать максимальную достигнутую температуру u8g.drawStr(10, 25, "max"); if (maxTemp <= int(currentTemp)) { maxTemp = int(currentTemp); } thisTemp = String(maxTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* maxTempC = (const char*) thisTemp.c_str(); u8g.drawStr(30, 25, maxTempC); // Показать минимально достигнутую температуру u8g.drawStr(70, 25, "min"); if (minTemp >= int(currentTemp)) { minTemp = int(currentTemp); } thisTemp = String(minTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* minTempC = (const char*) thisTemp.c_str(); u8g.drawStr(90, 25, minTempC); u8g.setFont(u8g_font_profont29); if (currentTemp > 99) { pad = 2; } if (currentTemp > 9 && currentTemp < 100) { pad = 10; } if (currentTemp < 10) { pad = 18; } thisTemp = String(currentTemp); if (centigrade) { thisTemp = thisTemp + "\260C"; } else { thisTemp = thisTemp + "\260F"; } const char* newDispC = (const char*) thisTemp.c_str(); u8g.drawStr(pad, 50, newDispC); } void setup(void) { pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH); pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW); Serial.begin(9600); // Последовательная передача данных Wire.begin(); delay(500); // Время стабилизации if (centigrade) { currentTemp = thermocouple.readCelsius(); minTemp = int(thermocouple.readCelsius()); maxTemp = int(thermocouple.readCelsius()); } else { currentTemp = thermocouple.readFahrenheit(); minTemp = int(thermocouple.readFahrenheit()); maxTemp = int(thermocouple.readFahrenheit()); } } void loop(void) { currentTemp = 0; for (int f = 0; f < 25; f++) { if (centigrade) { currentTemp = thermocouple.readCelsius() + currentTemp; } else { currentTemp = thermocouple.readFahrenheit() + currentTemp; } } currentTemp = currentTemp / 25; // Усредняем 25 считываний // Draw u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(50); // Время обновления }
К сожалению, я совсем новичок, штудируя информационные сайты начал путаться. Могли бы вы навести меня на путь истинный?
Так в чем проблема то?
Ну а где у вас U8Glib? Устанавливали? Если да, то надо инклюд соответствующий в начало скетча поместить.
А вообще лучше по частям проблему решать. Подключите дисплей и запустите пример. Добейтесь что бы показывал. А уж потом работу с термодатчиком добавляейте.
Ну, дело-то плёвое, судя по Вашему диагнозу. В чём затруднения?
Сейчас постарался разобраться в природе ошибок, итоговый скетч привратился в это чудовище:
Он прекарсно скомпилился, на этот раз ошибок не выдало, но экран спит сном младенца , не выдавая мне ничего. До этого проврял на примерах для моего дисплея, он работает стабильно, соответсвенно, и пины я подключил нужные. Делаю вывод, что проблема в коде, ну или в том, что находится между стулом и интерфейсом)0
Кроме того, на мониторе порта тоже не выдаются данные с термодатчика
итоговый скетч привратился в это чудовище:
но экран спит сном младенца
И не заработает, пока Вы спрашиваете советов, но им не следуете.
Вам ведь грамотный человек сказал
А вообще лучше по частям проблему решать. Подключите дисплей и запустите пример. Добейтесь что бы показывал. А уж потом работу с термодатчиком добавляейте.
Выбростье нахрен всё, кроме чего-то одного (датчика, экрана или что у Вас там). Добейтесь, чтобы это одно работало. Потом добавляйте второе и т.д.