Arduino Uno搭配ENC28J60联网显示温度时无法输出小数问题
解决ENC28J60网页显示DS18B20温度仅出整数的问题
我刚看了你的代码,发现问题出在etherShield的print()方法对float类型的支持上——串口的Serial.print()能自动处理浮点数的小数部分,但ETHER_28J60库的print()方法并没有实现浮点数的重载,当你直接传入float类型的TempDS时,它会被自动转换成整数,自然就丢掉了小数部分。
这里给你两种可行的解决方案:
方案1:用dtostrf()把浮点数转成字符串打印
这是最简便的方法,利用Arduino自带的dtostrf()函数把浮点数转换成指定格式的字符串,再传给ethernet.print():
修改loop()里的网页输出部分:
if (ethernet.serviceRequest()){ ethernet.print("<H1>当前温度</H1>"); // 把浮点数转成字符串,参数分别是:浮点数、总字符宽度、小数位数、目标数组 char tempString[10]; dtostrf(TempDS, 4, 2, tempString); ethernet.print(tempString); ethernet.print(" °C"); ethernet.respond(); }
方案2:拆分整数和小数部分分别打印
如果你不想用字符串转换,也可以手动把温度拆成整数和小数部分,分别打印:
if (ethernet.serviceRequest()){ ethernet.print("<H1>当前温度</H1>"); // 提取整数部分 int tempInt = (int)TempDS; // 提取小数部分(保留两位) int tempFrac = (int)((TempDS - tempInt) * 100); // 分别打印整数、小数点、小数 ethernet.print(tempInt); ethernet.print("."); // 处理小数部分不足两位的情况(比如0.5会变成5,这里补0) if(tempFrac < 10){ ethernet.print("0"); } ethernet.print(tempFrac); ethernet.print(" °C"); ethernet.respond(); }
修改后的完整代码
#include <OneWire.h> #include <DallasTemperature.h> #define DS18B20 2 OneWire ourWire(DS18B20); DallasTemperature sensors(&ourWire); float TempDS; #include "etherShield.h" #include "ETHER_28J60.h" static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; static uint8_t ip[4] = {192, 168, 0, 15}; static uint16_t port = 80; ETHER_28J60 ethernet; void setup(){ ethernet.setup(mac, ip, port); Serial.begin(9600); delay(1000); sensors.begin(); } void loop(){ sensors.requestTemperatures(); TempDS = sensors.getTempCByIndex(0); Serial.print(TempDS); Serial.println(" C"); if (ethernet.serviceRequest()){ ethernet.print("<H1>当前温度</H1>"); char tempString[10]; dtostrf(TempDS, 4, 2, tempString); ethernet.print(tempString); ethernet.print(" °C"); ethernet.respond(); } }
这样修改后,网页上就能正常显示带小数的温度值了,和串口输出保持一致。
内容的提问来源于stack exchange,提问作者mojtaba khodadadi
相关产品推荐
相关产品推荐

