Source file: /~heha/ewa/Ofen/Arduino-180530.zip/Ofen/Ofen.ino

/*Ü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-80