Общее подключение nRF24L01 и sd card по SPI ,возникла проблема
- Войдите на сайт для отправки комментариев
Сб, 12/05/2018 - 20:13
Делаю метеостацию с загрузкой температуры на sd карту и отправкой данных по nRF24L01 на другое арлуино.Но я остановился на серьезной проблеме , эти два модуля не хотят работать вместе.Как настроить скетч чтоб они работали ?
Поменять местами строки 16 и 21.
//dht22 #include "DHT.h" // Подключаем библиотеку DHT #define DHTPIN 2 // Пин к которому подключен датчик #define DHTTYPE DHT22 // Используемый датчик DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); // Инициализируем датчик //bmp280 #include <Wire.h> #include <SPI.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 bme; //rtc #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS3231); //nrf24 #include <SPI.h> // библиотека для работы с шиной SPI #include "nRF24L01.h" // библиотека радиомодуля #include "RF24.h" RF24 radio(9, 10); byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte counter; //SD #include <SPI.h> #include <SD.h> File myFile; //датчик дождя #define PIN_ANALOG_RAIN_SENSOR A0 // Аналоговый вход для сигнала датчика протечки и дождя void setup() { delay(1000); Serial.begin(9600); // Задаем скорость передачи данных Serial.println("тест!"); //стар SD SD.begin(4); //стар термометра dht.begin(); //стар времени time.begin(); //стар давления bme.begin(); //стар радиомодуля radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { //массив для радиомодуля float data[4]; //каждую секунду if(millis()%5000==0){ float sensorValue = analogRead(PIN_ANALOG_RAIN_SENSOR); // Считываем данные с аналогового порта float t = dht.readTemperature(); float h = dht.readHumidity(); float p = bme.readPressure(); myFile = SD.open("data.txt", FILE_WRITE); myFile.print(time.gettime("d-m-Y, H:i:s, D")); myFile.print(" "); myFile.print(t); myFile.print(" "); myFile.print(h); myFile.print(" "); myFile.print(p); myFile.print(" "); myFile.print(sensorValue); myFile.println(" "); myFile.close(); data[0] = t; data[1] = h; data[2] = p; data[3] = sensorValue; radio.write(&data, sizeof(data)); Serial.println(t); Serial.println(h); Serial.println(p); Serial.println(sensorValue); } }Некоторые китайские модули SD не отпускают линию MISO, даже когда их CS в высоком уровне. Убедитесь, что у вас не такой проблемный модуль. Если такой - то самый простой вариант, если модуль дорабатывать не хочется - это взять 74HC125 и все линии MISO всех модулей на SPI пустить через неё.
А 74HC125 это сдвиговый регистр?
Еще можно в линию MISO проблемного модуля включить последовательно резистор 1-2 кОма.
Делаю метеостацию с загрузкой температуры на sd карту и отправкой данных по nRF24L01 на другое арлуино.Но я остановился на серьезной проблеме , эти два модуля не хотят работать вместе.Как настроить скетч чтоб они работали ?
Ну во-первых, зачем модуль карты располагать на передатчике, ведь передатчик находится в метео-будке на улице. Я модуль карты расположил в приемной части, которая с дисплеем и прочими делами находится дома. При необходимости карту можно вытащить, вставить в комп и получать красивые диаграммы всех измерений.
Чтобы совместить карту, модуль nRF24L01, дисплей, клаву пришлось на приемной стороне использовать ардуино мега и библиотеку soft-spi, поменяв некоторые выводы, так что это все вместе работает
А 74HC125 это сдвиговый регистр?
Нет. Это 3-state buffer.
Я возращаюсь к этой теме.Итак,метод с резисторами не сработал.Я заметил что проблемный модуль это nrf24l01 .
Когда я подсоеденяю sd модуль к SPI,то nrf24l01 отлючается,даже если я использую скечт только для nrf24l01.Есть ещё какие-то методы кроме трёх канального буфера?И да мне надо именно сохранять данные в блоке который будет на улице.Потому что я хочу по желанию отключать сам приемник,допустим на ночь
кроме трёх канального буфера?
74HC125 - четырёхканальный буфер. Каждый канал которого - 3-state, т.е. имеет три состояния.
Я возращаюсь к этой теме.Итак,метод с резисторами не сработал.Я заметил что проблемный модуль это nrf24l01 .
Когда я подсоеденяю sd модуль к SPI,то nrf24l01 отлючается,даже если я использую скечт только для nrf24l01.
Странно.
При таких симптомах, я бы решил, что проблемный модуль как раз SD.
Вы резистор то куда подключали: к MISO карты или к MISO nrf?
хм к самому nrf24l01 - этот модуль как раз и не работал,а надо было к sd ?Сейчас подключу к sd
Спасибо!!!Неужели заработало