/*Überwachungsprogramm vom 27. Januar 2017, gekürzt von heha
Für Arduino Mega2560. Ein monströses Programm, ca. 44 kByte.
Arduino-Anschlüsse:
0 I RxD Seriell vom USB-Konverter
1 O TxD Seriell zum USB-Konverter (= programmierter AT90USB162)
2 I Watchdog-Timer (Wechselsignal vom LabVIEW-Programm und NI USB-6001)
3 I Rauchmelder MC145012
4 O (CS2) Ethernet-Shield: SD-Karte
5 O Test „Anschließen an Pin 2, um Messkartensignal zu simulieren“
6
7 I/O ge OneWireBus zum DS18B20, Pullup 4k7 nach 5V extern
8
9
10 (CS1) Ethernet-Shield: Controller W5100
11 O MOSI Ethernet-Shield: W5100 + SD-Karte
12 I MISO Ethernet-Shield: W5100 + SD-Karte
13 O SCLK Ethernet-Shield: W5100 + SD-Karte
A0 AI rs Spannung vom Gassensor MICS5524
--- Nur bei „großen“ Arduinos ---
19 O Relais
20 I/O I²C-SDA gn Pyrometer
21 O I²C-SCL ge Pyrometer MLX90614KSE (Pullup 4k7 nach 5V extern)
Der I²C-Bus wird nicht mehr verwendet.
FEHLER: Der Rauchmelder wird mit 5 V statt 6..12 V betrieben
FEHLER: Das Pin 7 des Rauchmelder-ICs (bidirektional) wird nicht verwendet, stattdessen der LED-Ausgang (= Quatsch)
Standardpasswort des alten Webmonitoring-Tools
Benutzer: admin, Passwort: sintern
Netzwerkadresse des PCs: http://admin:sintern@134.109.28.26:8003/image_publisher/index.html
oder http://admin:sintern@ewasc024:8003/image_publisher/index.html
Mit dem jetzigen LabVIEW-Programm ist kein Passwort festgelegt:
http://ewasc024:8003/
Die Portadresse (8003) kann im Programm festgelegt werden.
MAC-Adresse des Ethernet-Shields: 00 0F EA 31 89 D1
Die bisherige Arduino-Software löst das Sendmail-Problem
(nämlich: Authentifizierung erforderlich) über eine Google-Adresse.
Google-Sendmail-Adresse:
Konto: sinterofen.arduino@gmail.com
Passwort: QTw(e(9;
Ersatzkodes für diese Adresse:
63095946 25881123 27732944 09392224 74516898
05435507 62114349 18084244 08607907 74522319
Ich (henni) würde das über den Webserver der TU Chemnitz lösen.
*/
//#include <SD.h> // SD-Kartenzugriff und FAT-Dateisystem
//#include <Ethernet.h> // zum Email versenden
//#include <Temboo.h> // zum Email versenden (geht das nicht eleganter??)
//#include "TembooAccount.h"
#include <OneWire.h> // für den (einen) Temperatursensor
#include <DallasTemperature.h>
#include <Adafruit_MLX90614.h>
namespace PIN{
enum{
interrupt = 2,
test = 5, //with GPIO 5 you can check the output
onewire = 7,
stat = 13,
relais = 19,
};
}
//************sensor variables***************
OneWire oneWire(PIN::onewire);
DallasTemperature sensors(&oneWire);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
DeviceAddress tempDeviceAddress;
int ds18b20_wait;
unsigned long t_lastheartbeat;
volatile int counter;
int counter_old;
volatile int smoke_counter;
int smoke_counter_old;
unsigned long t_lastsmoke;
int problemcounter;
//**************SD CARD VARIABLES**********************
float U_Gas_Max = 3.5;
int T_Ofen_Max = 200;
int t_timeout = 10000; // 10 s
String Emailto = "johannes.rudolph@etit.tu-chemnitz.de";
//**************ETHERNET*****************
//byte ethernetMACAddress[] = ETHERNET_SHIELD_MAC;
//EthernetClient client;
int numRuns = 1; // Execution count, so this doesn't run forever
int maxRuns = 10; // Maximum number of times the Choreo should be executed
//bool ethernet_connected = false;
//*******status variables*****
byte testPinState = LOW;
const char*Stop_Reason;
byte blinking = LOW;
void setup() {
Serial.begin(115200);
mlx.begin(); // I²C-Pyrometer MLX90614
sensors.begin(); // OneWire-Temperatursensor DS18B20
// *************SETUP Interrupt to check the looptime of the control unit*************
pinMode(PIN::interrupt, INPUT);
attachInterrupt(digitalPinToInterrupt(PIN::interrupt), reset_timer, FALLING);
// *************SETUP digital Outputs*************
pinMode(PIN::relais, OUTPUT);
digitalWrite(PIN::relais, LOW);
pinMode(PIN::stat, OUTPUT);
digitalWrite(PIN::stat, LOW);
pinMode(PIN::test, OUTPUT);
/*
// *************Read Config from SD Card*************
Serial.print("Initializing SD card...");
if (!SD.begin(4)) Serial.println("initialization failed!");
Serial.println("initialization done.");
//******************************************GET CONFIG DATA FROM SD CARD*************************************
File f = SD.open("TObj.txt");
if (f) {
// read from the file until there's nothing else in it:
while (f.available()) {
T_Ofen_Max = f.parseInt();
}
// close the file:
f.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening T_Object.txt, using init. value instead");
}
f = SD.open("VMICS.txt");
if (f) {
// read from the file until there's nothing else in it:
while (f.available()) {
U_Gas_Max = f.parseFloat();
}
// close the file:
f.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening V_MICS.txt, using init. value instead");
}
f = SD.open("ttimeout.txt");
if (f) {
// read from the file until there's nothing else in it:
while (f.available()) {
t_timeout = f.parseInt();
}
// close the file:
f.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening t_timeout.txt, using init. value instead");
}
f = SD.open("Emailto.txt");
if (f) {
// read from the file until there's nothing else in it:
Emailto = "";
while (f.available()) {
Emailto += char(f.read());
}
// close the file:
f.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening Emailto.txt, using init. value instead");
}
*/
Serial.println("Setup complete.");
}
void loop() {
digitalWrite(PIN::test, !testPinState); //this is for testing the timeout
testPinState = !testPinState;
if (!counter) {
Serial.println("Control program not yet started.");
digitalWrite(PIN::stat, blinking);
blinking = !blinking;
}
if (!counter || counter != counter_old) {
t_lastheartbeat = millis();
counter_old = counter;
}
int lasttime = millis() - t_lastheartbeat;
// ********************* Check if timed out**************************
if (lasttime > t_timeout) Stop_Reason = "Control Unit timed out.";
// *** Measure and emit ***
Serial.print(F("watchdog=")); Serial.print(String(lasttime)); Serial.println(F("ms"));
sensors.requestTemperatures();
float U_Gas = analogRead(A0) * 5.0 / 1023.0;
if (U_Gas<=U_Gas_Max) {
Serial.print(F("U_Gas=")); Serial.print(U_Gas); Serial.println(F("V"));
}
float T_Ofen = sensors.getTempCByIndex(0);
if (5<=T_Ofen && T_Ofen<=T_Ofen_Max) {
Serial.print(F("T_Ofen=")); Serial.print(T_Ofen); Serial.println(F("degC"));
}
float T_Raum = mlx.readAmbientTempC(); // Manchmal kommt eine riesige Zahl
if (5<=T_Raum && T_Raum<=125) {
Serial.print(F("T_Raum=")); Serial.print(T_Raum); Serial.println(F("degC"));
}
float T_Objekt = mlx.readObjectTempC();
if (5<=T_Objekt && T_Objekt<=600) {
Serial.print(F("T_Objekt=")); Serial.print(T_Objekt); Serial.println(F("degC"));
}
/*
// *********************create string of meassured data**************************
String Daten = "watchdog=" + String(lasttime) + "ms\n"
+ "V_MICS5524=" + String(V_MICS5524) + "*V\n"
+ "T_Furnance=" + String(T_Ofen) + "*C\n"
+ "T_Raum="+String(T_Raum)+"*C\n"
+ "T_Objekt="+String(T_Objekt)+"*C\n";
*/
// *********************Check if values are in range**************************
if (U_Gas > U_Gas_Max or T_Ofen > T_Ofen_Max) ++problemcounter;
else problemcounter = 0;
if (problemcounter > 10) {
Stop_Reason = "Overtemperature or gas detected.";
}
// ********************* If Error: Set Relais AND SEND THE EMAIL **************************
if (Stop_Reason && digitalRead(PIN::relais)!=HIGH) {
Serial.print("DHCP: ");
#if 0
if (Ethernet.begin(ethernetMACAddress)) {
Serial.println("OK");
}else{
Serial.println("FAIL");
}
#endif
digitalWrite(PIN::relais, HIGH);
Serial.println("relais closed.");
digitalWrite(PIN::stat, HIGH);
#if 0
TembooChoreo SendMail(client);
// Invoke the Temboo client
SendMail.begin();
// Set Temboo account credentials
SendMail.setAccountName(TEMBOO_ACCOUNT);
SendMail.setAppKeyName(TEMBOO_APP_KEY_NAME);
SendMail.setAppKey(TEMBOO_APP_KEY);
// Set Choreo inputs
SendMail.addInput("FromAddress","\"Ofen\" <sinterofen.arduino@gmail.com>");
SendMail.addInput("Username","sinterofen.arduino@gmail.com");
SendMail.addInput("ToAddress",Emailto);
SendMail.addInput("Subject","Error @ monitoring unit");
SendMail.addInput("MessageBody", Stop_Reason);
SendMail.addInput("Password","etuortxscekrhfzk");
// Identify the Choreo to run
SendMail.setChoreo("/Library/Google/Gmail/SendEmail");
// Run the Choreo; when results are available, print them to serial
SendMail.run();
while (SendMail.available()) {
char c = SendMail.read();
Serial.print(c);
}
SendMail.close();
#endif
}
delay(500);
}
void reset_timer() {
counter++;
}
Detected encoding: UTF-8 | 0
|