问题描述
我正在尝试使用 W1500 屏蔽(我认为它被称为)来实现一个网络服务器,它也链接到一个 16x2 LCD 和一些 DHT22 传感器。在我的设置函数中,我有 Ethernet.begin(mac,ip);
但我只能在调用 lcd.print()
之前使用 Ethernet.begin()
函数。调用此函数后,任何 lcd.print()
都没有任何效果(即使在循环中,print 函数也不执行任何操作)。
什么会导致这种情况,我该如何解决?
谢谢!
(这是我的第一篇文章,我肯定做错了什么,所以请告诉我!)
#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <Vector.h>
#include <LiquidCrystal.h>
#define DHTPIN1 6
#define DHTPIN2 7
#define DHTPIN3 8
#define DHTTYPE DHT22
DHT dht[] = {
{DHTPIN1,DHT22},{DHTPIN2,{DHTPIN3,};
byte mac[] = {
0xDE,0xAD,0xBE,0xEF,0xFE,0xED
};
byte ip[] = { 10,99 };
EthernetServer server(80);
float h[3];
float t[3];
float tf[3];
float avgTempC = 0.00;
float avgTempF = 0.00;
float avgHumid = 0.00;
const int rs = 12,en = 11,d4 = 5,d5 = 4,d6 = 3,d7 = 2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
void setup()
{
lcd.begin(16,2);
// THIS CORRECTLY PRINTS TO LCD
lcd.print("TEMP: HUMID:");
for (auto& sensor : dht) {
sensor.begin();
}
Ethernet.begin(mac,ip);
server.begin( );
// HERE IS WHERE IT DOES NOT WORK
String avgTString = String(avgTempF);
String avgHString = String(avgHumid);
lcd.setCursor(0,1);
lcd.print(avgTString + "F");
lcd.setCursor(8,1);
lcd.print(avgHString + "%");
Serial.print("server.begin() called\n");
}
void loop() {...}
解决方法
您没有提到您实际使用的以太网板和微控制器板。
请检查您的以太网屏蔽使用了哪些引脚。请查看您的以太网屏蔽的技术说明。
如果您有 - 例如 - Arduino Ethernet Shield V1,您可以在此处找到详细信息: https://www.arduino.cc/en/Main/ArduinoEthernetShieldV1
Arduino 使用 SPI 总线(通过 ICSP 接头)与 W5100 和 SD 卡进行通信。这是在 Uno 上的数字引脚 10、11、12 和 13 以及 Mega 上的引脚 50、51 和 52 上。在两块板上,引脚 10 用于选择 W5100,引脚 4 用于选择 SD 卡。这些引脚不能用于通用 I/O。在 Mega 上,硬件 SS 引脚 53 不用于选择 W5100 或 SD 卡,但必须保留为输出,否则 SPI 接口将无法工作。
您不能使用这些引脚与 LCD 通信 - 至少如果 LCD 不使用 SPI(例如,如果它通过 74HC595 移位寄存器连接),即使这样,您也必须取消选择其他 SPI 设备并然后选择 LCD 设备。 有关详细信息,请参阅: https://www.arduino.cc/en/reference/SPI