Arduino и датчик температуры термопары на основе MAX6675

Karaul
Offline
Зарегистрирован: 06.05.2019

Добрый день!
Столкнулся вот с таким скетчем:

#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); // Время обновления
}

К сожалению, я совсем новичок, штудируя информационные сайты начал путаться. Могли бы вы навести меня на путь истинный? 

asam
Offline
Зарегистрирован: 12.12.2018

Так в чем проблема то?

Karaul
Offline
Зарегистрирован: 06.05.2019


Компиляция скетча...
"C:\\Users\\Вадим\\Desktop\\arduino-nightly\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10809 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Users\\Вадим\\Desktop\\arduino-nightly\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Users\\Вадим\\Desktop\\arduino-nightly\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Users\\Вадим\\Documents\\Arduino\\libraries\\Adafruit_SSD1306" "-IC:\\Users\\Вадим\\Desktop\\arduino-nightly\\hardware\\arduino\\avr\\libraries\\Wire\\src" "-IC:\\Users\\Вадим\\Desktop\\arduino-nightly\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Users\\Вадим\\Documents\\Arduino\\libraries\\Adafruit_GFX_Library" "-IC:\\Users\\Вадим\\Documents\\Arduino\\libraries\\MAX6675_library" "C:\\Users\\7C77~1\\AppData\\Local\\Temp\\arduino_build_426455\\sketch\\thermocouple_out_on_serial.ino.cpp" -o "C:\\Users\\7C77~1\\AppData\\Local\\Temp\\arduino_build_426455\\sketch\\thermocouple_out_on_serial.ino.cpp.o"
C:\Users\Вадим\Desktop\thermocouple_out_on_serial\thermocouple_out_on_serial.ino: In function 'void draw()':
 
thermocouple_out_on_serial:39:3: error: 'u8g' was not declared in this scope
 
thermocouple_out_on_serial:39:15: error: 'u8g_font_profont12' was not declared in this scope
 
thermocouple_out_on_serial:70:15: error: 'u8g_font_profont29' was not declared in this scope
 
Используем библиотеку Adafruit_SSD1306 версии 1.2.9 из папки: C:\Users\Вадим\Documents\Arduino\libraries\Adafruit_SSD1306 
Используем библиотеку Wire версии 1.0 из папки: C:\Users\Вадим\Desktop\arduino-nightly\hardware\arduino\avr\libraries\Wire 
Используем библиотеку SPI версии 1.0 из папки: C:\Users\Вадим\Desktop\arduino-nightly\hardware\arduino\avr\libraries\SPI 
Используем библиотеку Adafruit_GFX_Library версии 1.4.13 из папки: C:\Users\Вадим\Documents\Arduino\libraries\Adafruit_GFX_Library 
Используем библиотеку MAX6675_library версии 1.0.0 из папки: C:\Users\Вадим\Documents\Arduino\libraries\MAX6675_library 
exit status 1
'u8g' was not declared in this scope
 
Под конец компиляции выходят такие ошибки, а мне всего-то нужно вывести на мой дисплей температуру с термопары)
asam
Offline
Зарегистрирован: 12.12.2018

Ну а где у вас U8Glib? Устанавливали? Если да, то надо инклюд соответствующий в начало скетча поместить.

А вообще лучше по частям проблему решать. Подключите дисплей и запустите пример. Добейтесь что бы показывал. А уж потом работу с термодатчиком добавляейте.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, дело-то плёвое, судя по Вашему диагнозу. В чём затруднения?

Karaul
Offline
Зарегистрирован: 06.05.2019

Сейчас постарался разобраться в природе ошибок, итоговый скетч привратился в это чудовище:

#include "U8glib.h"
#include <SPI.h>
#include <Wire.h>
#include "max6675.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_MOSI 12
#define OLED_CLK 13
#define OLED_DC 10
#define OLED_CS 9
#define OLED_RESET 11

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); // Время обновления
}

Он прекарсно скомпилился, на этот раз ошибок не выдало, но экран спит сном младенца , не выдавая мне ничего. До этого проврял на примерах для моего дисплея, он работает стабильно, соответсвенно, и пины я подключил нужные. Делаю вывод, что проблема в коде, ну или в том, что находится между стулом и интерфейсом)0

Karaul
Offline
Зарегистрирован: 06.05.2019

Кроме того, на мониторе порта тоже не выдаются данные с термодатчика

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Karaul пишет:

итоговый скетч привратился в это чудовище:

но экран спит сном младенца

И не заработает, пока Вы спрашиваете советов, но им не следуете.

Вам ведь грамотный человек сказал

asam пишет:

А вообще лучше по частям проблему решать. Подключите дисплей и запустите пример. Добейтесь что бы показывал. А уж потом работу с термодатчиком добавляейте.

Выбростье нахрен всё, кроме чего-то одного (датчика, экрана или что у Вас там). Добейтесь, чтобы это одно работало. Потом добавляйте второе и т.д.