Множественный 3-проводной датчик SPI, взаимодействующий с Arduino
Я хочу подключить термопару 4 MAX6675 к Arduino. МАКС 6675 описание.
Он поставляется с собственной библиотекой Arduino. ссылка на библиотеку.
Я протестировал пример кода для одного датчика, и он отлично работает. Теперь я хочу подключить все четыре датчика к Arduino, используя минимальные возможные контакты GPIO.
I подключено - (для 2 датчиков только для первоначального тестирования):
D7 -> clk (slave 1) ->clk (slave 2)
D3 -> so (slave 1) ->so (slave 2)
D4 -> cs (slave 1)
D5 -> cs (slave 2)
Мой код (я немного изменил исходный пример кода):
// этот пример является общественным достоянием. наслаждайтесь!
// www.ladyada.net/learn/sensors/thermocouple
#include "max6675.h"
int thermoCLK = 7;
int thermoDO = 3;
int thermoCS = 4;
int thermoCS2 = 5;
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
MAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO);
void setup() {
Serial.begin(9600);
Serial.println("MAX6675 test");
// дождитесь стабилизации чипа MAX
delay(500);
}
void loop() {
// базовый тест считывания, просто выведите текущую температуру
Serial.print("C = ");
Serial.println(thermocouple.readCelsius());
Serial.print("F = ");
Serial.println(thermocouple.readFahrenheit());
Serial.print("C 2= ");
Serial.println(thermocouple2.readCelsius());
Serial.print("F 2= ");
Serial.println(thermocouple2.readFahrenheit());
delay(1000);
}
Я могу правильно считывать информацию только с одного датчика. Другой вывод - nan. Я неправильно подключаю схему, или мой код неверен, или и то, и другое?
@Piyush Verma, 👍0
Обсуждение1 ответ
Лучший ответ:
Во-первых, выкинуть эту библиотеку. Это совершенно бессмысленно и на самом деле все усложняет.
Во-вторых, подключите датчики к выводам SPI, выбрав новый вывод CS для каждого датчика.
- Arduino SCK (pin 13) ко всем контактам SCK.
- Arduino MISO (pin 12) ко всем контактам SO.
- Отдельные контакты GPIO соединяются с отдельными контактами CS (используйте вывод 10 для одного из них).
Затем просто используйте простую функцию для чтения данных с помощью библиотеки SPI (адаптированной из библиотеки, на которую вы ссылаетесь). Например, с CS на 10 и 9:
#include <SPI.h>
double readCelsius(uint8_t cs) {
uint16_t v;
digitalWrite(cs, LOW);
v = SPI.transfer(0x00);
v <<= 8;
v |= SPI.transfer(0x00);
digitalWrite(cs, HIGH);
if (v & 0x4) {
// э-э-э, термопары нет!
return NAN;
}
v >>= 3;
return v*0.25;
}
void setup() {
SPI.begin();
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
Serial.begin(115200);
}
void loop() {
Serial.print(readCelsius(10));
Serial.print(" ");
Serial.println(readCelsius(9));
delay(1000);
}
Разве вышеприведенный код не должен также относиться к контактам SCK и MISO?, @uzadude
- Взаимодействие с датчиком SSI?
- Использование Broadcom AFBR-S50 с Arduino
- ESP32-CAM не читает BME680
- Датчик перепада давления DLHR SPI
- Водонепроницаемый датчик температуры SPI.
- Отсутствие Clock и MISO трафика на линиях SPI для ADXL375 с использованием teensy 3.2
- Как использовать SPI на Arduino?
- Какова работа pulseIn?
Я бы не стал пользоваться этой библиотекой. Вместо этого я бы выбрал тот, который правильно использует SPI. Затем вы используете только N+2 контакта. Или, поскольку он так прост в использовании, просто используйте SPI напрямую., @Majenko
Вышеприведенная программа не будет работать как есть, так как есть синтаксическая ошибка. Вы читали Марселя в начале и читали Марселя позже, все ссылки должны быть readCelsius. С наилучшими пожеланиями, Фил., @Bonzo
Почему бы вам не использовать контакт 19 для SCK и контакт 18 для MISO, чтобы сохранить цифровые контакты свободными? Не могли бы вы прокомментировать, что делает каждая строка в этом коде, просто пытаясь узнать и понять, как я хочу использовать 4 термопары, а затем записать на 6 релейных выходов., @Daniel Collins