3 термопары и tft дисплей SPI ILI9225 к шине SPI

Подскажите что я делаю не так.
Не Получаетсяподключить 3 термопары и tft дисплей SPI ILI9225 к шине SPI к ардуино уно . Работает либо дисплей или термопары когда удалю дисплей из скетча.
Подключение 3 термоар к SPI шине и дисплея LSD 2004А -V1.1 I2C к шине I2C я сделал все работает.

Мой скетч
//Термопары подключение
#include “max6675.h”
int thermoCLK = 13; // SCK -Serial clock генерируется синхронизирующие импульсы микроконтроллером…на плате термопары max6675 пин SO
int thermoDO = 12; // MOSO на контроллере. линия MOSO отвечает за прием данных в данном случае с термопары.на плате термопары max6675 пин SО
int thermoCS1 = 7;
int thermoCS2 = 6;
int thermoCS3 = 5;

MAX6675 thermocouple1 (thermoCLK, thermoCS1, thermoDO);
MAX6675 thermocouple2 (thermoCLK, thermoCS2, thermoDO);
MAX6675 thermocouple3 (thermoCLK, thermoCS3, thermoDO);

//Подключение Вольтметра
#define analog_pin A0 // Вывод которому подключен датчик

float adc_voltage = 0.0; // Создаем переменную adc_voltage
float in_voltage = 0.0; // Создаем переменную in_voltage
float R1 = 30000.0; // Задаем номинал резистора R1
float R2 = 7500.0; // Задаем номинал резистора R2
float ref_voltage = 5.0; // Задаем опорное напряжение
int adc_value = 0; // Создаем переменную для хранения показаний

// Подключения дисплея
#include “SPI.h” // библиотека работы по интерфейсу (шине) SPI
#include “TFT_22_ILI9225.h” // библиотека дисплея
// назначаем имена контактам дисплея
#define TFT_LED 3 // шим вывод для управления подсветкой (любой шим выход ардуино)
#define TFT_RST 8 // Reset (любой выход ардуино)
#define TFT_RS 9 //SPI Data/Command Select (любой выход ардуино)
// назначаем имена контактам дисплея SPI шине (использую аппаратные контакты SPI шины работают быстрей) фиксированые выводы ардуино уно
#define TFT_CS 10 // SS(Slave Select).- на контроллере. другое обознач CS(Chip Select)на подключеном устройстве
#define TFT_SDI 11 // MOSI на контроллере. линия MOSI отвечает за предачу в данном случае на дисплей.на дисплее пин SDI
#define TFT_CLK 13 // SCK -Serial clock генерируется синхронизирующие импульсы

#define TFT_BRIGHTNESS 100 // яркость дисплея

TFT_22_ILI9225 tft = TFT_22_ILI9225(TFT_RST, TFT_RS, TFT_CS, TFT_LED, TFT_BRIGHTNESS);// подключаем дисплей к проименованым контактам

void setup() {
Serial.begin(9600); //активируем порт передачи используется когда нужно выводить информацию на компьютер
Serial.println(“MAX6675 test”); //ждем стабилизации чипа MAX
Serial.println(“DC Voltage Test”); // Отправляем текст волтметр

tft.begin(); // инициализация ЖК дисплея
tft.clear();
tft.setOrientation(0); // Отрентация текста 0,1,2,3,

tft.setBackgroundColor(COLOR_YELLOW); // фон текста
tft.setFont(Terminal12x16);
tft.drawText(0, 20, “t1=”, COLOR_RED);
tft.drawText(0, 40, “t2=”, COLOR_RED);
tft.drawText(0, 60, “t3=”, COLOR_RED);
tft.drawText(0, 80, “V=”, COLOR_RED);

delay(1000);
}

