#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
//SSID and Password to your ESP Access Point
const char* ssid = "ESP_WIFI";
const char* password = "";
ESP8266WebServer server(80); //Server on port 80
//*************************************************************************
volatile long word_bitM, word_bitS = 0; // переменная полученного значения
volatile int count_M, count_S = 0; // переменная счетчика импульсов
volatile float result_M, last_result_M,
result_S, last_result_S = 0;
volatile int sign_M, sign_S = 1;
volatile int flag = 1;
volatile unsigned int Time_countM, Time_countS = 0;
int Resiv_count_S;
int stop_int;
void handleRoot() {
//server.send(200, "text/plain", "hello from esp8266!");
server.send(200, "text/plain", String(result_M));
}
// Объявление выводов МК
#define data_Master D1
#define clock_Master D2
#define data_Slave D3
#define clock_Slave D5
#define detectpin_M D6
#define detectpin_S D7
void read_bitM() // Обработчик прерывания Мастер индикатора
{
delayMicroseconds(20); // задержка для проверки значения, по середине синхроимпулса
if (count_M < 16)
{
bitWrite(word_bitM, count_M, !digitalRead(data_Master)); // чтение бита
}
if (count_M == 20) // Проверка знака 20й бит
{
if (digitalRead(data_Master))
sign_M = 1;
else
sign_M = -1;
}
digitalWrite(detectpin_M, HIGH);
count_M++;
digitalWrite(detectpin_M, LOW);
//noInterrupts();
}
void read_bitS() // Обработчик прерывания Подчиненного индикатора
{
delayMicroseconds(20); // задержка для проверки значения, по середине синхроимпулса
if (count_S < 16)
{
bitWrite(word_bitS, count_S, !digitalRead(data_Slave)); // чтение бита
}
if (count_S == 20) // Проверка знака 20й бит
{
if (digitalRead(data_Slave))
sign_S = 1;
else
sign_S = -1;
}
digitalWrite(detectpin_S, HIGH);
count_S++;
digitalWrite(detectpin_S, LOW);
//noInterrupts();
}
void setup()
{
//ets_update_cpu_frequency(8);
pinMode(clock_Master, INPUT); // Вход для синхроимпульса
pinMode(data_Master, INPUT); // Вход для приема данных
pinMode(clock_Slave, INPUT); // Вход для синхроимпульса
pinMode(data_Slave, INPUT); // Вход для приема данных
pinMode(detectpin_M, OUTPUT);
pinMode(detectpin_S, OUTPUT);
delay(50);
attachInterrupt(digitalPinToInterrupt(clock_Master), read_bitM, FALLING); // Вызов прерывания при начале передачи данных
noInterrupts();
Serial.begin(115200);
Serial.println("");
WiFi.mode(WIFI_AP); //Only Access point
WiFi.softAP(ssid, password); //Start HOTspot removing password will disable security
IPAddress myIP = WiFi.softAPIP(); //Get IP address
Serial.print("HotSpt IP:");
Serial.println(myIP);
server.on("/", handleRoot); //Which routine to handle at root location
server.begin(); //Start server
Serial.println("HTTP server started");
}
// Функция определения начала передачи данных
void Get_start(uint8_t clockpin, uint8_t datapin, volatile long word_bit, volatile int count)
{
if (flag)
{ // Если оба пина находятся в одинаковом состоянии дольше 1 мс разрешаются прерывания
// Поиск начального участка без сигнала, что бы не начать считать импульсы посередине пакета данных
if ((digitalRead(clockpin) == digitalRead(datapin)) && ((micros() - stop_int) > 1000))
{
flag = 0;
interrupts(); // Разрешаем прерывания когда свободный участок найден
}
else
{
stop_int = micros(); // Сбрасываем значение таймера
flag = 1;
word_bit = 0;
count = 0;
}
}
}
void loop()
{
Get_start(clock_Master, data_Master, word_bitM, count_M);
// Проверка формирования Значения для Master
if (count_M == 24) // Неполный пакет игнорируется
{
digitalWrite(detectpin_M, HIGH); // debug
delay(2);
result_M = (word_bitM * sign_M) / 100.00;
digitalWrite(detectpin_M, LOW); // debug
// Serial.print("count_M: ");
// Serial.println(count_M);
// Serial.print("word_bit_M: ");
// Serial.println(word_bitM, BIN);
// Serial.print("word_bit_M DEC: ");
// Serial.println(word_bitM, DEC);
if (last_result_M != result_M)//Вывод результата если он отличается от предыдущего
{
Serial.print("RESULT_M: ");
Serial.println(result_M, 2);
last_result_M = result_M;
}
stop_int = micros();
flag = 1;
count_M = 0;
word_bitM = 0;
delay(1);
}
if (count_M > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
{
noInterrupts();
flag = 1;
count_M = 0;
word_bitM = 0;
}
Get_start(clock_Slave, data_Slave, word_bitS, count_S);
// Проверка формирования Значения для Slave
if (count_S == 24) // Неполный пакет игнорируется
{
digitalWrite(detectpin_S, HIGH); // debug
delay(2);
result_S = (word_bitS * sign_S) / 100.00;
digitalWrite(detectpin_S, LOW); // debug
// Тестовый блок проверки количества пакетов в СЕК.
Resiv_count_S++;
if (Time_countS == 0)
Time_countS = micros();
if ((micros() - Time_countS) > 1000000){
Serial.print("Resived paket_S: ");
Serial.println(Resiv_count_S);
Time_countS = 0;
Resiv_count_S = 0;
}
// Serial.print("word_bit_S: ");
// Serial.println(word_bitM, BIN);
// Serial.print("word_bit_S DEC: ");
// Serial.println(word_bitM, DEC);
if (last_result_S != result_S) //Вывод результата если он отличается от предыдущего
{
Serial.print("RESULT_S: ");
Serial.println(result_S, 2);
last_result_S = result_S;
}
stop_int = micros();
flag = 1;
count_S = 0;
word_bitS = 0;
delay(1);
}
if (count_S > 24) // если количество бит больше заданного прекращаем прерывания, и сбрасываем данные
{
noInterrupts();
flag = 1;
count_S = 0;
word_bitS = 0;
}
server.handleClient(); //Handle client requests
}