arduino2/jfs_esp8266_mqtt_wiga/jfs_esp8266_mqtt_wiga.ino
2020-11-06 13:17:55 +01:00

238 lines
5.4 KiB
C++

//#include <Sensirion.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <SHT1x.h>
#include <PubSubClient.h>
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
// Display
SSD1306 display(0x3c, D6, D5);
// IC
char output = 0;
char IC = 0x20;
byte i = 0;
byte ALTWERT;
byte WERT=0;
// Timing
unsigned long readTime;
unsigned long pubTime;
// Data
float temp_c;
float humidity;
char buffer[10];
String line0;
String line1;
String line2;
// Specify data and clock connections and instantiate SHT1x object
#define dataPin D3
#define clockPin D4
SHT1x sht1x(dataPin, clockPin);
//#define SLEEP_DELAY_IN_SECONDS 300
const char* host = "192.168.2.71";
const char* ssid = "pipanet";
const char* password = "passatvr6";
WiFiClient net;
PubSubClient mqtt(net);
void connect();
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
line0=topic;
// welches Realis ist betroffen
i=0x05;
if (line0.endsWith("r1")) {
i=0x00;
}
if (line0.endsWith("r2")) {
i=0x01;
}
if (line0.endsWith("r3")) {
i=0x02;
}
if (line0.endsWith("r4")) {
i=0x03;
}
if (line0.endsWith("r5")) {
i=0x04;
}
// an oder aus
String s;
boolean ok =false;
int inByte1 = payload[0];
int inByte2 = payload[1];
if ((inByte1 == 'o') && (inByte2 == 'n'))
{
Serial.print(i);
Serial.println(" on");
ok = true;
s = "on";
bitSet(output,i);
Wire.beginTransmission(IC);
Wire.write(~output);
Wire.endTransmission();
}
if ((inByte1 == 'o') && (inByte2 == 'f'))
{
Serial.print(i);
Serial.println(" of");
ok = true;
s= "off";
bitClear(output,i);
Wire.beginTransmission(IC);
Wire.write(~output);
Wire.endTransmission();
}
if (ok == false){
Serial.println("Error");
s = "Error";
}
line2 = topic;
line2 = line2 + s;
}
void setup() {
String s = "Hi There";
Serial.begin(115200);
delay(100);
display.init();
display.clear();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0,0,"Booting...");
display.display();
Serial.println();
Serial.println("Booting...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
mqtt.setServer(host,1883);
mqtt.setCallback(callback);
connect();
Serial.println("Setup completed...");
//display.clear();
display.drawString(0,0,"Setup completed...");
display.display();
readTime = 0;
pubTime = 0;
//strcpy(line1,s.c_str());
long rssi = WiFi.RSSI();
line0 = WiFi.localIP().toString();
line0 = line0 + " "+String(rssi);
Serial.println(line0);
//relais
Wire.begin(D6,D5);
//Wire.setClock(1000); // I2C-Bus Freqenz
//Wire.requestFrom(IC, 1); //
//while (Wire.available()) i = Wire.read(); // receive a byte as character
//line0="wire.read "+i;
//Serial.println(line0);
Wire.beginTransmission(IC); // Start Übertragung zum PCF8574
Wire.write(~output); // Alle Bits sind Eingänge
Wire.endTransmission();
}
void loop() {
mqtt.loop();
if (!mqtt.connected()) {
connect();
mqtt.subscribe("/ardu/#");
}
if(millis() > readTime+500){
readTemp();
}
if(millis() > pubTime+10000){
pub_Temp();
get_relais();
}
}
void disp_Temp(){
String s;
long rssi = WiFi.RSSI();
line0 = WiFi.localIP().toString();
line0 = line0 + " "+String(rssi)+" db";
display.clear();
display.setFont(ArialMT_Plain_10);
display.drawString(0,0,line0);
line1=String(temp_c)+" C ";
s = String(humidity);
s = s + " %";
line1=line1 +s ;
display.setFont(ArialMT_Plain_10);
display.drawString(0,18,line1);
display.drawString(0,30,line2);
s="Relais: "+String(ALTWERT,BIN);
display.drawString(0,42,s);
display.display();
}
void get_relais(){
Wire.requestFrom(IC, 1); // Ein Byte (= 8 Bits) vom PCF8574 lesen
while(Wire.available() == 0) // Warten, bis Daten verfügbar
;
WERT = 255 - Wire.read(); // in invertierte Eingabe wandlen
Wire.endTransmission(true);
if (WERT != ALTWERT) { // Wert nur ausgeben wenn er sich ändert
Serial.print("neuer Wert: ");
Serial.println(String(WERT,BIN)); // Wert auf "Seriel Monitor" ausgeben
ALTWERT=WERT; // und nachführen
}
}
void pub_Temp(){
pubTime = millis();
mqtt.publish("/WigaTop/temp", buffer);
dtostrf(humidity, 6, 2, buffer);
mqtt.publish("/WigaTop/humidity", buffer);
dtostrf(ALTWERT, 3,0, buffer);
mqtt.publish("/WigaTop/status",buffer);
Serial.print("Sending... ");
Serial.print("Temp: ");
Serial.print(String(temp_c));
Serial.print(" Humidity: ");
Serial.print(String(humidity));
Serial.print(" Relais ");
Serial.println(String(ALTWERT,BIN));
}
void readTemp(){
readTime = millis();
temp_c = sht1x.readTemperatureC();
humidity = sht1x.readHumidity();
dtostrf(temp_c, 6, 2, buffer);
disp_Temp();
}
void connect() {
while(WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
Serial.println("WiFi connection failed. Retry.");
}
Serial.print("Wifi connection successful - IP-Address: ");
Serial.println(WiFi.localIP());
while (!mqtt.connect(host)) {
Serial.print(".");
}
mqtt.subscribe("/WigaTop/relais/#");
Serial.println("MQTT connected!");
}