查看: 3093|回复: 1

《SaiAren笔记arduino 温度篇-DS18B20》SaiAren

[复制链接]
  • TA的每日心情
    开心
    2019-6-16 01:52
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2018-1-20 00:20 | 显示全部楼层 |阅读模式
    本帖最后由 saiaren 于 2018-1-27 21:01 编辑

    前面一篇入门玩转了 触摸开关 和 继电器模块的控制现在开玩温度
    材料表
    DS18B20 (某宝买的防水做的不行 自己又打了一遍胶)
    MAGE 2560(USB真啊真方便 )
    4.7K---10K电阻 (上拉电阻用 我用的10k)
    DS18B20.h库 (arduino IDE 项目-加载库-管理库里面下载)
    OneWire.h库 (arduino IDE 项目-加载库-管理库里面下载)
    接线
    DS18B20 为三线  GND VCC DATA  总线接法
    VCC焊接10K电阻焊接DATA

    DATA接 任意 数字脚
    实验开始
    !!! DS18B20 是有地址的 首先得读取地址

    [mw_shl_code=c,true]#include <OneWire.h>
    OneWire  ds(3);  // 连接arduino 3引脚

    void setup(void) {
      Serial.begin(9600);//输出串口 (IDE 工具-串口监视器 查看数据)
    }

    void loop(void) {
      byte i;
      byte present = 0;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;
       
      if ( !ds.search(addr)) {
        Serial.println("No more addresses.");
        Serial.println();
        ds.reset_search();
        delay(250);
       return;
      }
       
      Serial.print("ROM =");
      for( i = 0; i < 8; i++) {
        Serial.write(' ');
        Serial.print(addr, HEX);
      }

      if (OneWire::crc8(addr, 7) != addr[7]) {
          Serial.println("CRC is not valid!");
          return;
      }
      Serial.println();
      
      // 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 = ds.read();
        Serial.print(data, HEX);
        Serial.print(" ");
      }
      Serial.println(" CRC=");
      Serial.print(OneWire::crc8(data, 8), HEX);
      Serial.println();

      // convert the data to actual temperature

      unsigned int raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // count remain gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw << 2; // 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
      }
      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");
    }[/mw_shl_code]

    读出来的地址是16进制 要转换成10进制
    然后才是读取温度
    [mw_shl_code=bash,true]#include <OneWire.h>
    #include <DS18B20.h>

    // Low/high alarm in degrees Celcius.
    #define LOW_ALARM 50
    #define HIGH_ALARM 100

    // 1-Wire devices connected to digital pin 2 on the Arduino.
    DS18B20 ds(3);//3

    // Address of the device.
    uint8_t address[] = {40, 255,225, 36, 162, 23, 5, 37};//
    int jdq=2;//继电器1
    int jdqq=3;//继电器2
    boolean a= true;
    // Indicates if the device was successfully selected.
    uint8_t selected;

    void setup()
    {
      Serial.begin(9600);
      pinMode(jdq,OUTPUT);
      pinMode(jdqq,OUTPUT);
      // Select device.
      selected = ds.select(address);

      if(selected)
      {
        // Set alarms.
        ds.setAlarms(LOW_ALARM, HIGH_ALARM);
      }
      else
      {
        Serial.println("Device not found!");
      }
    }

    void loop()
    {
      if(a){
         digitalWrite(jdq,HIGH);
         digitalWrite(jdqq,HIGH);
          a=false;
        }
      // Check if the device has an active alarm condition.
      if(selected)
      {
        if(ds.hasAlarm())
        {
         Serial.println(ds.getTempC());
        double c=ds.getTempC();
        if(c<=30){
           digitalWrite(jdq,LOW);
           digitalWrite(jdqq,HIGH);
         }
        if(c>30){
           digitalWrite(jdqq,LOW);
           digitalWrite(jdq,HIGH);
         }
        }else{
              Serial.println(" 666");
          }
      }
      else
      {
        Serial.println("Device not found!");
      }
      
      // Wait 10 seconds.
      delay(1000);//1秒暂停
    }[/mw_shl_code]
    这里我又加入了 继电器模块
    当温度低于等30度时开启继电器1关闭继电器2
    当温度高于等30度时开启继电器2关闭继电器1
    感谢此贴的接线图 让我明白潜水款的可能没给 上位电阻

    多个ds18b20 总线并联时 注意电流要足够每个ds18b20的需求 及1ma(每个)
    在实验中发现TF232+328p 总线多个会导致不正常
    http://www.arduino.cn/forum.php?mod=viewthread&tid=1345&highlight=DS18B20


    捕获.PNG
  • TA的每日心情
    奋斗
    2020-9-25 00:04
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2020-8-14 19:20 | 显示全部楼层
    太感谢了,我也一直搞不明白潜水款的是怎么回事,这个图真的是太棒了,一看立马就明白了。莫名开心,谢谢大佬~
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    String类型做参数传递时出现问题
    String类型做参数传递时出
    有两个函数,上面这个用来获取数据,然后第70行调用下面的Price_Analyze()来分析数据
    [Arduino物联网开发实战0]开发准备
    [Arduino物联网开发实战0]
    郑重提示:物联网开发,需要你有较好的编程基础,如果你没有编程基础或Arduino开发基
    兩段式水位的程式,要如何寫呢?可以指導一下嗎?
    兩段式水位的程式,要如何
    想請教大大兩段式水位的程式,要如何寫呢?可以指導一下嗎? 兩段式水位 滿水100%時停止
    点灯里面的 定时任务,按指定时间触发 开关 没效果.怎么...
    点灯里面的 定时任务,按
    #define BLINKER_WIFI #include char auth[] = "e9b348c25011"; char ssid[] = "88
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表