#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include "RemoteDebug.h"
#include "gpio.h"
// Instance of RemoteDebug
RemoteDebug Debug;
//#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <CayenneMQTTESP8266.h> // Include library file for MQTT
#define GPIO_OUT_W1TS (*(volatile uint32_t *)0x60000304)
#define GPIO_OUT_W1TC (*(volatile uint32_t *)0x60000308)
#define HOST_NAME "remotedebug"
#define TRIAC_PIN 2 //GPIO2 управление симистором
#define ZC_PIN 1 //GPIO1 - TXD детектор перехода через "0"
#define BUTTON_PIN 3 //GPIO3 - RXD кнопка
void ICACHE_RAM_ATTR zero_crosss_int();
#ifndef STASSID
#define STASSID "ASUS"
#define STAPSK "gCU8YNZs"
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
char username[] = "60267f30-21f2-11eb-8779-7d56e82df461"; // Your MQTT cayenne username
char Password[] = "a9631607be6b7979c4c117bbdadc76683b9dbf97"; // Your MQTT cayenne Password
char clientID[] = "bf444650-21fc-11eb-883c-638d8ce4c23d"; // Your MQTT cayenne clientID
volatile int DIMMING_VALUES = 0;
volatile int DIMMING_TIME = 0;
int BUTTON = 0;
byte lightState = 0;
volatile unsigned long countZeroCross = 0;
unsigned long lastMillis = 0;
void setup() {
Serial.begin(230400);
gpio_init();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);
// включаем соответствующие пины для использования в качестве входа и выхода
gpio_output_set(0, 0, 0, (1 << ZC_PIN));
gpio_output_set(0, (1 << TRIAC_PIN), (1 << TRIAC_PIN), 0);
gpio_output_set(0, 0, 0, (1 << BUTTON_PIN));
attachInterrupt(digitalPinToInterrupt(ZC_PIN), zero_crosss_int, RISING); // Choose the zero cross interrupt egde selection
Cayenne.begin(username, Password, clientID, ssid, password); // Setup cayenne server for MQTT protocol
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(1000);
ESP.restart();
}
initializeOTA();
// Initialize RemoteDebug
Debug.begin(HOST_NAME); // Initialize the WiFi server
Debug.setResetCmdEnabled(true); // Enable the reset command
Debug.showProfiler(true); // Profiler (Good to measure times, to optimize codes)
Debug.showColors(true); // Colors
}
void loop() {
ArduinoOTA.handle();
Cayenne.loop();
if (millis() - lastMillis > 5000) {
lastMillis = millis();
debugV("DIMMING_VALUES = %u", DIMMING_VALUES);
debugV("DIMMING_TIME = %u", DIMMING_TIME);
debugV("countZeroCross = %u", countZeroCross);
debugV("uptime = %u", millis());
/* debugV("countZC_ISR = %u", countZC_ISR);
debugV("countSysTimer = %u", countSysTimer);*/
}
BUTTON = digitalRead(BUTTON_PIN);
// RemoteDebug handle
Debug.handle();
}
//функция инициализаци прошивки по "воздуху"
void initializeOTA() {
ArduinoOTA.onStart([]() {
Serial.println("* OTA: Start");
});
ArduinoOTA.onEnd([]() {
Serial.println("\n*OTA: End");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("*OTA: Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("*OTA: Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
// Begin
ArduinoOTA.begin();
}
void ICACHE_RAM_ATTR zero_crosss_int() //функция, которая запускается при пересечении нуля, чтобы изменить яркость света
{
DIMMING_TIME = (90 * DIMMING_VALUES); // For 60Hz =>65
delayMicroseconds(DIMMING_TIME); // Wait till firing the TRIAC
GPIO_OUT_W1TS = BIT(TRIAC_PIN); // Fire the TRIAC
delayMicroseconds(20); // triac On propogation delay
// (for 60Hz use 8.33) Some Triacs need a longer period
GPIO_OUT_W1TC = BIT(TRIAC_PIN); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
countZeroCross++;
}
CAYENNE_OUT_DEFAULT()
{
// Запишите данные в Cayenne здесь. В этом примере просто отправляется текущее время безотказной работы в миллисекундах на виртуальном канале 0.
Cayenne.virtualWrite(V0, millis());
Cayenne.virtualWrite(V1, BUTTON);
Cayenne.virtualWrite(V2, countZeroCross);
}
CAYENNE_IN(1)
{
int Dimm_Val = getValue.asInt();
DIMMING_VALUES = (100 - Dimm_Val);
}
CAYENNE_IN(2)
{
lightState != getValue.asInt();
if (lightState == 1) {
GPIO_OUT_W1TS = BIT(TRIAC_PIN);
}
else {
GPIO_OUT_W1TC = BIT(TRIAC_PIN);
}
}