Ethernet.begin() 防止 lcd.print() 显示 16x2

问题描述

我正在尝试使用 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