Arduino Uno i2c vs ds18b20

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

При попытке считать температуру с ds18b20 отправить данные по i2c не получается.

Датчик не читается, данные не отправляются.

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

String inString;
char inChar;

#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {0x28, 0x13, 0x98, 0xD7, 0x02, 0x00, 0x00, 0x5D }; 
DeviceAddress Thermometer2 = {0x28, 0xFF, 0x57, 0xA3, 0x81, 0x16, 0x03, 0xC0 };

void setup() {
  Wire.begin(8);
  Wire.onReceive(receiveEvent);//Вызывается когда есть данные от мастера
  Wire.onRequest(requestEvent);//Вызывается когда есть запрос от мастера
  delay(1000);
sensors.begin();
sensors.setResolution(Thermometer1, 10);
sensors.setResolution(Thermometer2, 10);
Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
float tempC = sensors.getTempC(deviceAddress);
Serial.println(tempC);
}

void loop() {

}


void receiveEvent() {
while (Wire.available() ){ 
inChar = Wire.read();
inString += inChar;
}
}

void requestEvent() {
if (inChar == '#') {
if (inString=="da1#") {
Serial.println("Sensor1");
//sensors.requestTemperatures();
//printTemperature(Thermometer1);
Wire.write("Privet");
}
inString="";
inChar="";
}
}
//sensors.requestTemperatures();
//printTemperature(Thermometer1);

Если раскоментировать эти две строки, то не работает ни Serial.println("Sensor1"); ниWire.write("Privet");

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014

Как я понимаю, причина скорее всего в задержках, работах таймеров.

Стабильно работает вот так, но я не уверен что это правильное решение, подскажите, объсните пожалуйста.

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

String inString;
char inChar;
String tempC;
int qwe = 0;

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer1 = {0x28, 0x13, 0x98, 0xD7, 0x02, 0x00, 0x00, 0x5D }; 
DeviceAddress Thermometer2 = {0x28, 0xFF, 0x57, 0xA3, 0x81, 0x16, 0x03, 0xC0 };



void setup() {
  Wire.begin(8);
  Wire.onReceive(receiveEvent);//Вызывается когда есть данные от мастера
  Wire.onRequest(requestEvent);//Вызывается когда есть запрос от мастера
sensors.begin();
sensors.setResolution(Thermometer1, 10);
sensors.setResolution(Thermometer2, 10);
Serial.begin(9600);
}



void loop() {
if (qwe==1){
qwe=0;  
sensors.requestTemperatures();
tempC = String(sensors.getTempC(Thermometer1)); 
}else if (qwe==2){
qwe=0;   
sensors.requestTemperatures();
tempC = String(sensors.getTempC(Thermometer2));  
}  
} 


void receiveEvent() {
while (Wire.available() ){ 
inChar = Wire.read();
inString += inChar;
}
}

void requestEvent() {
if (inChar == '#') {
if (inString=="da1#") {
qwe=1;
Serial.println("Sensor1");
Wire.write(tempC.c_str());

}
else if (inString=="da2#") {
qwe=2;
Serial.println("Sensor2");
Wire.write(tempC.c_str());
}else{
Serial.println("Error");
//char*text="error";
//String data="123456";
//Potentiometer = analogRead(0);
//String data =  String(Potentiometer, DEC);
//Wire.write(data.c_str());
Wire.write("Err"); 
}
inString="";
inChar="";
}
}