NodeMCU8266 SD卡和MAX31865 SPI通讯时MAX31865失灵-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1815|回复: 4

[未解决] NodeMCU8266 SD卡和MAX31865 SPI通讯时MAX31865失灵

[复制链接]
发表于 2021-11-13 15:37 | 显示全部楼层 |阅读模式
本帖最后由 风醒吹梦忱 于 2021-11-13 15:40 编辑

我想用NodeMCU8266在控制继电器开关的时候向TF卡记录铂电阻温度数据.
测量铂电阻的,MAX31865 和SD卡模块都是接的的 D5/D6/D7 SPI.
现在运行程序时MAX31865失灵,读出的温度固定为-242.02.
SD记录正常.
如果将代码中的SD.begin();注释,MAX31865恢复正常.
  1. #define BLINKER_WIFI

  2. #include <ESP8266WiFi.h>
  3. #include <Blinker.h>
  4. #include <DHT.h>
  5. #include <Adafruit_MAX31865.h>
  6. #include <SPI.h>
  7. #include <SD.h>

  8. #define JI_DIAN_QI D0//静态继电器接口D0 LOW开启 HIGH关闭
  9. //MAX31865 温度模拟信号转数字信号PT100=430 The value of the Rref resistor. Use 430.0!
  10. #define RREF 430.0
  11. // MAX3185接口(SPI通讯)Use software SPI: CS, DI, DO, CLK
  12. Adafruit_MAX31865 max1 = Adafruit_MAX31865(D2, D7, D6, D5);

  13. //初始化开发板WIFI
  14. char auth[] = "oooooooooooo";
  15. char ssid[] = "oooo";
  16. char pswd[] = "oooooo";

  17. /* 新建APP按钮组件对象*/
  18. //APP继电器按钮对象
  19. BlinkerButton JiDianQi("btn-jdq");

  20. //APP电流数值对象
  21. BlinkerNumber ELEC("num-dianliu");

  22. //APP线圈温度值对象 xian_quan_wen_du_read  num-xianquan
  23. BlinkerNumber XQTemperature("num-xianquan");

  24. //初始化电流变量
  25. float elec_read = 0;

  26. //初始化温度变量
  27. float xq_temperature_read = 0;

  28. // 创建File实例化对象 用于将数据记录SD卡
  29. File myFile;
  30. // 定义SD/TF卡模块cs引脚为D1
  31. const int sd_cs = D1;

  32. String xing_qi[] = {"日", "一", "二", "三", "四", "五", "六"};
  33. //当前时间变量
  34. String tag_time = "获取时间失败";


  35. void setup() {

  36.   //启动串口
  37.   Serial.begin(115200);

  38.   //点灯初始化
  39.   BLINKER_DEBUG.stream(Serial);

  40.   // 初始化blinker
  41.   Blinker.begin(auth, ssid, pswd);
  42.   JiDianQi.attach(jidianqi_diancifa);

  43.   //初始化继电器接口,设置继电器控制接口为输出模式
  44.   pinMode(JI_DIAN_QI, OUTPUT);
  45.   //默认关闭继电器 LOW开启 HIGH关闭
  46.   digitalWrite(JI_DIAN_QI, HIGH);

  47.   //初始化MAX31865
  48.   Serial.println("Adafruit MAX31865 PT100 Sensor Test!");
  49.   pinMode(D2,OUTPUT);
  50.   max1.begin(MAX31865_2WIRE);  // set to 2WIRE or 4WIRE as necessary

  51.   //SD/TF卡记录模块初始化
  52.   Serial.print("Initializing SD card...");
  53.   //SDCS并设置为输出OUTPUT模式
  54.   pinMode(sd_cs, OUTPUT);
  55.   if (!SD.begin(sd_cs))
  56.   {
  57.     Serial.println("SD initialization failed!");
  58.    
  59.   }else{
  60.     Serial.println("SD initialization done.");
  61.     }

  62.   //注册一个心跳包
  63.   Blinker.attachHeartbeat(heartbeat);

  64.   //初始化NTP时间,北京时间+8:00
  65.   Blinker.setTimezone(8.0);
  66. }

  67. void loop() {
  68.    //APP循环运行
  69.   Blinker.run();

  70.   //改变按钮图案
  71.   btnState();
  72.   
  73.   //SPI MAX31865采样  线圈温度(铂热电阻)采样
  74.   uint16_t rtd = max1.readRTD();

  75.   //Serial.print("RTD value: "); Serial.println(rtd);
  76.   float ratio = rtd;
  77.   ratio /= 32768;
  78.   //Serial.print("Ratio = "); Serial.println(ratio, 8);
  79.   // Serial.print("Resistance = "); Serial.println(RREF * ratio, 8);
  80.   Serial.print("Temperature = "); Serial.println(max1.temperature(100, RREF));
  81.   xq_temperature_read = max1.temperature(100, RREF);
  82.   XQTemperature.print(xq_temperature_read);
  83.   // Check and print any faults
  84.   uint8_t fault = max1.readFault();
  85.   if (fault) {
  86.     Serial.print("Fault 0x"); Serial.println(fault, HEX);
  87.     if (fault & MAX31865_FAULT_HIGHTHRESH) {
  88.       Serial.println("RTD High Threshold");
  89.     }
  90.     if (fault & MAX31865_FAULT_LOWTHRESH) {
  91.       Serial.println("RTD Low Threshold");
  92.     }
  93.     if (fault & MAX31865_FAULT_REFINLOW) {
  94.       Serial.println("REFIN- > 0.85 x Bias");
  95.     }
  96.     if (fault & MAX31865_FAULT_REFINHIGH) {
  97.       Serial.println("REFIN- < 0.85 x Bias - FORCE- open");
  98.     }
  99.     if (fault & MAX31865_FAULT_RTDINLOW) {
  100.       Serial.println("RTDIN- < 0.85 x Bias - FORCE- open");
  101.     }
  102.     if (fault & MAX31865_FAULT_OVUV) {
  103.       Serial.println("Under/Over voltage");
  104.     }
  105.     max1.clearFault();
  106.   }

  107.   //串口输出时间,测试
  108.   tag_time = "当前时间:"+String(Blinker.year()) + "年" + String(Blinker.month()) + "月" + String(Blinker.mday()) + "日  " + String(Blinker.hour()) + ":" + String(Blinker.minute()) + ":" + String(Blinker.second()) + "  星期" + xing_qi[Blinker.wday()];
  109.   Serial.println(tag_time);

  110.   Blinker.delay(2000);
  111. }

  112. //记录模块方法
  113. void jiluSD() {
  114.   //SD/TF打开文件。 一次只能打开一个文件
  115.   //必须先关闭该文件再打开另一个文件。
  116.   myFile = SD.open("jilu.txt", FILE_WRITE);

  117.   // 如果文件打开,则进行写入
  118.   if (myFile)
  119.   {
  120.     Serial.print("数据写入 jilu.txt...");
  121.     if (digitalRead(JI_DIAN_QI) == HIGH) {
  122.       //如果继电器为关闭状态
  123.       myFile.println(tag_time + "关");
  124.     } else {
  125.       myFile.println(tag_time + "开");
  126.     }
  127.     // 关闭文件打开状态
  128.     myFile.close();
  129.     Serial.println("写入结束.");
  130.   }
  131.   else
  132.   {
  133.     //如果文件没有打开,则向串口输出文件打开错误
  134.     Serial.println("error opening test.txt");
  135.     myFile.close();
  136.   }

  137. }



  138. //按钮组件对象绑定该函数,当点击按钮时调用函数
  139. void jidianqi_diancifa(const String & state) {
  140.   BLINKER_LOG("get button state: ", state);
  141.   digitalWrite(JI_DIAN_QI, !digitalRead(JI_DIAN_QI));
  142.   jiluSD();//记录到SD卡
  143.   //反馈继电器状态,改变图标颜色
  144.   btnState();

  145.   Blinker.vibrate();
  146. }

  147. //判断按钮状态函数
  148. void btnState() {
  149.   //反馈继电器状态,改变图标颜色
  150.   if (digitalRead(JI_DIAN_QI) == LOW) {
  151.     JiDianQi.icon("fas fa-burn");
  152.     JiDianQi.color("#00ff7f");//  #00FF7F绿色
  153.     JiDianQi.text("开启");
  154.   } else {
  155.     JiDianQi.icon("fas fa-burn");
  156.     JiDianQi.color("#ff0000");//  #FF0000红色
  157.     JiDianQi.text("关闭");
  158.   }
  159. }

  160. // 心跳包函数
  161. void heartbeat() {
  162.   //反馈继电器状态,改变图标颜色
  163.   btnState();
  164.   JiDianQi.print("on");

  165.   //APP电流数值
  166.   ELEC.print(elec_read);
  167. }
