#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Ticker.h>
#include "RemoteDebug.h"
#include "ets_sys.h"
#include "gpio.h"
// Instance of RemoteDebug
RemoteDebug Debug;
Ticker blinker;
#define GPIO_OUT_W1TS (*(volatile uint32_t *)0x60000304)
#define GPIO_OUT_W1TC (*(volatile uint32_t *)0x60000308)
#define GPIO_STATUS (*(volatile uint32_t *)0x6000031C)
#define GPIO_STATUS_W1TC (*(volatile uint32_t *)0x60000324)
#define GPIO_PIN2_CFG (*(volatile uint32_t *)0x60000330)
//#define CAYENNE_PRINT Serial // Comment this out to disable prints and save space
#include <CayenneMQTTESP8266.h> // Include library file for MQTT
#define HOST_NAME "remotedebug"
#define TRIAC_PIN 2 //GPIO2 управление симистором
#define ZC_PIN 1 //GPIO1 - TXD детектор перехода через "0"
#define BUTTON_PIN 3 //GPIO3 - RXD кнопка
#define TIME_PULSE 20
void ICACHE_RAM_ATTR zero_crosss_int(void *arg);
void ICACHE_RAM_ATTR onTimerISR();
#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 = 30;
volatile int DIMMING_TIME = 0;
int BUTTON = 0;
byte lightState = 1; //состояние объекта: 0 - выключен, 1 - включен
int power = 0;
int val = 100; // переменная задающая мощность от 0 до 100
volatile unsigned long countZeroCross = 0;
unsigned long lastMillis = 0;
void setup() {
initializeOTA();
Serial.begin(230400);
gpio_init();
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_GPIO1);
PIN_PULLUP_EN(PERIPHS_IO_MUX_U0TXD_U);
gpio_output_set(0, 0, (1 << TRIAC_PIN), (1 << ZC_PIN));
GPIO_OUT_W1TC = BIT(TRIAC_PIN);
//настраиваем пины ESP в зависимости от назначения
/* pinMode(TRIAC_PIN, OUTPUT);
digitalWrite(TRIAC_PIN, LOW);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ZC_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ZC_PIN), zero_crosss_int, RISING); // Choose the zero cross interrupt egde selection
*/
gpio_pin_intr_state_set(ZC_PIN, GPIO_PIN_INTR_POSEDGE);
ets_isr_attach(ETS_GPIO_INUM, zero_crosss_int, NULL);
timer1_attachInterrupt(onTimerISR);
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
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(500);
ESP.restart();
}
// 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
GPIO_PIN2_CFG &= ~(1 << 2); // normal (push-pull)
// ets_isr_unmask(BIT(ETS_GPIO_INUM));
ETS_GPIO_INTR_ENABLE();
}
void loop() {
ArduinoOTA.handle();
Cayenne.loop();
if (millis() - lastMillis > 5000) {
lastMillis = millis();
debugV("power = %u", power);
debugV("val = %u", val);
debugV("countZeroCross = %u", countZeroCross);
debugV("uptime = %u", millis() / 1000);
debugV("lihgtState = %u", lightState);
/* debugV("countSysTimer = %u", countSysTimer);*/
}
// BUTTON = digitalRead(BUTTON_PIN);
// RemoteDebug handle
Debug.handle();
}
//функция инициализаци прошивки по "воздуху"
void initializeOTA() {
// noInterrupts();
// ets_isr_mask(BIT(ETS_GPIO_INUM));
ETS_GPIO_INTR_DISABLE();
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();
// interrupts();
// ets_isr_unmask(BIT(ETS_GPIO_INUM));
ETS_GPIO_INTR_ENABLE();
}
void ICACHE_RAM_ATTR zero_crosss_int(void *arg) //функция, которая запускается при пересечении нуля, чтобы изменить яркость света
{
(void)arg;
uint32_t tmp = GPIO_STATUS;
GPIO_STATUS_W1TC = tmp;
if (tmp & BIT(ZC_PIN))
{
power = 49500 - 490 * val;
timer1_write(power);
countZeroCross++;
}
}
void ICACHE_RAM_ATTR onTimerISR() // обработчик прерывания таймера
{
if (lightState == 1)
{
// digitalWrite(TRIAC_PIN, HIGH);
GPIO_OUT_W1TS = BIT(TRIAC_PIN);
delayMicroseconds(TIME_PULSE);
// digitalWrite(TRIAC_PIN, LOW);
GPIO_OUT_W1TC = BIT(TRIAC_PIN);
timer1_write(50000);//10мс при тике - 0,2 мкс
}
}
CAYENNE_OUT_DEFAULT()
{
// Запишите данные в Cayenne здесь. В этом примере просто отправляется текущее время безотказной работы в миллисекундах на виртуальном канале 0.
Cayenne.virtualWrite(V0, millis() / 1000);
Cayenne.virtualWrite(V1, BUTTON);
Cayenne.virtualWrite(V2, countZeroCross);
}
CAYENNE_IN(3)
{
int Dimm_Val = getValue.asInt();
val = Dimm_Val;
}
CAYENNE_IN(4)
{
lightState = getValue.asInt();
if (lightState == 1)
{
// digitalWrite(TRIAC_PIN, 1); // to get the value from the website
GPIO_OUT_W1TS = BIT(TRIAC_PIN);
}
else
{
// digitalWrite(TRIAC_PIN, 0); // to get the value from the website
GPIO_OUT_W1TC = BIT(TRIAC_PIN);
}
}