複数のことを行うコードがあり、さまざまな種類の割り込みに関する情報が必要です。私のコードのほとんどはイベントベースです。そのため、タイマーを使用して特定のイベントを呼び出しています。ただし、一部のイベントが発生すると、別のイベント用に構成したリレーが短時間オンとオフを繰り返すことになります。
たとえば、コードの一部がインターネットにアクセスし、サーバー内のフォルダーにあるテキスト ファイルのステータスを読み取ります。値が 0 の場合、リレーはオフです。値が 1 の場合、リレーはオンです。現在、ファイルの変更を読み取るために、30 秒ごとにポーリングしています。そのテキストファイルに書き込むことができるphpスクリプトがあります。その間、1 時間ごとにデータを Web に送信する別のイベントがあります。データを送信すると、データが送信される前の初期状態に応じて、リレーのステータスが一瞬オンまたはオフになります。
テキストファイルに書き込みをしていないため、テキストファイルの状態が変更されていないことがわかっている場合でも、リレーをオンまたはオフのままにしておく必要があることを知っているので、ちょっと面倒です。したがって、他のイベントにより、私が指示しなくてもリレーがオンまたはオフになります。これはどうしてですか?割り込みは機能しますか?内部、外部?私はまだデータを送信したいのですが、リレーのステータスが同じであることを望んでいるので、両方が優先されます。コードでそれをどのように説明しますか?
コードの一部を以下に掲載します。ご覧のとおり、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);
}
}