void loop()
{
// Волтметр
adc_value = analogRead(analog_pin); // Считываем показания с аналогово вывода
adc_voltage = (adc_value * ref_voltage) / 1024.0; // Определение на входе АЦП
in_voltage = adc_voltage / (R2/(R1+R2)) ; // Расчет напряжения

//Выводим показания в монитор порта с термопар
Serial.print(" C1= "); // печатаем в порте C1 =
Serial.print(thermocouple1.readCelsius());// выводим в порт температ в цельсиях 1 термопары

Serial.print("; C2= "); // печатаем в порте C2 =
Serial.print(thermocouple2.readCelsius());// выводим в порт температ в цельсиях 2 термопары

Serial.print("; C3= "); // печатаем в порте C3 =
Serial.print(thermocouple3.readCelsius());// выводим в порт температ в цельсиях 3 термопары со следующей строки

//Выводим показания в монитор порта показания вольтметра
adc_value = analogRead(analog_pin); // Считываем показания с аналогово вывода
adc_voltage = (adc_value * ref_voltage) / 1024.0; // Определение на входе АЦП
in_voltage = adc_voltage / (R2/(R1+R2)) ; // Расчет напряжения
Serial.print("; V= "); // печатаем в порте V =
Serial.println(in_voltage, 2);// выводим в порт показания вольтметра

// Выводим температуры и вольты на диспплей
tft.setBackgroundColor(COLOR_YELLOW);
tft.setFont(Terminal12x16);
tft.drawText(50, 40,“t2”,COLOR_RED);
tft.drawText(50, 60, “t3=”, COLOR_RED);
tft.drawText(50, 80, “V=”, COLOR_RED);

delay(2000);

}

Неправильно вставляете код. В таком виде его трудно читать, а обсуждать и вовсе невозможно.

@123
Пины SCL и MISO для термопар и они же для дисплея должны быть РАЗНЫМИ!
А у вас они одни и те же. Странно как они должны работать.

//Термопары подключение
#include "max6675.h"
int thermoCLK = 13;  // SCK -Serial clock генерируется синхронизирующие импульсы микроконтроллером..на плате термопары max6675 пин SO
int thermoDO = 12;   // MOSO на контроллере.  линия MOSO отвечает за прием данных в данном случае с термопары.на плате термопары max6675 пин SО
int thermoCS1 = 7;
int thermoCS2 = 6;
int thermoCS3 = 5;

MAX6675 thermocouple1(thermoCLK, thermoCS1, thermoDO);
MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO);
MAX6675 thermocouple3(thermoCLK, thermoCS3, thermoDO);

//Подключение Вольтметра
#define analog_pin A0  // Вывод которому подключен датчик

float adc_voltage = 0.0;  // Создаем переменную adc_voltage
float in_voltage = 0.0;   // Создаем переменную in_voltage
float R1 = 30000.0;       // Задаем номинал резистора R1
float R2 = 7500.0;        // Задаем номинал резистора R2
float ref_voltage = 5.0;  // Задаем опорное напряжение
int adc_value = 0;        // Создаем переменную для хранения показаний

//  Подключения дисплея
#include "SPI.h"             // библиотека  работы по интерфейсу (шине) SPI
#include "TFT_22_ILI9225.h"  // библиотека дисплея
  // назначаем имена контактам дисплея
#define TFT_LED 3  // шим вывод для управления подсветкой (любой шим выход ардуино)
#define TFT_RST 8  // Reset          (любой  выход ардуино)
#define TFT_RS 9   //SPI Data/Command Select  (любой  выход ардуино)
  // назначаем имена контактам дисплея SPI шине  (использую аппаратные контакты SPI шины  работают быстрей) фиксированые выводы ардуино уно
#define TFT_CS 10   // SS(Slave Select).- на контроллере. другое обознач CS(Chip Select)на подключеном устройстве
#define TFT_SDI 11  // MOSI на контроллере.  линия MOSI отвечает за предачу в данном случае на дисплей.на дисплее пин SDI
#define TFT_CLK 13  // SCK -Serial clock генерируется синхронизирующие импульсы

#define TFT_BRIGHTNESS 100  // яркость дисплея

TFT_22_ILI9225 tft = TFT_22_ILI9225(TFT_RST, TFT_RS, TFT_CS, TFT_LED, TFT_BRIGHTNESS);  // подключаем дисплей к проименованым контактам


void setup() {
  Serial.begin(9600);                 //активируем порт передачи используется когда нужно выводить информацию на компьютер
  Serial.println("MAX6675 test");     //ждем стабилизации чипа MAX
  Serial.println("DC Voltage Test");  // Отправляем текст волтметр

  tft.begin();  // инициализация ЖК дисплея
  tft.clear();
  tft.setOrientation(0);  // Отрентация текста 0,1,2,3,

  tft.setBackgroundColor(COLOR_YELLOW);  // фон текста
  tft.setFont(Terminal12x16);
  tft.drawText(0, 20, "t1=", COLOR_RED);
  tft.drawText(0, 40, "t2=", COLOR_RED);
  tft.drawText(0, 60, "t3=", COLOR_RED);
  tft.drawText(0, 80, "V=", COLOR_RED);

  delay(1000);
}

