Arduino Uno + Ethernet W5500 + TFT Display

145
02 марта 2018, 17:37

Есть проблема. К Arduino Uno подключены Ethernet W5500 шилд и TFT дисплей по SPI шыне, так как SPI использую впервые - не могу никак разобраться как правильно управлять несколькими устройствами по SPI, в гугл обращался и ничего понятного не нашел, понял только что управление происходит последовательной подачей низкого уровня на управляющий пин, питался разобратся но толку не принесло.

Шилд вот этот, библиотека к нему Ethernet2

Дисплей вот этот, библиотека стандартная TFT.h

Подключение шилда:

  1. MISO - 12 вывод
  2. MOSI - 11 вывод
  3. SCLK - 13 вывод
  4. SCS - 5 вывод

Подключение дисплея:

  1. SCK - 13 вывод
  2. SDA - 11 вывод
  3. A0 - 9 вывод
  4. RESET - 7 вывод
  5. CS - 6 вывод

Код:

#include <DHT.h>
#include <TFT.h>
#include <SPI.h>
#include <Ethernet2.h>
#define cs   6 //Пін вибору дисплея
#define dc   9 //Пін даних
#define rst  7 //Ресет
#define eth  5 //Пін вибору W5500
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
TFT TFTscreen = TFT(cs, dc, rst);
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 };
EthernetClient client;
char server[] = "google.com"; //к примеру
float t,h,f,hic,hif;
void setup(){
  Serial.begin(9600);
  SPI.begin();
  Ethernet.begin(mac);
  dht.begin();
  TFTscreen.begin();
  pinMode(cs, OUTPUT);
  pinMode(eth, OUTPUT);
}
void loop() {
  h = dht.readHumidity();
  t = dht.readTemperature();
  f = dht.readTemperature(true);
  hif = dht.computeHeatIndex(f, h);
  hic = dht.computeHeatIndex(t, h, false);
  Display(t,h);
  digitalWrite(eth, LOW);
  if (client.connect(server, 80)) {
    client.print( "GET /data.php?");
    ...Работаем с шилдом...
    client.stop();
    client.flush();
  }
  else {
   client.stop();
   delay(1000);
   client.connect(server, 80);
  }
  digitalWrite(eth, HIGH);
  delay(500);
}
void Display(float t, float h) {
  digitalWrite(cs, LOW);
  String sHumidity, sTemperature;
  sHumidity = h;
  sTemperature = t;
  TFTscreen.background(0, 0, 0);
  TFTscreen.stroke(1, 177, 0);
  TFTscreen.setTextSize(1);
  TFTscreen.text("Temperature", 1, 2);
  TFTscreen.setTextSize(2);
  TFTscreen.text(sTemperature.c_str(), 90, 2);
  TFTscreen.setTextSize(1);
  TFTscreen.text("~C", 145, 5);
  TFTscreen.setTextSize(1);
  TFTscreen.text("Humidity", 1, 50);
  TFTscreen.setTextSize(2);
  TFTscreen.text(sHumidity.c_str(), 90, 50);
  TFTscreen.setTextSize(1);
  TFTscreen.text("%", 150, 60);
  digitalWrite(cs, HIGH);
}

Кто может научить помочь с работой с SPI? Буду очень рад ответам в виде примера :)

Answer 1

Значит MISO, MOSI, SCLK надо запараллелить, а для работы (выбора) конкретного устройства, его CS надо перевести в "0", затем можно с выбранным устройством работать.

Как работать надо смотреть, описание вашего хост-контроллера (Arduino), возможно там есть даже программный пример чтения/записи байта, чтение/запись всегда для SPI происходят одновременно.

Затем надо смотреть описания устройств, там тоже могут быть примеры, как и что делать с помощью байтовых операций.

READ ALSO
Поиск блондина с максимальным ростом

Поиск блондина с максимальным ростом

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

123
Добавление лицензионного ключа

Добавление лицензионного ключа

Мне нужно добавить в программу проверку на лицензиюУ меня есть набор ключей и функция, проверяющая их валидность

141
Побитовые операции и сдвиги (C/C++)

Побитовые операции и сдвиги (C/C++)

Имеется следующий код:

157
invalid operands of types что делать?

invalid operands of types что делать?

Добрый деньПроблема в чем? - выдает ошибку: "invalid operands of types 'double' and 'double(const char*) throw()' to binary 'operator=='" Вот фрагмент кода, в котором выдает ошибку:

155