复制代码

接线图:
接线图.png
SD模块是5V ,MAX31865是3.3V.
感谢大佬们.



发表于 2021-11-13 18:27 | 显示全部楼层
软SPI和硬SPI用同一组IO,你是唯恐天下不乱啊
发表于 2021-11-14 22:29 | 显示全部楼层
这个控制板不熟悉,我在uno上使用11-13口做spi用,9和10做CS脚接两个max31865,没问题。
发表于 2021-12-18 16:53 | 显示全部楼层
大佬,我用max31865读出来的为什么全是这个
RTD value: 32766
Ratio = 0.99993896
Resistance = 429.97375488
Temperature = -242.02

RTD value: 32767
Ratio = 0.99996948
Resistance = 429.98687744
Temperature = 988.79
Fault 0xFF
RTD High Threshold
RTD Low Threshold
REFIN- > 0.85 x Bias
REFIN- < 0.85 x Bias - FORCE- open
RTDIN- < 0.85 x Bias - FORCE- open
Under/Over voltage

RTD value: 32767
Ratio = 0.99996948
Resistance = 429.98687744
Temperature = 988.79
Fault 0xFF
RTD High Threshold
RTD Low Threshold
REFIN- > 0.85 x Bias
REFIN- < 0.85 x Bias - FORCE- open
RTDIN- < 0.85 x Bias - FORCE- open
Under/Over voltage

用的arduino例子的程序,板子该焊接的也焊接了   三线制的
发表于 2022-3-13 09:58 | 显示全部楼层
楼主用的SD卡容量是多少呀,为啥我NodeMCU 初始化不了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 08:32 , Processed in 0.223474 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表