void loop() {
  // Волтметр
  adc_value = analogRead(analog_pin);                // Считываем показания с аналогово вывода
  adc_voltage = (adc_value * ref_voltage) / 1024.0;  // Определение на входе АЦП
  in_voltage = adc_voltage / (R2 / (R1 + R2));       // Расчет напряжения

  //Выводим показания в монитор порта с термопар
  Serial.print("  C1= ");                     // печатаем в порте C1 =
  Serial.print(thermocouple1.readCelsius());  // выводим в порт температ в цельсиях 1 термопары

  Serial.print(";   C2= ");                   // печатаем в порте C2 =
  Serial.print(thermocouple2.readCelsius());  // выводим в порт температ в цельсиях 2 термопары

  Serial.print(";   C3= ");                   // печатаем в порте C3 =
  Serial.print(thermocouple3.readCelsius());  // выводим в порт температ в цельсиях 3 термопары со следующей строки

  //Выводим показания в монитор порта показания вольтметра
  adc_value = analogRead(analog_pin);                // Считываем показания с аналогово вывода
  adc_voltage = (adc_value * ref_voltage) / 1024.0;  // Определение на входе АЦП
  in_voltage = adc_voltage / (R2 / (R1 + R2));       // Расчет напряжения
  Serial.print(";   V= ");                           // печатаем в порте V =
  Serial.println(in_voltage, 2);                     // выводим в порт показания вольтметра
  float temp1 = in_voltage(1);

  // Выводим температуры и вольты на диспплей
  tft.setBackgroundColor(COLOR_YELLOW);
  tft.setFont(Terminal12x16);
  tft.drawText(50, 40, "t2", COLOR_RED);
  tft.drawText(50, 60, "t3=", COLOR_RED);
  tft.drawText(50, 80, temp1, COLOR_RED);



  delay(2000);
}

У меня был такой же случай - графический TFT LSD на SPI и MAX6675.

Термометр гадил дисплею периодически, пока не пересадил его на Software SPI.

SCL- это тактовый сигнал (ардуино просто задает ритм как я понимаю
MISO -по нему ардуина принемает значения в моем случае температуру
CS- это сигнал от ардуино с каким устройством она работает эти контакты термопар подключены к разным пинам.

К чему вы это написали мне?
Я в курсе, как работает шина SPI

Скажите, вы библиотеку термопар открывали? Она не использует аппаратный SPI, в ней используется программная имитация на очень низком (в смысле - низкокачественном) уровне. Эта имитация не может работать на одних и тех же пинах с нормальной шиной, их надо разнести на разные пины.

Тоесть получается что дисплей с SPI шиной и термопары на усилителе max6675 SPI шиной работать вместе не могут.
В чем может быть причина?

вы не читаете ответов?
Может причина именно в этом?

Повторяю - ваша библиотека термопар НЕ ИСПОЛЬЗУЕТ spi

У MAX6675 не настоящий SPI! Очень похож, но отличается. Тем более, что в библиотеке используется ногодрыг, а в библиотеке дисплея – аппаратный. Разносите на разные пины с дисплеем

Теоретически - должны. Но, в моем случае, практика показала, что лучше рассадить их по разным ногам.
Т.к. свободные пины были - я не углублялся в проблематику.

Нет!

Во-первых ногодрыг с аппаратным SPI на одних пинах в принципе работать не будет. А сделать MAX на аппаратном SPI не так просто, т.к. протокол немного отличается.

Проклятый алиэкспресс. Прямо нонстоп фейки подкидывает.

1 лайк

Это всё придумал Черчилль в 18-ом году!

Прошу особо не ругать я новичек в програмировании многого не понимаю.
Я подключал 3 термоары к SPI шине с дисплеем LSD 2004А -V1.1 I2C к шине I2C все работало без замечаний . Просто захотелось цветной дисплей

Да зачем мне библиотека… Мы же легких путей не ищем.

1 лайк

ладно, ругать не буду.
Но согласитесь, умными ваши ответы вряд ли можно назвать.
Вам пишут про SPI, а вы отвечаете про i2c.
К чему это тут?

Соблюдайте логику хоть немного.

Ну, если Вы его цепляли на аппаратный, то возможно он не работал из-за небольшой разницы в протоколе. Хотя, на ногодрыге почему-то работает даже если эту разницу игнорировать. Может там скорости разницу вносят, не знаю.

Причем интересно было: вроде как работает - температура читается, цифири на экран выводятся, а иногда раз - и лишние пикселы прорисовываются.
Как-будто термометр попердывал в шину.

Причем вскрылось все на сборке заказчика ))