这是我之前发布的问题的改进代码。我想收到关于我目前正在做的一项任务的反馈。我得做两个红绿灯,这样才能使交通畅通。我使用一个主Arduino处理主串行通信和一个从Arduino处理光序列。如果Arduino主人断开连接,两盏灯都会变红。我必须使用SoftwareSerial库。情况如下:


#define SYNCHRONIZE "SYN"
#define SYNACK "SYN-ACK"
#define ACKNOWLEDGED "ACK"
#define BAUDRATE 9600
#define TIMEOUT 10#define MASTERPINS 2, 3
#define MASTEREVENT 50#include
#include
#include "Protocol.h"
#include "Master.h"
SoftwareSerial serial(MASTERPINS); // RX, TX
void setup()
{
Serial.begin(BAUDRATE); // Native USB connection
Serial.setTimeout(TIMEOUT);
while (!Serial)
{
; // Wait for serial port to connect
}
serial.begin(BAUDRATE); // SoftwareSerial connection
serial.setTimeout(TIMEOUT); // Maximum wait time
}
void loop()
{
static String readString; // String containing serial data
static bool sendACK = false; // Boolean regulating handshaking
/* Set string to incoming data. Once request to 'three-way handshake' has been acknowledged,
set boolean sendACK to true, allowing "ACK" to be sent. */
if (serial.available() > 0)
{
while (serial.available() > 0)
{
readString = serial.readString();
Serial.print(readString);
}
if (readString == SYNACK)
{
sendACK = true;
}
}
unsigned long currentTime = millis(); // Set current time
static unsigned long previousTime = 0; // Set previous time
/* Send "SYN" to initiate 'three-way handshake'. Once connection established, send "ACK" */
if ((currentTime - previousTime) > MASTEREVENT)
{
if (sendACK == false)
{
serial.print(SYNCHRONIZE);
Serial.print(SYNCHRONIZE);
}
else if (sendACK == true)
{
serial.print(ACKNOWLEDGED);
Serial.print(ACKNOWLEDGED);
sendACK = false;
}
previousTime = currentTime;
}
}#define SLAVEPINS 8, 9
#define SLAVEEVENT 200
#define REDLED1 2
#define YELLOWLED1 3
#define GREENLED1 4
#define REDLED2 5
#define YELLOWLED2 6
#define GREENLED2 7#include
#include
#include "Protocol.h"
#include "Slave.h"
SoftwareSerial serial(SLAVEPINS); // RX, TX
void setup()
{
// Multiple LED outputs
pinMode(REDLED1, OUTPUT);
pinMode(YELLOWLED1, OUTPUT);
pinMode(GREENLED1, OUTPUT);
pinMode(REDLED2, OUTPUT);
pinMode(YELLOWLED2, OUTPUT);
pinMode(GREENLED2, OUTPUT);
serial.begin(BAUDRATE); // SoftwareSerial connection (baudrate 9600)
serial.setTimeout(TIMEOUT); // Maximum wait time
}
void loop()
{
static String readString; // String containing serial data
static long counter = 0; // Counter
static bool setLight = false; // Turn lights on once
unsigned long currentTime = millis(); // Set current time
static unsigned long previousTime = 0; // Set previous time
/* Set string to incoming data. Establish 'three-way handshake' and count the amount
of times handshaking performed. Set lights according to the handshakes counted. */
if (serial.available() > 0)
{
while (serial.available() > 0)
{
readString = serial.readString();
}
if (readString == SYNCHRONIZE)
{
serial.print(SYNACK);
}
else if (readString == ACKNOWLEDGED)
{
switch (counter)
{
case 0:
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
break;
case 10:
digitalWrite(GREENLED1, HIGH);
digitalWrite(REDLED1, LOW);
break;
case 40:
digitalWrite(YELLOWLED1, HIGH);
digitalWrite(GREENLED1, LOW);
break;
case 50:
digitalWrite(REDLED1, HIGH);
digitalWrite(YELLOWLED1, LOW);
break;
case 60:
digitalWrite(GREENLED2, HIGH);
digitalWrite(REDLED2, LOW);
break;
case 90:
digitalWrite(YELLOWLED2, HIGH);
digitalWrite(GREENLED2, LOW);
break;
case 100:
digitalWrite(REDLED2, HIGH);
digitalWrite(YELLOWLED2, LOW);
break;
}
counter++;
if (counter > 100)
{
counter = 0;
}
}
setLight = false;
previousTime = currentTime;
}
// If handshake did not work, wait for 200 milliseconds and set traffic lights to red.
else if ((currentTime - previousTime) > SLAVEEVENT && !setLight)
{
digitalWrite(REDLED1, HIGH);
digitalWrite(REDLED2, HIGH);
digitalWrite(YELLOWLED1, LOW);
digitalWrite(YELLOWLED2, LOW);
digitalWrite(GREENLED1, LOW);
digitalWrite(GREENLED2, LOW);
counter = 0;
setLight = true;
}
}Please给我反馈了我的代码,以及哪些部分我可以做得更好和/或更有效率。谢谢!
发布于 2020-03-14 18:21:56
Separate引脚定义
更清晰更容易维护。
//#define SLAVEPINS 8, 9
//SoftwareSerial serial(SLAVEPINS); // RX, TX
#define SLAVEPINS_RX 8
#define SLAVEPINS_TX 9
SoftwareSerial serial(SLAVEPINS_RX, SLAVEPINS_TX);Code警卫
#ifndef _SLAVE_H
#define _SLAVE_H 1
#define SLAVEPINS 8, 9
#define SLAVEEVENT 200
....
#endif还请参见#pragma once
名称空间控件的Suggest前缀
考虑文件名
//#define SLAVEEVENT 200
//#define REDLED1 2
//#define REDLED2 5
#define SLAVE_EVENT 200
#define SLAVE_REDLED1 2
#define SLAVE_REDLED2 5<#>Use标准头文件
代码在static bool sendACK中使用D5,但缺少所需的包含。不要依赖其他的包含来提供这个定义。
#include Use单位
50什么?微型,米莉,几秒钟?
// #define MASTEREVENT 50
#define MASTEREVENT 50 /* ms */Hardware idea
而不是两个腿的LED热,放置一个在地面和电阻在热的一面。更安全和更常见的可使用的部分(灯)有一边的地面。
///
也许以后会更多。
https://codereview.stackexchange.com/questions/238888
复制相似问题