设置引脚模式时 Wemos D1 重置

Wemos D1 reset when setting pins mode

我正在建造一辆小车,由 Wemos D1 板远程控制,以设置 WiFi 连接和控制逻辑我是 运行 这个脚本:

#include <ESP8266WiFi.h>

const char* pass = "**********";
const char* ssid = "**********";

IPAddress ip(192,168,1,91);
IPAddress gat(192,168,1,1);
IPAddress dns(192,168,1,1);
IPAddress sub(255,255,255,0);

WiFiServer s(2000);

int inA1 = 1;
int inA2 = 2;
int enA = 3;
int inB1 = 4;
int inB2 = 5;
int enB = 6;
int trigger = 7;
int echo = 8;
double vSuono = 343; //Unità di misura: m/s
int speed = 255;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  WiFi.config(ip,gat,sub,dns);
  WiFi.begin(ssid,pass);
  delay(500);

  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.println(".");
  }

  Serial.println("Connected!");
  delay(30);

  s.begin();
  Serial.println("Server running!");
  delay(30);

  //Here starts the problems
  pinMode(inA1,OUTPUT);
  pinMode(inA2,OUTPUT);
  pinMode(enA,OUTPUT);
  pinMode(inB1,OUTPUT);
  pinMode(inB2,OUTPUT);
  pinMode(enB,OUTPUT);
  pinMode(trigger,OUTPUT);
  pinMode(echo,INPUT);
  delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient c = s.available();
  delay(30);
  if(c){
    Serial.println("New client connected!");
    delay(3);
    while(c.connected()){
      if(c.available()){
        String command = c.readStringUntil('\n');

        if(command == "forward"){
          Serial.println("forward");
          forward(speed);
        }else if(command == "right"){
          Serial.println("right");
          right(speed);
        }else if(command == "left"){
          Serial.println("left");
          left(speed);
        }else{
          Serial.println("back");
          back(speed);
        }
      }
      delay(30);
    }
    c.stop();
  }
}

void forward(int velocita){
  digitalWrite(inA1,HIGH);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,HIGH);
  digitalWrite(inB2,LOW);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void left(int velocita){
  digitalWrite(inA1,HIGH);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,HIGH);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void right(int velocita){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,HIGH);
  digitalWrite(inB1,HIGH);
  digitalWrite(inB2,LOW);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void back(int velocita){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,HIGH);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,HIGH);
  analogWrite(enA,velocita);
  analogWrite(enB,velocita);
}

void stop(){
  digitalWrite(inA1,LOW);
  digitalWrite(inA2,LOW);
  digitalWrite(inB1,LOW);
  digitalWrite(inB2,LOW);
}

问题是当板子在setup()块中执行pinMode函数时,板子停止执行,崩溃并重启,我无法ping通板子。 如果我用 pinMode 调用注释 setup() 块的所有部分,程序开始工作,但显然我不能使用引脚。 当板子崩溃时在串行监视器上出现此消息:

 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld

可能是什么问题?

我不太了解引脚映射,但您应该坚持使用名为 D1、D2...D8 的 GPIO 引脚。您已将它们命名为 1、2...8,它们是不同的引脚。您可能使用了被其他东西使用的引脚(例如串行或重置)。

int inA1 = D1;
int inA2 = D2;
int enA = D3;
int inB1 = D4;
int inB2 = D5;
int enB = D6;
int trigger = D7;
int echo = D8;

我在尝试将 pinMode 与 digitalWrite() 函数结合使用时遇到了同样的 wdt 重置错误。 我通过弄清楚 Wemos Pin 映射的工作原理解决了这个问题。 实际上,您需要以 'Dx' 表示法引用引脚。 例如 digitalWrite(D15,LOW);

pinMode(D15, OUTPUT);

此外,请确保在“工具”>“电路板”中 select "Wemos D1 R1" 以便 Dx 常量匹配 标签。

查看 Arduino 论坛上的对话以了解有关 wemos 引脚映射的更多信息: https://forum.arduino.cc/index.php?topic=545113.0