Протокол SPI с несколькими устройствами
Мне нужно записать и прочитать измерения, полученные датчиком, на SD-карту. Считывание с карты будет заключаться в отображении данных на TFT-экране. В частности, я использую 1,8-дюймовый экран ST7735. Чтобы использовать карту с Arduino, я использую модуль чтения SD-карт (бренд ANGEEK). Оба устройства работают по протоколу SPI.
Чтобы убедиться, что это возможно, я создаю тестовый код. В нем две функции (measure_V и measure_I) имитируют измерения напряжения и тока. Итак, что я делаю, так это вызываю эти две функции, чтобы получить 10 измерений и сохранить их все на SD. Затем я читаю их и вывожу на экран. Я показываю их как на последовательном мониторе, так и на TFT-экране. Чтобы сопоставить значения V_data и I_data, я использую две функции, которые дают мне максимальное значение в каждой мере. Однако ни на последовательном мониторе, ни на экране ничего не отображается. Эти два устройства имеют общие контакты MISO, MOSI и SCK. Может ли кто-нибудь помочь мне с этим? Это первый раз, когда я использую протокол SPI более чем с одним устройством.
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SD.h>
#include <SPI.h>
#define TFT_CS 10
#define A0_pin 8
#define RST_pin 9
#define SD_CS 7 // CS pin SD-карты, подключенной к контакту 7 Arduino
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, A0_pin, RST_pin);
const uint8_t rotation=2; // Начало координат вверху слева
float V_data[10], I_data[10]; // Хранить измерения напряжения и тока
File V_points;
File I_points;
const uint16_t Display_Color_Green = 0x07E0; // Зеленый цвет
int measure_V(int x){
int voltage;
voltage = x;
return voltage;
}
int measure_I(int x){
int current;
current = pow(x, 2);
return current;
}
int max_V(){
int maxVal = 0;
for (int i=0; i<sizeof(V_data)/sizeof(float); i++) {
if (maxVal < V_data[i]) {
maxVal= V_data[i];
}
}
return maxVal;
}
int max_I(){
int maxVal = 0;
for (int i=0; i<sizeof(I_data)/sizeof(float); i++) {
if (maxVal < I_data[i]) {
maxVal= I_data[i];
}
}
return maxVal;
}
void setup() {
Serial.begin(9600);
tft.initR(INITR_GREENTAB); // Инициализировать микросхему ST7735R, зеленая вкладка
tft.setSPISpeed(40000000);
tft.setRotation(rotation); // Устанавливаем тип вращения
tft.fillScreen(ST7735_BLACK);
Serial.print("Initializing SD card...");
if (!SD.begin(SD_CS))
{
Serial.println("SD initialization failed!");
while (1) ;
}
Serial.println("SD initialization done.");
}
void loop() {
int static n = 0; // Номер измерения (начальное измерение = 0)
uint16_t pixelV, pixelI;
// Мы выполняем и сохраняем на карте памяти 10 измерений
for(int i=0; i<=9; i++){
V_points.print(measure_V(i)); // Новое значение напряжения
I_points.print(measure_I(i)); // Новое текущее значение
}
// Мы считываем 10 показателей карты
while (V_points.available() && I_points.available()){
V_data[n] = V_points.parseFloat(); // Считывать значение напряжения из файла
I_data[n] = I_points.parseFloat(); // Считывает текущее значение из файла
Serial.print("Voltage= ");
Serial.print(V_data[n]);
Serial.print(", ");
Serial.print("Current= ");
Serial.println(I_data[n]);
pixelV = map(V_data[n], 0, max_V(), 0, 128); // Мы наносим на карту напряженность
pixelI = map(I_data[n], 0, max_I(), 0, 160); // Мы наносим на карту текущие
tft.drawPixel(pixelV, pixelI, Display_Color_Green);
n++;
}
}
@Libegria, 👍1
Обсуждение0
- Аппаратный SPI Arduino NANO не работает
- Как увеличить скорость записи на SD-карту в Ардуино
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Использование экрана SD-карты на Arduino Due
- Загрузить сайт с SD-карты
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- ST7735s 1.8" SPI 128x160 TFT Модуль - Белый экран
Проверьте конкретные детали ваших датчиков, чтобы убедиться, что они правильно переводят контакт MISO в высокое сопротивление, когда SS вытягивается на высокий уровень. См. мой [ответ](https://arduinoprosto.ru/q/51963/33608) на аналогичный вопрос для возможного обходного пути., @sempaiscuba
это может быть эта проблема: https://arduinoprosto.ru/q/36912/slave-spi-does-not-work/36915#36915, @Juraj
Спасибо, я посмотрю, через что вы прошли, и посмотрю, исправит ли это это., @Libegria
Похоже, вы не открываете и не закрываете файлы, которые пытаетесь записать или прочитать. См. пример использования SD-карты: https://www.arduino.cc/en/Tutorial/LibraryExamples/ReadWrite., @6v6gt