Arduino中断和同时活动
我有一些代码可以做很多事情,我想了解一些关于各种中断的信息。我的大部分代码都是基于事件的。所以我用定时器来调用某些事件。但是,当一些事件发生时,我为不同事件配置的中继会在短时间内打开和关闭 例如,一段代码进入internet并读取我的服务器文件夹中文本文件的状态。如果该值为0,则继电器断开;如果该值为1,则继电器接通。目前,我每30秒轮询一次,以便读取文件上的更改。我有一个php脚本,它允许我写那个文本文件。同时,我还有一个每小时向网络发送数据的事件。当我发送数据时,根据发送数据之前的初始状态,继电器的状态会在短时间内打开或关闭 这有点烦人,因为我知道当我知道文本文件没有改变它的状态时,继电器应该保持打开或关闭,因为我没有对它进行写入。因此,另一个事件不知何故导致继电器在我不告诉它的情况下打开或关闭。这是怎么回事?会干扰工作吗?内部的,外部的?我仍然希望发送数据,并且仍然希望中继的状态表示相同,以便它们都具有优先级。你如何在代码中解释这一点 下面是一段代码。正如您所看到的,每6分钟或360秒,我发出一个请求并发送数据,每20秒我发出一个读取文件的请求。因此,当6分钟事件的时间警报熄灭时,有一个短暂的5-10状态,其中来自其他事件的继电器接通或断开Arduino中断和同时活动,arduino,arduino-ide,Arduino,Arduino Ide,我有一些代码可以做很多事情,我想了解一些关于各种中断的信息。我的大部分代码都是基于事件的。所以我用定时器来调用某些事件。但是,当一些事件发生时,我为不同事件配置的中继会在短时间内打开和关闭 例如,一段代码进入internet并读取我的服务器文件夹中文本文件的状态。如果该值为0,则继电器断开;如果该值为1,则继电器接通。目前,我每30秒轮询一次,以便读取文件上的更改。我有一个php脚本,它允许我写那个文本文件。同时,我还有一个每小时向网络发送数据的事件。当我发送数据时,根据发送数据之前的初始状态,
#include "Wire.h"
#include "DS1307RTC.h"
#include "DHT.h"
#include "PID_v1.h"
#include "SPI.h"
#include "Time.h"
#include "TimeAlarms.h"
#include "WiFi.h"
#define SensorPin 2
#define Offset 0
#define DHTPIN 2
#define DHTTYPE DHT11
#define RELAY_ON 1
#define RELAY_OFF 0
#define Relay1 9
#define Relay2 8
#define Relay3 6
#define Relay4 5
#define Relay5 4
#define Relay6 3
#define Relay7 38
#define Relay8 39
char server[] = "xx"; //IPAddress server(54,200,69,220);
char ssid[] = "xx"; //SSID Home Network Name
char pass[] = "xx"; //Key or Network Password
int status = WL_IDLE_STATUS;
int analogChannel0 = 0; //Soil Moisture Sensor
int flag = 0;
unsigned long int avgValue;
WiFiClient client;
int xx = 300;
int zz = 20;
int ww = 360;
double Setpoint, Input, Output;
//onTime(18,20,25)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Setpoint = 7;
dht.begin();
Wire.begin();
//myPID.SetSampleTime(30000);
digitalWrite(Relay1, RELAY_ON);
digitalWrite(Relay2, RELAY_ON);
digitalWrite(Relay3, RELAY_ON);
digitalWrite(Relay4, RELAY_ON);
digitalWrite(Relay5, RELAY_ON);
digitalWrite(Relay6, RELAY_ON);
digitalWrite(Relay7, RELAY_ON);
digitalWrite(Relay8, RELAY_ON);
pinMode(Relay1, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
pinMode(Relay5, OUTPUT);
pinMode(Relay6, OUTPUT);
pinMode(Relay7, OUTPUT);
pinMode(Relay8, OUTPUT);
Serial.begin(9600);
setSyncProvider(RTC.get);
Alarm.timerRepeat(ww, SendData);
Alarm.timerRepeat(zz, ReadData);
while ( status != WL_CONNECTED) {
status = WiFi.begin(ssid, pass);
}
} //End of Void Setup
void loop() {
Alarm.delay(0);
} //End of Loop
void SendData(){
if (client.connect(server, 80)) {
tmElements_t tm;
int SoilMoisture = analogRead(analogChannel0);
client.print("GET xx");
client.print("&SoilMoisture=");
client.print(SoilMoisture);
client.print("&Setpoint=");
client.println(Setpoint);
}
}
void ReadData()
{
if (client.connect(server, 80)) {
client.println("GET xx.txt HTTP/1.1");
client.println("Host: xx");
client.println("Connection: close"); //tell the server that we expect it to close the connection. if we dont do this it should keep the connection open.
client.println();
}
flag = 0;
while (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '0'){
flag = 0;
}
if (c == '1'){
flag = 1;
}
}
if (flag == 0) {
digitalWrite(Relay3, LOW);
}
if (flag == 1) {
digitalWrite(Relay3, HIGH);
}
}
听起来你的部分代码在不应该的情况下短暂地旋转继电器-你能发布一些代码来显示继电器的驱动位置吗?同时检查你的ram使用情况,确保在中断之间共享时使用易失性变量,并且记住中断应该很快,因为它们阻止了其他中断,破坏了时间敏感的代码