/* Для WeMosArd, связанной с Ардуино. По запросу от Ардуино получение регистров настроек от Ардуино и передача их на WeMosIsp, связанную с Исполнительным устройством. Получение результатов измерения от WeMosIsp и передача их на Ардуино. При наладке раскомментировать команды вывода на последовательный порт Serial для наблюдения процесса на экране монитора. */ #include #include #include #include // МАС-АДРЕС платы, на которую отправляем данные. // 30:83:98:B2:6E:AF uint8_t broadcastAddress[] = {0x30, 0x83, 0x98, 0xB2, 0x6E, 0xAF}; int Nop = 0; // замена операции NOP int Requin = D6; // назначение вывода запрос вход int count = 0; // Счётчик циклов измерения volatile bool flagrec = 0; // флаг подтверждения приёма данных от ISP volatile bool flagsend = 0; // флаг подтверждения отправки данных на ISP volatile bool flagrequin = 0; // флаг запроса от Ардуино volatile bool flagsendisp = 0; // флаг отправки данных на ISP // Вводим переменные для пересылаемых данных byte regkn2 = 0xFF; // регистр чтения кнопок управления каналами byte regm1 = 0xC6; // регистр хранения режима управления исполнительным устройством byte regm2 = 0x3C; // регистр храннения режима управления каналами byte reg_IN = 0x02; // регистр пина индикации byte regout = 0x3A; // регистр выдачи на исполнительное устройство float voltage1 = 0.0; // объявление переменной voltage1 uint16_t duration; // объявление переменной длительности сигнала от приёмника #define LOG_SIZE 12 // размер лога (LOG_SIZE ячеек) uint16_t durus[LOG_SIZE]; // массив измерений. Для текущего времени в момент изменения uint16_t arrey1[LOG_SIZE]; // массив измерений. Для текущего времени в момент изменения при ошибке // Вводим переменные для хранения принимаемых данных byte incomingReg1; byte incomingReg2; byte incomingReg3; byte incomingReg4; byte incomingReg5; float incomingVoltbat; uint16_t incomingDursig; uint16_t incomingArrey1[LOG_SIZE]; // Переменная для хранения состояния отправки String success; // структуры для отправки // (Должна совпадать со структурой на плате-приемнике) typedef struct struct_message { byte reg1; byte reg2; byte reg3; byte reg4; byte reg5; float voltbat; // напряжение батареи uint16_t dursig; // длительность сигнала от приёмника uint16_t arrey1[LOG_SIZE]; // массив измерений. текущее время в момент изменения } struct_message; // Создаем переменную для хранения отправляемого сообщения struct_message ARDReadings; // То же, но для принимаемого сообщения struct_message incomingReadings; // Callback-функция для получения состояния отправки на ISP void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) { // Serial.print("Last Packet Send Status: "); if (sendStatus == 0){ flagsend = 1; // установка флага отправки данных на ISP // Serial.println("Delivery success"); } else{ // Serial.println("Delivery fail"); } } // То же, для получения состояния приема данных от ISP void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) { memcpy(&incomingReadings, incomingData, sizeof(incomingReadings)); // Serial.print("Bytes received: "); // Serial.println(len); flagrec = 1; // устанавливаем в 1 флаг приёма данных flagsend = 0; // сброс флага посылки данных нат ISP // приём данных regkn2 = incomingReadings.reg1; regm1 = incomingReadings.reg2; regm2 = incomingReadings.reg3; reg_IN = incomingReadings.reg4; count = incomingReadings.reg5; voltage1 = incomingReadings.voltbat; duration = incomingReadings.dursig; for (int i = 0; i < LOG_SIZE; i++) { durus[i] = incomingReadings.arrey1[i]; } } /* void printDate_From_Arduino(){ Serial.println("Date_From_Arduino"); Serial.println(regkn2); Serial.println(regm1); Serial.println(regm2); Serial.println(reg_IN); Serial.println(regout); } void printDate_To_ISP(){ Serial.println("Date_To_ISP"); Serial.println(regkn2); Serial.println(regm1); Serial.println(regm2); Serial.println(reg_IN); Serial.println(regout); } void printDate_From_ISP(){ Serial.println("Date_From_ISP: "); Serial.print("count: "); Serial.println(count); Serial.print("voltage1: "); Serial.println(voltage1); Serial.print("duration: "); Serial.println(duration); Serial.println("durus: "); for (int i = 0; i < LOG_SIZE ; i++) { Serial.println(durus[i]); } } void printDate_To_Arduino(){ Serial.println("Date_To_Arduino: "); Serial.print("count: "); Serial.println(count); Serial.print("voltage1: "); Serial.println(voltage1); Serial.print("duration: "); Serial.println(duration); Serial.println("durus: "); for (int i = 0; i < LOG_SIZE; i++) { Serial.println(durus[i]); } } */ void setup() { pinMode(Requin, INPUT); // назначение вывода Reqin входом // Запускаем монитор порта Serial.begin(115200); // Выставляем режим работы Wi-Fi WiFi.mode(WIFI_STA); WiFi.disconnect(); // Инициализируем протокол ESP-NOW if (esp_now_init() != 0) { // Serial.println("Error initializing ESP-NOW"); return; } // Указываем роль платы в сети esp_now_set_self_role(ESP_NOW_ROLE_COMBO); // Регистрируем callback-функцию для получения статуса отправки на ISP esp_now_register_send_cb(OnDataSent); // Регистрируем пиры esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_COMBO, 1, NULL, 0); // Регистрируем callback-функцию для получения статуса приема от ISP esp_now_register_recv_cb(OnDataRecv); // задаем i2c мост через контакты SDA=D1 и SCL=D2 на WeMosArd Wire.begin(D2, D1); } void loop() { if (digitalRead(Requin) == 1) { // Если есть запрос от Ардуино if (flagrequin == 0) { // Если еще не запрашивали Wire.requestFrom(8, 5); // запрашиваем и считываем 5 байт с адреса 8 slave устройства flagrequin = 1; // устанвливаем флаг запроса } while(Wire.available()){ // пока есть принятые байты // читаем принятые от Ардуино регистры regkn2 = Wire.read(); regm1 = Wire.read(); regm2 = Wire.read(); reg_IN = Wire.read(); regout = Wire.read(); // printDate_From_Arduino(); } // Записываем переменные для отправки на ISP ARDReadings.reg1 = regkn2; ARDReadings.reg2 = regm1; ARDReadings.reg3 = regm2; ARDReadings.reg4 = reg_IN; ARDReadings.reg5 = regout; ARDReadings.voltbat = voltage1; ARDReadings.dursig = duration; for (int i = 0; i < LOG_SIZE; i++) { ARDReadings.arrey1[i] = durus[i]; } if (flagsend == 0) { // Если ещё не было пересылки на ISP if (flagsendisp == 0) { // Если ещё не было пересылки на ISP // printDate_To_ISP(); // Отправляем сообщение на ISP esp_now_send(broadcastAddress, (uint8_t *) &ARDReadings, sizeof(ARDReadings)); flagsendisp = 1; } } // ожидаем приём данных от Исполнительного устройства if(flagrec == 1){ // printDate_From_ISP(); // передача данных на Ардуино Wire.beginTransmission(8); // Начинаем передачу на адрес 8 Wire.write(count); // count I2C_writeAnything(voltage1); // voltage1 I2C_writeAnything(duration); // duration for (int i = 0; i < LOG_SIZE; i++) { I2C_writeAnything(durus[i]); // передаём каждый из 20 элементов массива } Wire.endTransmission(); // заканчиваем передачу на адрес 8 // printDate_To_Arduino(); flagrec = 0; // сброс флага приёма данных от ISP flagrequin = 0; // сбрасываем флаг запроса flagsendisp = 0; } } }