Множественный 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. Я неправильно подключаю схему, или мой код неверен, или и то, и другое?

, 👍0

Обсуждение

Я бы не стал пользоваться этой библиотекой. Вместо этого я бы выбрал тот, который правильно использует SPI. Затем вы используете только N+2 контакта. Или, поскольку он так прост в использовании, просто используйте SPI напрямую., @Majenko

Вышеприведенная программа не будет работать как есть, так как есть синтаксическая ошибка. Вы читали Марселя в начале и читали Марселя позже, все ссылки должны быть readCelsius. С наилучшими пожеланиями, Фил., @Bonzo

Почему бы вам не использовать контакт 19 для SCK и контакт 18 для MISO, чтобы сохранить цифровые контакты свободными? Не могли бы вы прокомментировать, что делает каждая строка в этом коде, просто пытаясь узнать и понять, как я хочу использовать 4 термопары, а затем записать на 6 релейных выходов., @Daniel Collins


1 ответ


Лучший ответ:

2

Во-первых, выкинуть эту библиотеку. Это совершенно бессмысленно и на самом деле все усложняет.

Во-вторых, подключите датчики к выводам 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