Arduino中断和同时活动

Arduino中断和同时活动,arduino,arduino-ide,Arduino,Arduino Ide,我有一些代码可以做很多事情,我想了解一些关于各种中断的信息。我的大部分代码都是基于事件的。所以我用定时器来调用某些事件。但是,当一些事件发生时,我为不同事件配置的中继会在短时间内打开和关闭 例如,一段代码进入internet并读取我的服务器文件夹中文本文件的状态。如果该值为0,则继电器断开;如果该值为1,则继电器接通。目前,我每30秒轮询一次,以便读取文件上的更改。我有一个php脚本,它允许我写那个文本文件。同时,我还有一个每小时向网络发送数据的事件。当我发送数据时,根据发送数据之前的初始状态,

我有一些代码可以做很多事情,我想了解一些关于各种中断的信息。我的大部分代码都是基于事件的。所以我用定时器来调用某些事件。但是,当一些事件发生时,我为不同事件配置的中继会在短时间内打开和关闭

例如,一段代码进入internet并读取我的服务器文件夹中文本文件的状态。如果该值为0,则继电器断开;如果该值为1,则继电器接通。目前,我每30秒轮询一次,以便读取文件上的更改。我有一个php脚本,它允许我写那个文本文件。同时,我还有一个每小时向网络发送数据的事件。当我发送数据时,根据发送数据之前的初始状态,继电器的状态会在短时间内打开或关闭

这有点烦人,因为我知道当我知道文本文件没有改变它的状态时,继电器应该保持打开或关闭,因为我没有对它进行写入。因此,另一个事件不知何故导致继电器在我不告诉它的情况下打开或关闭。这是怎么回事?会干扰工作吗?内部的,外部的?我仍然希望发送数据,并且仍然希望中继的状态表示相同,以便它们都具有优先级。你如何在代码中解释这一点

下面是一段代码。正如您所看到的,每6分钟或360秒,我发出一个请求并发送数据,每20秒我发出一个读取文件的请求。因此,当6分钟事件的时间警报熄灭时,有一个短暂的5-10状态,其中来自其他事件的继电器接通或断开

#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使用情况,确保在中断之间共享时使用易失性变量,并且记住中断应该很快,因为它们阻止了其他中断,破坏了时间敏感的代码