Проблема совместного использования портов
- Войдите на сайт для отправки комментариев
Сб, 06/05/2017 - 19:15
Добргго времени суток.
Есть ардуина uno r3, датчики DTH22, BMP280 и слот расширения для карты памяти, подключил датчики, работают нормально, когда пытаюсь работать с картой памяти
SD.begin(8)
, bmp280 начинает выдавать неверные значения,
вот код
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <SD.h>
#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10
//Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
#define SD_CS_PIN 8
File myFile; // Файл который будет скопирован
char* ORIGINAL_FILE_NAME = "1.txt"; // Название копируемого файла
char fileText[255]; // Хранилище для текста содержащегося в копируемом файле
void setup()
{
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bme.begin()) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
// SPI SS пин должен быть OUTPUT
pinMode(8, OUTPUT);
// Инициализируем СД карту
Serial.print("Initializing SD card...");
if (!SD.begin(8)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
// Весь код был выполнен в функции setup
void loop()
{ /*
// Открываем (или создаем, если его нет) файл копии
myFile = SD.open(ORIGINAL_FILE_NAME, FILE_WRITE);
// Записываем в него считанный текст
if (myFile) {
Serial.print("Write...");
myFile.print(bme.readTemperature());
myFile.print(" ");
myFile.println(bme.readPressure()/133.3,1);
// Закрываем файл
myFile.close();
Serial.println("done.");
} else {
// Если произошла ошибка открытия файла, выводим сообщение
Serial.print("error opening ");
Serial.println(ORIGINAL_FILE_NAME);
}*/
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
Serial.print("davlenie = ");
Serial.print(bme.readPressure()/133.3,1);
Serial.println(" Mm");
Serial.print("Vusota = ");
Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
Serial.println(" m");
Serial.println();
delay(2000);
}
Вы уж определитесь, каким SPI Вы хотите воспользоваться, программным или аппаратным.
Если аппаратным - инициализируйте библиотеку BMP с аппаратным, а если программным - уберите пины программного SPI с пинов аппаратного.
Крточка использует аппаратный, поэтому когда Вы пытаетесь использовать одни и те же пины для разных целей, возникает конфликт.
Если честно не особо понял, если у нас какой то датчик использует аппаратные пины, то все остальные которые можно подключить к этим же пинам должны работать с аппаратными пинами? если у Вас есть под рукой информация про разницу между аппаратными и программными пинами, можете поделиться а то я что то не нашел,
Сейчас по Вашему совету подключил библиотеку для аппаратных пинов все заработало.
Не совсем так.
А Ардуино есть некоторый набор выводов, каждый из которых можно использовать различными способами.
1. Любой из пинов можно использовать как цифровой вход,
2. Любой из пинов можно использовать как цифровой выход,
3. Некоторые пины можно использовать как аналоговый вход (другие - нельзя).
4. Некоторые пины можно использовать как последовательный порт (другие - нельзя).
5. Некоторые пины можно использовать как интерфейс I2C (другие - нельзя).
6. Некоторые пины можно использовать как интерфейс SPI (другие - нельзя).
Но при этом каждый пин можно использовать только по одному назначению. По двум одновременно - нельзя.
Если ВЫ используете аппараный SPI, то вариант 6, если программный - вариант 1/2. Одновременно использовать одни и те же пины и для программнрого и для аппаратного SPI нельзя, т.к. это разные режимы работы пинов.