Arduino 读取 DS18B20 通过315/433 收发温度

描述等在论坛

https://www.mydigit.cn/forum.php?mod=viewthread&tid=295676

发送端:arduino uno + DS18B20 + 315/433 发送

接收端:esp8266 + 315/433 接收 通过 ST7565 屏幕显示

接线:

DS18B20 电源5V GND 和 9 接收数据

315/433 电源使用了3.3V 但最好使用5V 数据发送接 10

ESP8266 接315/433 随意接只要定义对就行,我接的 D1

屏幕按照实际情况接

 

 

发送代码

#include <RCSwitch.h>
#include <OneWire.h>

RCSwitch mySwitch = RCSwitch();

#define SwitchPin 10
#define DS18B20Pin 9

OneWire ds(DS18B20Pin);  // on pin 10 (a 4.7K resistor is necessary)

void setup() {

  delay(1000);
  Serial.begin(115200);
  Serial.println("初始化!!");
  
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(SwitchPin);

  // Optional set pulse length.
  // mySwitch.setPulseLength(320);
  
  // Optional set protocol (default is 1, will work for most outlets)
  // mySwitch.setProtocol(2);
  
  // Optional set number of transmission repetitions.
  // mySwitch.setRepeatTransmit(15);
  
}

byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
  
void loop() {

  //ds18x20是否存在  
  if ( !ds.search(addr)) {
    Serial.println("No more DS18x20 addresses.\n");
    ds.reset_search();
    delay(250);
    return;
  }

  // 打印地址位
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  // 校验地址位是否存在
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // 判断ds18x20类型  
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];

  Serial.print("Type:");
  Serial.println(type_s);

  //ds18s20
  if (type_s) {
    // 只有 ds18s20 会进入这里
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  //ds18B20
  } else {
    Serial.println("else");
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
     default is 12 bit resolution, 750 ms conversion time
  }
  
  Serial.print("raw:");
  Serial.println(raw);
  
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");


  //--------------------------------------------
  
  Serial.println("循环!!");

  mySwitch.send(raw,24);
  
  delay(2000);
  
  Serial.println("-----------------2s");
}

接收端

#include <U8g2lib.h>
#include <SPI.h>

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();


// 433 使用A0接受信号
const int pin433 = D1;

const int pinLed = LED_BUILTIN;

//SDA - D7
//SCL - D5
//A0/DC - D3
//RST - D4
//CS/SS - D8

//U8G2_ST7565_ERC12864_ALT_F_4W_HW_SPI u8g2(U8G2_MIRROR, /* cs=*/ 9, /* dc=*/ 7, /* reset=*/ 8);  // contrast improved version for ERC12864
U8G2_ST7565_ERC12864_ALT_F_4W_HW_SPI u8g2(U8G2_MIRROR, /* cs=*/ D8, /* dc=*/ D3, /* reset=*/ D4);



void setup() {
  delay(50);
  Serial.begin(115200);
  delay(50);
  
  Serial.println("加载!!");
  Serial.print("pin:");
  Serial.println(pin433);

  mySwitch.enableReceive(pin433);
  
  Serial.print("LED:");
  Serial.println(pinLed);
  
  u8g2.begin();

  u8g2.clearBuffer();
  u8g2_prepare();
  u8g2.drawStr(0,0, "Test ...");
  u8g2.sendBuffer();
  delay(200);
  
}

void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(1);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}

char buf[24];
long long24;

void loop() {
  
  if (mySwitch.available()) {
    Serial.print("收到...");
    
    u8g2.clearBuffer();
    u8g2_prepare();
    u8g2.drawStr(0,0, "Available...");
    u8g2.sendBuffer();
    Serial.println("--------2 " + mySwitch.getReceivedValue());
    if (mySwitch.getReceivedValue() == 0) {
      u8g2.drawStr(0,20, "Unknown encoding");
      u8g2.sendBuffer();
      Serial.print("Unknown encoding");
      delay(100);
    } else {
      long24 = mySwitch.getReceivedValue();
      Serial.print("Received ");
//      Serial.print( mySwitch.getReceivedValue() );
      Serial.print( long24 );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.print( mySwitch.getReceivedProtocol() );
      Serial.print(" Delay: ");
      Serial.print( mySwitch.getReceivedDelay() );
//      Serial.print(" Rawdata: ");
//      Serial.println( mySwitch.getReceivedRawdata());
      
      u8g2.drawStr(0,20, "Received");
//      u8g2.drawStr(30,30, (char*)mySwitch.getReceivedValue());
      sprintf(buf, "%d",long24);
      u8g2.drawStr(0,30, buf);
      float celsius = (float)long24/16.0;
      sprintf(buf, "%f C",celsius);
      u8g2.drawStr(0,40, buf);
      
      u8g2.sendBuffer();
    }

    Serial.println("delay 1s");
    delay(100);
    mySwitch.resetAvailable();
  }
  
}

关于使用 OneWire库的 DS18B20温度的计算,怎么来的不清楚了,按照demo获取的整数需要除16.0获得的float数据是温度

RC-Switch按照例子参考,发送接收最大是24位二进制,不足的会补0传送

比如1 发送的时候是 000000000000000000000001

一般遥控器上都会是固定前20位,最后4位组合成4个按键比如 1000 0100 0010 0001

知乎上看到可以通过315/433收发字符串helloworld,暂时还没研究

实际测试没有天线的情况下 315传送也就2-3米距离,穿墙1-2米,前提都是pcb板子方向都为信号比较好的收发位置,pcb方向不好的时候1米都是问题。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值