Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SPI.h>
- #include <Ethernet.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- #include <PubSubClient.h>
- byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
- byte ip[] = { 192, 168, 0, 133 };
- byte dns[] = { 8, 8, 8, 8 };
- byte gateway[] = { 192, 168, 0, 1 };
- byte subnet[] = { 255, 255, 255, 0 };
- #define PIN_STATE_ON 1
- #define PIN_STATE_OFF 0
- //KLAWISZE
- #define KEY_SSR 9 // Przycisk monostabilny SSR
- //PINY WEJSCIA
- #define PIN_ACS712 14 // ADC ANALOG
- #define PIN_SSR 16 // SSR
- #define PIN_OWB 2 // OneWire
- //PINY WYJSCIA
- #define LED_ETHERNET 5 // LED od LAN
- #define LED_MQTT 6 // LED od MQTT
- #define LED_SSR 7 // LED od SSR
- #define TEMP_PRECISION 12 // Rozdzielczość czujnika temperatury
- #define ARDUINO_CLIENT_ID "Gniazdko_Korytarz" // Client ID for Arduino pub/sub
- #define PUB_TEMP "Gniazdko_Korytarz/sensor/temp" // MTTQ topic for temperature [C]
- #define PUB_WATS "Gniazdko_Korytarz/sensor/wats" // MTTQ topic for wats
- #define PUB_SSR "Gniazdko_Korytarz/sensor/ssr" // MTTQ topic for SSR
- #define SUB_STATE "Gniazdko_Korytarz/sensor/ssr"
- #define PUB_IP "Gniazdko_Korytarz/ip" // MTTQ topic for temperature [C]
- bool SSRstate = HIGH;
- int MQTT_SSR_STATE = 0;
- int ledArray [] = {5, 6, 7};
- int PIN_STATE = LOW; // Domyślny stan pinow - HIGH/LOW
- int PIN_SSR_STATE = HIGH; // Domyślny stan pinow od SSR po uruchomieniu - HIGH/LOW
- int PIN_SSR_READING;
- int PIN_SSR_PREVIOUS = LOW;
- int PIN_ACS712_READING = 0;
- int ETHERNET_LINK = 0;
- String ETHERNET_BOARD = "";
- int MQTT_LINK = 0;
- int MQTT_STATUS = 0;
- int ACS712_COUNTS = 10;
- int ACS712_VPA = 108; // 5A Version 1A: 185mV || 20A Version: 1A: 100mV || 30A Version 1A: 66mV
- float ACS712_NP = 2500; // Domyślnie 2500
- float ACS712_AVE_VAL = 0.0;
- double ACS712_VOLTAGE = 0;
- double ACS712_AMP = 0;
- float DS_VAL = 0.0;
- unsigned long TIME = 0;
- unsigned long TIME_REGISTRED = 0;
- unsigned long PIN_SSR_TIME = 0;
- unsigned long PIN_SSR_DEBOUNCE = 200;
- OneWire oneWire(PIN_OWB);
- DallasTemperature temp_sensor(&oneWire);
- IPAddress server(192, 168, 0, 54);
- EthernetClient ethClient;
- PubSubClient mqttClient;
- int mqtt_port = 1883;
- #define mqtt_login "darevil"
- #define mqtt_haslo "darevil"
- void setup() {
- //Ustawienia wejść, wyjść
- pinMode(KEY_SSR, INPUT_PULLUP); // Podciagniecie programowe pinu
- pinMode(PIN_ACS712, INPUT);
- pinMode(PIN_SSR, OUTPUT);
- pinMode(LED_ETHERNET, OUTPUT);
- pinMode(LED_MQTT, OUTPUT);
- pinMode(LED_SSR, OUTPUT);
- digitalWrite(PIN_SSR, PIN_STATE); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- mqttClient.setClient(ethClient);
- mqttClient.setServer(server, mqtt_port);
- mqttClient.setCallback(callback);
- Ethernet.begin(mac, ip, dns, gateway, subnet);
- delay(1500); // Allow hardware to stabilize
- ETH_BOARD();
- ETH_LINK_CHECK();
- startUpSeqence();
- digitalWrite(LED_ETHERNET, PIN_STATE); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- digitalWrite(LED_MQTT, PIN_STATE); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- digitalWrite(LED_SSR, PIN_STATE); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- if (!mqttClient.connected()) {
- connectMQTT();
- }
- if ( ! Serial.available()) {
- Serial.begin(115200);
- Serial.print("Nazwa - ");
- Serial.println(ARDUINO_CLIENT_ID);
- Serial.println("-----------------------------------------------");
- Serial.print("PŁYTA - ");
- Serial.println(ETHERNET_BOARD);
- Serial.println("-----------------------------------------------");
- Serial.print("Adres IP - ");
- Serial.println(Ethernet.localIP());
- Serial.print("Netmask - ");
- Serial.println(Ethernet.subnetMask());
- Serial.print("Brama - ");
- Serial.println(Ethernet.gatewayIP());
- Serial.print("DNS - ");
- Serial.println(Ethernet.dnsServerIP());
- Serial.println("-----------------------------------------------");
- Serial.print("Ping - ");
- Serial.println(ETHERNET_LINK);
- Serial.println("-----------------------------------------------");
- Serial.print("Serwer MQTT - ");
- Serial.println(server);
- Serial.print("Port MQTT - ");
- Serial.println(mqtt_port);
- Serial.print("Login MQTT - ");
- Serial.println(mqtt_login);
- Serial.print("Hasło MQTT - ");
- Serial.println(mqtt_haslo);
- Serial.print("Status MQTT - ");
- Serial.println(MQTT_LINK);
- Serial.println("-----------------------------------------------");
- }
- temp_sensor.begin();
- temp_sensor.setResolution(TEMP_PRECISION);
- // mqttClient.publish(PUB_IP, Ethernet.localIP());
- }
- void loop() {
- TIME = millis();
- // Wywołanie funkcji do obsługi klawisza i przekaźnika SSR wraz z diodą LED informującą o stanie przekaźnika
- SSR_KEY();
- // Wywalenie daley :) Aby nie blokować programu
- if (TIME - TIME_REGISTRED >= 3000UL) {
- TIME_REGISTRED = millis();
- char tmpBuffer[20];
- ETH_LINK_CHECK();
- ETH_BOARD();
- DS_TEMP();
- ACS712_SENSOR();
- Serial.print("MQTT: ");
- Serial.print(MQTT_LINK);
- Serial.print(", SSR STATUS: ");
- Serial.print(MQTT_SSR_STATE);
- Serial.print(", Temperatura [C]: ");
- Serial.print(DS_VAL);
- Serial.print(", MOC: ");
- Serial.print(ACS712_AVE_VAL);
- Serial.print(", LINK ETH: ");
- Serial.print(ETHERNET_LINK);
- mqttClient.publish(PUB_TEMP, dtostrf(DS_VAL, 6, 2, tmpBuffer));
- mqttClient.publish(PUB_WATS, dtostrf(ACS712_AVE_VAL, 6, 2, tmpBuffer));
- mqttClient.publish(PUB_SSR, dtostrf(MQTT_SSR_STATE, 6, 2, tmpBuffer));
- SSRstate = digitalRead(PIN_SSR);
- Serial.print(", Status przekaźnika SSR: ");
- Serial.println((SSRstate == HIGH) ? "ON" : "OFF");
- mqttClient.publish(SUB_STATE, (SSRstate == HIGH) ? "ON" : "OFF");
- }
- if (!mqttClient.connected()) {
- connectMQTT();
- }
- mqttClient.loop();
- }
- void DS_TEMP() {
- temp_sensor.requestTemperatures();
- float temp = temp_sensor.getTempCByIndex(0);
- if (temp != DEVICE_DISCONNECTED_C)
- {
- DS_VAL = temp;
- } else {
- DS_VAL = 0;
- }
- }
- void ETH_LINK_CHECK() {
- if (Ethernet.linkStatus() == Unknown) {
- if (TIME - TIME_REGISTRED >= 100UL) {
- digitalWrite(LED_ETHERNET, PIN_STATE_OFF); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- ETHERNET_LINK = PIN_STATE_OFF;
- }
- if (TIME - TIME_REGISTRED >= 200UL) {
- digitalWrite(LED_ETHERNET, PIN_STATE_ON); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- ETHERNET_LINK = PIN_STATE_ON;
- }
- }
- else if (Ethernet.linkStatus() == LinkON) {
- digitalWrite(LED_ETHERNET, PIN_STATE_ON); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- ETHERNET_LINK = PIN_STATE_ON;
- }
- else if (Ethernet.linkStatus() == LinkOFF) {
- digitalWrite(LED_ETHERNET, PIN_STATE_OFF); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- ETHERNET_LINK = PIN_STATE_OFF;
- }
- else {
- digitalWrite(LED_ETHERNET, PIN_STATE_OFF); // Ustawienie stanu pinu, aby po uruchomieniu miał stan HIGH / LOW
- ETHERNET_LINK = PIN_STATE_OFF;
- }
- }
- void ETH_BOARD() {
- if (Ethernet.hardwareStatus() == EthernetNoHardware) {
- ETHERNET_BOARD = "Ethernet no Hardware";
- }
- else if (Ethernet.hardwareStatus() == EthernetW5100) {
- ETHERNET_BOARD = "Ethernet W5100";
- }
- else if (Ethernet.hardwareStatus() == EthernetW5200) {
- ETHERNET_BOARD = "Ethernet W5200";
- }
- else if (Ethernet.hardwareStatus() == EthernetW5500) {
- ETHERNET_BOARD = "Ethernet W5500";
- }
- else {
- ETHERNET_BOARD = "Unknow";
- }
- }
- void ACS712_SENSOR() {
- float averageVAL;
- float TMP[10];
- int p = 0;
- for ( p = 0 ; p < ACS712_COUNTS ; p++ ) {
- PIN_ACS712_READING = analogRead(PIN_ACS712);
- ACS712_VOLTAGE = (PIN_ACS712_READING / 1024.0) * 5000;
- ACS712_AMP = ((ACS712_VOLTAGE - ACS712_NP) / ACS712_VPA);
- TMP[p++] = ACS712_AMP;
- ACS712_VAL_SORT(TMP, ACS712_COUNTS);
- }
- ACS712_AVE_VAL = (TMP[3] + TMP[4] + TMP[5] + TMP[6]) / 4;
- }
- void ACS712_VAL_SORT(float a[], int size) {
- for (int i = 0; i < (size - 1); i++) {
- for (int o = 0; o < (size - (i + 1)); o++) {
- if (a[o] > a[o + 1]) {
- float t = a[o];
- a[o] = a[o + 1];
- a[o + 1] = t;
- }
- }
- }
- }
- //Funkcja do obsługi klawisza i przekaźnika SSR wraz z diodą LED informującą o stanie przekaźnika
- void SSR_KEY() {
- PIN_SSR_READING = digitalRead(KEY_SSR); // Odczyt stanu pinu
- // Funkcja sprawdzajaca czy przycisk zostal nacisniety, jaki byl ostatni stan przycisku, oraz zapobieganiu drgania stykow
- if (PIN_SSR_READING == HIGH && PIN_SSR_PREVIOUS == LOW && millis() - PIN_SSR_TIME > PIN_SSR_DEBOUNCE) {
- if (PIN_SSR_STATE == HIGH) {
- PIN_SSR_STATE = LOW; // Zapis stanu niskiego
- MQTT_SSR_STATE = 0;
- } else {
- PIN_SSR_STATE = HIGH; // Zapis stanu wysokiego
- MQTT_SSR_STATE = 1;
- }
- PIN_SSR_TIME = millis(); // Zapis czasu ostatniego naciśniecia klawisza
- }
- digitalWrite(PIN_SSR, PIN_SSR_STATE); // Zmiana stanu pinu od SSR
- digitalWrite(LED_SSR, PIN_SSR_STATE); // Zmiana stanu pinu diody LED sygnalizujacą stan SSR
- PIN_SSR_PREVIOUS = PIN_SSR_READING; // Zapis ostatniego odczytu do zmiennej
- }
- //Sekwencja podczas startu programu
- void startUpSeqence()
- {
- for (int i = 0; i <= 3; i++) {
- digitalWrite(ledArray[i], PIN_STATE_ON);
- }
- delay(500);
- for (int i = 0; i <= 3; i++) {
- digitalWrite(ledArray[i], PIN_STATE_OFF);
- delay(100);
- }
- for (int i = 0; i <= 3; i++) {
- digitalWrite(ledArray[i], PIN_STATE_ON);
- delay(100);
- }
- for (int i = 0; i <= 3; i++) {
- digitalWrite(ledArray[i], PIN_STATE_OFF);
- delay(100);
- }
- }
- void connectMQTT()
- {
- while (!mqttClient.connected()) {
- if (ETHERNET_LINK == PIN_STATE_ON) {
- if (mqttClient.connect(ARDUINO_CLIENT_ID, mqtt_login, mqtt_haslo)) {
- digitalWrite(LED_MQTT, PIN_STATE_ON);
- MQTT_LINK = PIN_STATE_ON;
- MQTT_STATUS = mqttClient.state();
- mqttClient.subscribe(SUB_STATE);
- } else {
- digitalWrite(LED_MQTT, PIN_STATE_OFF);
- MQTT_LINK = PIN_STATE_OFF;
- MQTT_STATUS = PIN_STATE_OFF;
- }
- } else {
- digitalWrite(LED_MQTT, PIN_STATE_OFF);
- MQTT_LINK = PIN_STATE_OFF;
- MQTT_STATUS = PIN_STATE_OFF;
- }
- }
- //if (ETHERNET_LINK == PIN_STATE_ON) {
- // if (mqttClient.connect(ARDUINO_CLIENT_ID)) {
- //
- // digitalWrite(LED_MQTT, PIN_STATE_ON);
- //
- // MQTT_LINK = 1;
- // MQTT_STATUS = mqttClient.state();
- //
- // mqttClient.subscribe(SUB_STATE);
- // } else {
- // digitalWrite(LED_MQTT, PIN_STATE_OFF);
- //
- // MQTT_LINK = 0;
- // MQTT_STATUS = mqttClient.state();
- // }
- // }
- }
- //void callback(char* topic, byte* payload, unsigned int length) {
- // Serial.print("Wiadomość dotarła [");
- // Serial.print(topic);
- // Serial.print("] ");
- // int i=0;
- // for(i=0;i<length;i++) {
- // Serial.print((char)payload[i]);
- // message_buff[i] = payload[i];
- // }
- // message_buff[i] = '\0';
- // String msgString = String(message_buff);
- // if(msgString.equals("ON")) {
- // PIN_SSR_STATE = HIGH; // Zapis stanu niskiego
- // MQTT_SSR_STATE = 1;
- // mqttClient.publish(SUB_STATE, "Przekaźnik włączony");
- // }
- // else if(msgString.equals("OFF")) {
- // PIN_SSR_STATE = LOW; // Zapis stanu wysokiego
- // MQTT_SSR_STATE = 0;
- // mqttClient.publish(SUB_STATE, "Przekaźnik wyłączony");
- // }
- // Serial.println("");
- //}
- // sub callback function
- void callback(char* topic, byte * payload, unsigned int length)
- {
- Serial.print("[sub: ");
- Serial.print(topic);
- Serial.print("] ");
- char message[length + 1] = "";
- for (int i = 0; i < length; i++)
- message[i] = (char)payload[i];
- message[length] = '\0';
- //Serial.println(message);
- if (strcmp(topic, SUB_STATE) == 0)
- {
- if (strcmp(message, "1.00") == 0)
- PIN_SSR_STATE = HIGH; // Zmiana stanu pinu od SSR
- MQTT_SSR_STATE = 1;
- digitalWrite(LED_SSR, PIN_STATE_ON); // Zmiana stanu pinu diody LED sygnalizujacą stan SSR
- Serial.println(strcmp(message, "1.00"));
- if (strcmp(message, "0.00") == 0)
- PIN_SSR_STATE = LOW; // Zmiana stanu pinu od SSR
- MQTT_SSR_STATE = 0;
- digitalWrite(LED_SSR, PIN_STATE_OFF); // Zmiana stanu pinu diody LED sygnalizujacą stan SSR
- Serial.println(strcmp(message, "0.00"));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement