мусор на i2c ?
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Собственно имеется проблема при работе RPi3 с arduino. На ардуинке висит NRF24L01 для приема данных с передатчика. Потом данные преобразовываются и шлются по i2c в малинку. На малинке задумано написать скрипт которые будет выполняться раз в 15 минут, считывать эти данные с шины в БД, ну а далее все будет показываться на web-морде. Но пока что появилась проблема правильности получения данных.
Код ардуины:
#include <SPI.h> // библиотека для протокола SPI
#include <nRF24L01.h> // библиотека для nRF24L01+
#include <RF24.h> // библиотека для радио модуля
#include "printf.h"
#include <Wire.h>
RF24 radio(9,7); // Для MEGA2560 замените на RF24 radio(9,53);
int SLAVE_ADDRESS = 0x4D; // i2c адрес
const uint64_t pipe = 0xF0F0F0F0E1LL; // идентификатор передачи
float data[4]; // данные с приемника
byte data2byte[3]; // массив byte
byte p1,p2; // для давления
int commandCode = 0; // команда от мастера
int presure,p=0;
void setup()
{
radio.begin(); // включаем радио модуль
radio.setChannel(9); // выбираем канал (от 0 до 127)
radio.setDataRate(RF24_1MBPS); // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
radio.setPALevel(RF24_PA_HIGH); // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
radio.openReadingPipe(1, pipe); // открываем первую трубу
radio.startListening(); // начинаем слушать трубу
//radio.printDetails();
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveData);
Wire.onRequest(requestData);
}
void loop()
{
if (radio.available()) // проверяем буфер обмена
{
radio.read(&data, sizeof(data)); // читаем данные
delay(500);
presure=int(data[0]);
p1 = highByte(presure);
p2 = lowByte(presure);
data2byte[1]=byte(data[1]); // емкость батареи передатчика
data2byte[2]=byte(data[2]); // температура
data2byte[3]=byte(data[3]); // влажность
}
}
void requestData()
{
switch(commandCode)
{
case 1:
Wire.write(data2byte[1]); // емкость батареи
delay(500);
break;
case 2:
Wire.write(data2byte[2]); // температура
delay(500);
break;
case 3:
Wire.write(data2byte[3]); // влажность
delay(500);
break;
case 41:
Wire.write(p1); // старшая часть давления
break;
case 42:
Wire.write(p2); // младшая часть давления
delay(500);
break;
default: break;
}
}
void receiveData(int iBuffer)
{
while (Wire.available())
{
commandCode = Wire.read();
}
}
Код на малине:
#
import smbus
import time
bus = smbus.SMBus(1);
address = 0x4d;
def read():
return bus.read_byte(address)
while True:
command = input (">>>>> ")
if command == "1":
bus.write_byte(address, 0x1)
C = read()
print ("Capacity ",C)
elif command == "2":
bus.write_byte(address, 0x2)
T = read()
print ("Temp ",T)
elif command == "3":
bus.write_byte(address, 0x3)
H = read()
print ("Humi ", H)
elif command == "4":
bus.write_byte(address, 0x29)
P1 = read()
time.sleep(1)
bus.write_byte(address, 0x2A)
P2 = read()
P = (P1<<8)|P2
print ("Press ", P)
time.sleep(1)
Код для малины уже 100500 редакции и какими только способами прием не был написан в итоге всегда получал одно и тоже - при склеивании числа был мусор.

Попытался выяснить откуда растут ноги и решил проверить значения по отдельности и вот что вышло - младшая часть всегда приходить стабильно правильная, а вот со старшей творится непонятная вакханалия. При запуске скрипта оно верное, а потом постоянно сыпется 130(????) может иногда появится 0 или правильное значение, но потом все опять по новой

Перечитал кучу мануалов, форумов но так и не смог найти способа как с этим побороться и вообще первопричину ( i2c идут витой парой, все остальное работает без проблем)
Шина I2C подтянута к + питания?
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA...
Шина I2C подтянута к + питания?
да все подтянуто, на линии еще RTC висит, до ардуины еще экран был, все работало без проблем, сейчас проблема при чтении байт давления, причем только одной половины.
https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%..
и при чем тут это? лишь бы вставить? проблема не в порядке, а в приеме сначала правильного значения с появляющимся непонятным мусором. откуда в регистре где хранится старшая часть числа (=2) появляется 130??
проблема решена, тему можно закрывать
а как решена?
а как решена?
case 41: Wire.write(p1); // старшая часть давления break;поставил задержку перед выходом такую же как и в других выборках и помогло