UNPKG

@mixly/arduino-avr

Version:
857 lines (804 loc) 55.7 kB
import { JSFuncs } from 'mixly'; import { Variables } from 'blockly/core'; // 物联网-授权码 export const blynk_iot_auth = function () { return ''; }; // 物联网-一键配网 export const blynk_smartconfig = function (_, generator) { let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC); let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC); if (!isNaN(server_add.charAt(2))) { server_add = server_add.replace(/"/g, "").replace(/\./g, ","); server_add = 'IPAddress(' + server_add + ')'; } let board_type = JSFuncs.getPlatform(); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_smartconfig'] = 'WiFi.mode(WIFI_STA);\n' + ' int cnt = 0;\n' + ' while (WiFi.status() != WL_CONNECTED) {\n' + ' delay(500); \n' + ' Serial.print("."); \n' + ' if (cnt++ >= 10) {\n' + ' WiFi.beginSmartConfig();\n' + ' while (1) {\n' + ' delay(1000);\n' + ' if (WiFi.smartConfigDone()) {\n' + ' Serial.println();\n' + ' Serial.println("SmartConfig: Success");\n' + ' break;\n' + ' }\n' + ' Serial.print("|");\n' + ' }\n' + ' }\n' + ' }\n' + ' WiFi.printDiag(Serial);\n'; if (board_type.match(RegExp(/ESP8266/))) { generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>'; generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>'; } else if (board_type.match(RegExp(/ESP32/))) { generator.definitions_['include_WiFi'] = '#include <WiFi.h>'; generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>'; generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>'; } generator.setups_['setup_smartconfig'] += 'Blynk.config(auth,' + server_add + ',8080);'; let code = "Blynk.run();\n"; return code; }; // 物联网-wifi信息 export const blynk_server = function (_, generator) { let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC); let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC); let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC); let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC); let board_type = JSFuncs.getPlatform(); //let board_type ="ESP8266"; generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';'; generator.definitions_['var_declare_wifi_ssid'] = 'char ssid[] = ' + wifi_ssid + ';'; generator.definitions_['var_declare_wifi_pass'] = 'char pass[] = ' + wifi_pass + ';'; if (board_type.match(RegExp(/AVR/))) { generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266_Lib.h>'; generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleShieldEsp8266.h>'; generator.definitions_['define_BLYNK_PRINT'] = '#define ESP8266_BAUD 115200'; generator.definitions_['var_declare_ESP8266'] = 'ESP8266 wifi(&Serial);'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(115200);'; generator.setups_['delay_10_1'] = 'delay(10);'; generator.setups_['wifi.setOprToStation'] = 'wifi.setOprToStation(2, 2);'; generator.setups_['delay_10_2'] = 'delay(10);'; generator.setups_['wifi.enableMUX'] = 'wifi.enableMUX();'; generator.setups_['delay_10_3'] = 'delay(10);'; generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(auth, wifi,ssid, pass,' + server_add + ',8080);'; } if (!isNaN(server_add.charAt(2))) { server_add = server_add.replace(/"/g, "").replace(/\./g, ","); server_add = 'IPAddress(' + server_add + ')'; } if (board_type.match(RegExp(/ESP8266/))) { generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>'; generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = ' Blynk.begin(auth, ssid, pass,' + server_add + ',8080);'; } else if (board_type.match(RegExp(/ESP32/))) { generator.definitions_['include_WiFi'] = '#include <WiFi.h>'; generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>'; generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(auth, ssid, pass,' + server_add + ',8080);'; } let code = "Blynk.run();\n"; return code; }; // 物联网-wifi信息 export const blynk_usb_server = function (_, generator) { // generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT DebugSerial'; generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>'; generator.definitions_['include_BlynkSimpleStream'] = '#include <BlynkSimpleStream.h>'; generator.definitions_['var_declare_SoftwareSerial'] = 'SoftwareSerial DebugSerial(2, 3);'; let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC); generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(Serial, auth);'; generator.setups_['setup_DebugSerial'] = 'DebugSerial.begin(9600);'; let code = "Blynk.run();\n"; return code; }; // 物联网-发送数据到app export const blynk_iot_push_data = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let data = generator.valueToCode(this, 'data', generator.ORDER_ATOMIC); let code = 'Blynk.virtualWrite(' + Vpin + ', ' + data + ');\n'; return code; }; // 从app接收数据 export const blynk_iot_get_data = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let branch = generator.statementToCode(this, 'STACK'); if (generator.INFINITE_LOOP_TRAP) { branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch; } let args = []; for (let x = 0; x < this.arguments_.length; x++) { args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE); } let GetDataCode = ""; if (this.arguments_.length == 1) { GetDataCode = generator.variableDB_.getName(this.arguments_[0], Variables.NAME_TYPE); if (this.argumentstype_[0] == "int") GetDataCode = " " + GetDataCode + " = param.asInt();\n" else if (this.argumentstype_[0] == "String") GetDataCode = " " + GetDataCode + " = param.asStr();\n" else if (this.argumentstype_[0] == "long") GetDataCode = " " + GetDataCode + " = param.asDouble();\n" else if (this.argumentstype_[0] == "float") GetDataCode = " " + GetDataCode + " = param.asFloat();\n" else if (this.argumentstype_[0] == "boolean") GetDataCode = " " + GetDataCode + " = param.asInt();\n" else if (this.argumentstype_[0] == "byte") GetDataCode = " " + GetDataCode + " = param.asStr();\n" else if (this.argumentstype_[0] == "char") GetDataCode = " " + GetDataCode + " = param.asStr();\n" } else { for (let x = 0; x < this.arguments_.length; x++) { args[x] = this.argumentstype_[x] + ' ' + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE); GetDataCode = GetDataCode + " " + generator.variableDB_.getName(this.arguments_[x], Variables.NAME_TYPE); if (this.argumentstype_[x] == "int") GetDataCode += " = param[" + x + "].asInt();\n" else if (this.argumentstype_[x] == "String") GetDataCode += " = param[" + x + "].asStr();\n" else if (this.argumentstype_[x] == "long") GetDataCode += " = param[" + x + "].asDouble();\n" else if (this.argumentstype_[x] == "float") GetDataCode += " = param[" + x + "].asFloat();\n" else if (this.argumentstype_[x] == "boolean") GetDataCode += " = param[" + x + "].asInt();\n" else if (this.argumentstype_[x] == "byte") GetDataCode += " = param[" + x + "].asStr();\n" else if (this.argumentstype_[x] == "char") GetDataCode += " = param[" + x + "].asStr();\n" } } if (this.arguments_.length > 0) generator.definitions_['var_declare_' + args] = args.join(';\n') + ";"; let code = 'BLYNK_WRITE(' + Vpin + ') {\n' + GetDataCode + branch + '}\n'; // let code = 'BLYNK_WRITE(' + Vpin+ ') {\n'+letiable+" = param.as"+datatype+"();\n"+branch+'}\n'; code = generator.scrub_(this, code); generator.definitions_[Vpin] = code; return null; }; // blynk 定时器 export const Blynk_iot_timer = function (_, generator) { generator.definitions_['var_declare_BlynkTimer'] = 'BlynkTimer timer;'; let timerNo = this.getFieldValue('timerNo'); let time = generator.valueToCode(this, 'TIME', generator.ORDER_ATOMIC); let funcName = 'myTimerEvent' + timerNo; let branch = generator.statementToCode(this, 'DO'); let code = 'void' + ' ' + funcName + '() {\n' + branch + '}\n'; generator.definitions_[funcName] = code; generator.setups_[funcName] = 'timer.setInterval(' + time + 'L, ' + funcName + ');\n'; return "timer.run();\n"; }; // blynk 连接状态函数 export const Blynk_iot_CONNECT_STATE = function (_, generator) { let funcName = this.getFieldValue('state'); let branch = generator.statementToCode(this, 'DO'); let code = funcName + '() {\n' + branch + '}\n'; generator.definitions_[funcName] = code; return ""; }; // blynk 同步所有管脚状态 export const Blynk_iot_BLYNK_syncAll = function () { let code = 'Blynk.syncAll();\n'; return code; }; // 物联网-发送数据到app export const blynk_iot_syncVirtual = function () { let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.syncVirtual(' + Vpin + ');\n'; return code; }; //LED组件颜色&开关 export const blynk_iot_WidgetLED_COLOR = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let COLOR = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC); COLOR = COLOR.replace(/#/g, "").replace(/\(/g, "").replace(/\)/g, "").replace(/0x/g, ''); let dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC); generator.definitions_['var_declare_WidgetLED' + Vpin] = 'WidgetLED led' + Vpin + '(' + Vpin + ');'; let code = 'led' + Vpin + '.setColor("#' + COLOR + '");\n'; if (dropdown_stat == "HIGH") code += 'led' + Vpin + '.on();\n'; else if (dropdown_stat == "LOW") code += 'led' + Vpin + '.off();\n'; return code; }; //LED组件颜色&亮度 export const blynk_iot_WidgetLED_VALUE = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let COLOR = generator.valueToCode(this, 'COLOR', generator.ORDER_ATOMIC); COLOR = COLOR.replace(/#/g, "").replace(/\(/g, "").replace(/\)/g, "").replace(/0x/g, ''); let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); generator.definitions_['var_declare_WidgetLED' + Vpin] = 'WidgetLED led' + Vpin + '(' + Vpin + ');'; let code = 'led' + Vpin + '.setColor("#' + COLOR + '");\n'; code += 'led' + Vpin + '.setValue(' + value_num + ');'; return code; }; // 红外控制空调 export const blynk_iot_ir_send_ac = function (_, generator) { let AC_TYPE = this.getFieldValue('AC_TYPE'); let AC_POWER = this.getFieldValue('AC_POWER'); let AC_MODE = this.getFieldValue('AC_MODE'); let AC_FAN = this.getFieldValue('AC_FAN'); let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); let AC_TEMP = generator.valueToCode(this, 'AC_TEMP', generator.ORDER_ATOMIC); generator.definitions_['include_Arduino'] = '#ifndef UNIT_TEST\n#include <Arduino.h>\n#endif'; generator.definitions_['include_IRremoteESP8266'] = '#include <IRremoteESP8266.h>'; generator.definitions_['include_IRsend'] = '#include <IRsend.h>'; generator.definitions_['include' + AC_TYPE] = '#include <ir_' + AC_TYPE + '.h>'; generator.definitions_['define_IR_LED' + dropdown_pin] = '#define IR_LED ' + dropdown_pin; generator.definitions_['IR' + AC_TYPE + 'AC'] = 'IR' + AC_TYPE + 'AC ' + AC_TYPE + 'AC(IR_LED); '; generator.setups_['setup' + AC_TYPE] = AC_TYPE + 'AC.begin();'; let code = AC_TYPE + 'AC.setPower(' + AC_POWER + ');\n'; code += AC_TYPE + 'AC.setFan(' + AC_FAN + ');\n'; code += AC_TYPE + 'AC.setMode(' + AC_MODE + ');\n'; code += AC_TYPE + 'AC.setTemp(' + AC_TEMP + ');\n'; code += AC_TYPE + 'AC.send();\n'; return code; }; // 红外接收 export const blynk_iot_ir_recv_raw = function (_, generator) { let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); generator.definitions_['include_IRremote'] = '#ifndef UNIT_TEST\n' + '#include <Arduino.h>\n' + '#endif\n#include <IRremoteESP8266.h>\n#include <IRrecv.h>\n#include <IRutils.h>\n#if DECODE_AC\n#include <ir_Daikin.h>\n#include <ir_Fujitsu.h>\n#include <ir_Gree.h>\n#include <ir_Haier.h>\n#include <ir_Kelvinator.h>\n#include <ir_Midea.h>\n#include <ir_Toshiba.h>\n#endif \n'; generator.definitions_['define_RECV_PIN' + dropdown_pin] = '#define RECV_PIN ' + dropdown_pin + '\n'; // generator.definitions_['define_BAUD_RATE'] = '#define BAUD_RATE 115200\n'; generator.definitions_['var_declare_CAPTURE_BUFFER_SIZE'] = '#define CAPTURE_BUFFER_SIZE 1024\n#if DECODE_AC\n#define TIMEOUT 50U\n#else\n#define TIMEOUT 15U \n#endif\n#define MIN_UNKNOWN_SIZE 12\n#define IN_UNKNOWN_SIZE 12\nIRrecv irrecv(RECV_PIN, CAPTURE_BUFFER_SIZE, TIMEOUT, true);\ndecode_results results;'; generator.setups_['ir_recv_begin'] = 'while(!Serial)\n' + ' delay(50);\n' + ' #if DECODE_HASH\n' + ' irrecv.setUnknownThreshold(MIN_UNKNOWN_SIZE);\n' + ' #endif \n' + ' irrecv.enableIRIn();'; let code = "if(irrecv.decode(&results)){\n" + ' uint32_t now = millis();\n' + ' dumpACInfo(&results);\n' + ' Serial.println(resultToSourceCode(&results));\n' + '}\n'; let funcode = 'void dumpACInfo(decode_results *results){\n' + ' String description="";\n' + ' #if DECODE_DAIKIN\n' + ' if(results->decode_type == DAIKIN){\n' + ' IRDaikinESP ac(0);\n' + ' ac.setRaw(results->state);\n' + ' description=ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_FUJITSU_AC\n' + ' if(results->decode_type==FUJITSU_AC){\n' + ' IRFujitsuAC ac(0);\n' + ' ac.setRaw(results->state, results->bits / 8);\n' + ' description = ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_KELVINATOR\n' + ' if(results->decode_type == KELVINATOR){\n' + ' IRKelvinatorAC ac(0);\n' + ' ac.setRaw(results->state);\n' + ' description = ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_TOSHIBA_AC\n' + ' if(results->decode_type == TOSHIBA_AC){\n' + ' IRToshibaAC ac(0);\n' + ' ac.setRaw(results->state);\n' + ' description = ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_GREE\n' + ' if (results->decode_type == GREE){\n' + ' IRGreeAC ac(0);\n' + ' ac.setRaw(results->state);\n' + ' description = ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_MIDEA\n' + ' if(results->decode_type == MIDEA){\n' + ' IRMideaAC ac(0);\n' + ' ac.setRaw(results->value);\n' + ' description=ac.toString();\n' + ' }\n' + ' #endif\n' + ' #if DECODE_HAIER_AC\n' + ' if(results->decode_type == HAIER_AC){\n' + ' IRHaierAC ac(0);\n' + ' ac.setRaw(results->state);\n' + ' description = ac.toString();\n' + ' }\n' + ' #endif\n' + ' if(description != "")\n' + ' Serial.println("Mesg Desc.: " + description);\n' + '}\n'; generator.definitions_['dumpACInfo'] = funcode; return code; }; // 红外发射 export const blynk_iot_ir_send = function (_, generator) { let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); let IR_CODE = this.getFieldValue('IR_CODE'); let IR_CODE_LENGTH = IR_CODE.split(',').length; let random_num = Math.ceil(Math.random() * 100000); generator.definitions_['define_IRremote'] = '#ifndef UNIT_TEST\n#include <Arduino.h>\n#endif\n#include <IRremoteESP8266.h>\n#include <IRsend.h>\n#define IR_LED ' + dropdown_pin; generator.definitions_['var_declare_IRsend_irsend'] = 'IRsend irsend(IR_LED);\n'; generator.definitions_['var_declare_send' + random_num] = 'uint16_t rawData' + random_num + '[' + IR_CODE_LENGTH + '] = {' + IR_CODE + '};'; // generator.setups_['Serial.begin'] = 'irsend.begin();\n Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);\n'; generator.setups_['irsend_begin'] = 'irsend.begin();\n'; let code = 'irsend.sendRaw(rawData' + random_num + ', ' + IR_CODE_LENGTH + ', 38);\ndelay(2000);\n'; return code; } // 发送邮件 export const blynk_email = function (_, generator) { let email_add = generator.valueToCode(this, 'email_add', generator.ORDER_ATOMIC); let Subject = generator.valueToCode(this, 'Subject', generator.ORDER_ATOMIC); let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_MAX_SENDBYTES'] = '#define BLYNK_MAX_SENDBYTES 128 \n'; let code = 'Blynk.email(' + email_add + ', ' + Subject + ', ' + content + ');\n'; return code; }; // 发送通知 export const blynk_notify = function (_, generator) { let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC); let code = 'Blynk.notify(' + content + ');\n'; return code; }; // 物联网-终端组件显示文本 export const blynk_terminal = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); generator.definitions_['var_declare_WidgetTerminal' + Vpin] = 'WidgetTerminal terminal' + Vpin + '(' + Vpin + ');\n'; let content = generator.valueToCode(this, 'content', generator.ORDER_ATOMIC); let code = 'terminal' + Vpin + '.println(' + content + ');\nterminal' + Vpin + '.flush();\n'; return code; }; // 从终端获取字符串 export const blynk_iot_terminal_get = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); generator.definitions_['var_declare_WidgetTerminal'] = 'WidgetTerminal terminal(' + Vpin + ');\n'; generator.definitions_['var_declare_action'] = 'String terminal_text ;'; let branch = generator.statementToCode(this, 'DO'); branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格s let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n' + ' terminal_text = param.asStr();\n' + ' ' + branch + '\n' + ' terminal.flush();\n' + '}\n' generator.definitions_[Vpin] = code; return null; }; // 视频流 export const blynk_videourl = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let url = generator.valueToCode(this, 'url', generator.ORDER_ATOMIC); let code = 'Blynk.setProperty(' + Vpin + ',"url",' + url + ');\n'; return code; }; // 桥接授权码 export const blynk_bridge_auth = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC); generator.definitions_['var_declare_WidgetBridge' + Vpin] = 'WidgetBridge bridge' + Vpin + '(' + Vpin + ');\n'; let code = 'bridge' + Vpin + '.setAuthToken(' + auth + ');\n'; return code; }; // 桥接数字输出 export const blynk_bridge_digitalWrite = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); let dropdown_stat = generator.valueToCode(this, 'STAT', generator.ORDER_ATOMIC); let code = 'bridge' + Vpin + '.digitalWrite(' + dropdown_pin + ', ' + dropdown_stat + ');\n'; return code; }; // 桥接模拟输出 export const blynk_bridge_AnaloglWrite = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let dropdown_pin = generator.valueToCode(this, 'PIN', generator.ORDER_ATOMIC); let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); let code = 'bridge' + Vpin + '.analogWrite(' + dropdown_pin + ', ' + value_num + ');\n'; return code; }; // 桥接虚拟管脚 export const blynk_bridge_VPin = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let Vpin2 = this.getFieldValue('Vpin2'); let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); let code = 'bridge' + Vpin + '.virtualWrite(' + Vpin2 + ', ' + value_num + ');\n'; return code; }; // RTC组件初始化 export const blynk_WidgetRTC_init = function (_, generator) { generator.definitions_['include_TimeLib'] = '#include <TimeLib.h>'; generator.definitions_['include_WidgetRTC'] = '#include <WidgetRTC.h>'; let value_num = generator.valueToCode(this, 'NUM', generator.ORDER_ATOMIC); generator.definitions_['var_declare_WidgetRTC'] = 'WidgetRTC rtc;\n'; generator.setups_['setSyncInterval'] = 'setSyncInterval(' + value_num + '* 60);'; let code = 'rtc.begin();\n'; return code; }; // RTC获取时间 export const blynk_WidgetRTC_get_time = function (_, generator) { let timeType = this.getFieldValue('TIME_TYPE'); let code = timeType + '()'; return [code, generator.ORDER_ATOMIC]; }; // 播放音乐组件 export const blynk_iot_playmusic = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let branch = generator.statementToCode(this, 'DO'); if (generator.INFINITE_LOOP_TRAP) { branch = generator.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + this.id + '\'') + branch; } branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格 let code = 'BLYNK_WRITE(' + Vpin + '){\n' + ' action = param.asStr();\n' + ' ' + branch + '\n' + ' Blynk.setProperty(' + Vpin + ', "label", action);\n' + '}\n'; code = generator.scrub_(this, code); generator.definitions_[Vpin] = code; return ""; }; // 光线传感器 export const blynk_light = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let branch = generator.statementToCode(this, 'DO'); branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格 let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n' + ' int lx = param.asInt();\n' + ' ' + branch + '\n' + '}\n'; generator.definitions_[Vpin] = code; return ""; }; // 重力传感器 export const blynk_gravity = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let branch = generator.statementToCode(this, 'DO'); branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格 let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n' + ' int x = param[0].asFloat();\n' + ' int y = param[1].asFloat();\n' + ' int z = param[2].asFloat();\n' + ' ' + branch + '\n' + '}\n'; generator.definitions_[Vpin] = code; return ""; }; // 加速度传感器 export const blynk_acc = blynk_gravity; // 时间输入 export const blynk_time_input_1 = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let branch = generator.statementToCode(this, 'DO'); branch = branch.replace(/(^\s*)|(\s*$)/g, "");//去除两端空格 let code = 'BLYNK_WRITE' + '(' + Vpin + '){\n' + ' long startTimeInSecs = param[0].asLong();\n' + ' long hour =startTimeInSecs/3600;\n' + ' long minute=(startTimeInSecs-3600*hour)/60;\n' + ' long second=(startTimeInSecs-3600*hour)%60;\n' + ' ' + branch + '\n' + '}\n'; generator.definitions_[Vpin] = code; return ""; }; // 执行器-蜂鸣器频率选择列表 export const tone_notes = function (_, generator) { let code = this.getFieldValue('STAT'); return [code, generator.ORDER_ATOMIC]; }; export const factory_declare2 = function (_, generator) { let VALUE = this.getFieldValue('VALUE'); generator.definitions_['var_' + VALUE] = VALUE; return ''; }; // 一键配网(无需安可信) export const blynk_AP_config = function (_, generator) { let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC); let auth_key = generator.valueToCode(this, 'auth_key', generator.ORDER_ATOMIC); let board_type = JSFuncs.getPlatform(); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; if (board_type.match(RegExp(/ESP8266/))) { generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>'; generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>'; } else if (board_type.match(RegExp(/ESP32/))) { generator.definitions_['include_WiFi'] = '#include <WiFi.h>'; generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>'; generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>'; } generator.definitions_['include_DNSServer'] = '#include <DNSServer.h>'; generator.definitions_['include_ESP8266WebServer'] = '#include <ESP8266WebServer.h>\n'; generator.definitions_['include_WiFiManager'] = '#include <WiFiManager.h>'; generator.definitions_['var_declare_WiFiServer'] = 'WiFiServer server(80);'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth_key + ';'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_WiFiManager'] = 'WiFiManager wifiManager;'; generator.setups_['setup_wifiManagerautoConnect'] = 'wifiManager.autoConnect("Blynk");'; generator.setups_['setup_server.begin'] = 'Serial.println("Connected.");\n server.begin();'; if (isNaN(server_add.charAt(2))) { generator.setups_['setup_Blynkconfig'] = 'Blynk.config(auth, ' + server_add + ', 8080);'; } else { server_add = server_add.replace(/"/g, "").replace(/\./g, ","); generator.setups_['setup_Blynkconfig'] = 'Blynk.config(auth, ' + 'IPAddress(' + server_add + '), 8080);'; } let code = 'Blynk.run();'; return code; }; // 一键配网手动配置授权码(无需安可信) export const blynk_AP_config_2 = function (_, generator) { let server_add = generator.valueToCode(this, 'server_add', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['include_FS'] = '#include <FS.h>'; generator.definitions_['include_ESP8266WiFi'] = '#include <ESP8266WiFi.h>'; generator.definitions_['include_BlynkSimpleEsp8266'] = '#include <BlynkSimpleEsp8266.h>'; generator.definitions_['include_DNSServer'] = '#include <DNSServer.h>'; generator.definitions_['include_ESP8266WebServer'] = '#include <ESP8266WebServer.h>'; generator.definitions_['include_WiFiManager'] = '#include <WiFiManager.h>'; generator.definitions_['include_ArduinoJson'] = '#include <ArduinoJson.h>'; generator.definitions_['var_declare_auth_key'] = 'char blynk_token[34] = "YOUR_BLYNK_TOKEN";'; generator.definitions_['var_declare_shouldSaveConfig'] = 'bool shouldSaveConfig = false;'; generator.definitions_['saveConfigCallback'] = 'void saveConfigCallback (){\n' + ' Serial.println("Should save config");\n' + ' shouldSaveConfig = true;\n' + '}'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['otasetup1'] = 'Serial.println("mounting FS...");\n' + ' if (SPIFFS.begin()){\n' + ' Serial.println("mounted file system");\n' + ' if (SPIFFS.exists("/config.json")) {\n' + ' Serial.println("reading config file");\n' + ' File configFile = SPIFFS.open("/config.json", "r");\n' + ' if (configFile) {\n' + ' Serial.println("opened config file");\n' + ' size_t size = configFile.size();\n' + ' std::unique_ptr<char[]> buf(new char[size]);\n' + ' configFile.readBytes(buf.get(), size);\n' + ' DynamicJsonBuffer jsonBuffer;\n' + ' JsonObject& json = jsonBuffer.parseObject(buf.get());\n' + ' json.printTo(Serial);\n' + ' if (json.success()){\n' + ' Serial.println("parsed json");\n' + ' strcpy(blynk_token, json["blynk_token"]);\n' + ' }\n' + ' else{\n' + ' Serial.println("failed to load json config");\n' + ' }\n' + ' configFile.close();\n' + ' }\n' + ' }\n' + ' }' + ' else{\n' + ' Serial.println("failed to mount FS");\n' + ' }\n' + ' WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 32);\n' + ' WiFiManager wifiManager;\n' + ' wifiManager.setSaveConfigCallback(saveConfigCallback);\n' + ' wifiManager.addParameter(&custom_blynk_token);\n' + ' wifiManager.setMinimumSignalQuality(10);\n' + ' if (!wifiManager.autoConnect()){\n' + ' Serial.println("failed to connect and hit timeout");\n' + ' delay(3000);\n' + ' ESP.reset();\n' + ' delay(5000);\n' + ' }\n' + ' Serial.println("connected...yeey :)");\n' + ' strcpy(blynk_token, custom_blynk_token.getValue());\n' + ' if(shouldSaveConfig){\n' + ' Serial.println("saving config");\n' + ' DynamicJsonBuffer jsonBuffer;\n' + ' JsonObject& json = jsonBuffer.createObject();\n' + ' json["blynk_token"] = blynk_token;\n' + ' File configFile = SPIFFS.open("/config.json", "w");\n' + ' if(!configFile){\n' + ' Serial.println("failed to open config file for writing");\n' + ' }\n' + ' json.printTo(Serial);\n' + ' json.printTo(configFile);\n' + ' configFile.close();\n' + ' }\n' + ' Serial.println("local ip");\n' + ' Serial.println(WiFi.localIP());\n'; if (isNaN(server_add.charAt(2))) { generator.setups_['otasetup1'] += ' Blynk.config(blynk_token,' + server_add + ',8080);'; } else { server_add = server_add.replace(/"/g, "").replace(/\./g, ","); generator.setups_['otasetup1'] += ' Blynk.config(blynk_token,' + 'IPAddress(' + server_add + '),8080);'; } let code = 'Blynk.run();\n'; return code; }; export const Blynk_connect_state = function (_, generator) { let code = 'Blynk.connected()'; return [code, generator.ORDER_ATOMIC]; }; // Blynk终端清屏 export const blynk_terminal_clear = function () { let code = 'terminal.clear();\n'; return code; }; // Blynk LCD显示 export const blynk_lcd = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); let x = generator.valueToCode(this, 'x', generator.ORDER_ATOMIC); let y = generator.valueToCode(this, 'y', generator.ORDER_ATOMIC); let value = generator.valueToCode(this, 'value', generator.ORDER_ATOMIC); generator.definitions_['include_lcd'] = 'WidgetLCD lcd(' + Vpin + ');\n'; let code = 'lcd.print(' + x + ', ' + y + ', ' + value + ');\n'; return code; }; // Blynk LCD清屏 export const blynk_lcd_clear = function () { let code = 'lcd.clear();\n'; return code; }; // ESP32 blynk BLE连接方式 export const blynk_esp32_ble = function (_, generator) { let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC); let name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['define_BLYNK_USE_DIRECT_CONNECT'] = '#define BLYNK_USE_DIRECT_CONNECT'; generator.definitions_['include_BlynkSimpleEsp32_BLE'] = '#include <BlynkSimpleEsp32_BLE.h>'; generator.definitions_['include_BLEDevice'] = '#include <BLEDevice.h>'; generator.definitions_['include_BLEServer'] = '#include <BLEServer.h>\n'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Serial.println("Waiting for connections...");\n' + ' Blynk.setDeviceName(' + name + ');\n' + ' Blynk.begin(auth);\n'; let code = 'Blynk.run();\n'; return code; }; // ESP32 blynk Bluetooth连接方式 export const blynk_esp32_Bluetooth = function (_, generator) { let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC); let name = generator.valueToCode(this, 'name', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['define_BLYNK_USE_DIRECT_CONNECT'] = '#define BLYNK_USE_DIRECT_CONNECT'; generator.definitions_['include_BlynkSimpleEsp32_BT'] = '#include <BlynkSimpleEsp32_BT.h>\n'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';'; generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Serial.println("Waiting for connections...");\n' + ' Blynk.setDeviceName(' + name + ');\n' + ' Blynk.begin(auth);\n'; let code = 'Blynk.run();\n'; return code; }; // Arduino blynk Bluetooth 连接方式 export const arduino_blynk_bluetooth = function (_, generator) { let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC); let RX = generator.valueToCode(this, 'RX', generator.ORDER_ATOMIC); let TX = generator.valueToCode(this, 'TX', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['include_SoftwareSerial'] = '#include <SoftwareSerial.h>'; generator.definitions_['include_BlynkSimpleSerialBLE'] = '#include <BlynkSimpleSerialBLE.h>'; generator.definitions_['define_auth'] = 'char auth[] = ' + auth + ';'; if (RX != 0 || TX != 1) { generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.definitions_['var_declare_SoftwareSerial'] = 'SoftwareSerial SerialBLE(' + RX + ', ' + TX + ');'; generator.setups_['setup_SerialBLE_begin'] = 'SerialBLE.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(SerialBLE, auth);'; } else { generator.setups_['setup_serial_Serial'] = 'Serial.begin(9600);'; generator.setups_['setup_Blynk.begin'] = 'Blynk.begin(Serial, auth);'; } generator.setups_['setup_Serial.println'] = 'Serial.println("Waiting for connections...");'; let code = 'Blynk.run();\n'; return code; }; // Blynk Table小部件添加数据 export const blynk_table = function (_, generator) { let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC); let mingcheng = generator.valueToCode(this, 'mingcheng', generator.ORDER_ATOMIC); let shujv = generator.valueToCode(this, 'shujv', generator.ORDER_ATOMIC); let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.virtualWrite(' + Vpin + ', "add", ' + id + ',' + mingcheng + ', ' + shujv + ');\n'; return code; }; // Blynk Table小部件更新数据 export const blynk_table_update = function (_, generator) { let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC); let mingcheng = generator.valueToCode(this, 'mingcheng', generator.ORDER_ATOMIC); let shujv = generator.valueToCode(this, 'shujv', generator.ORDER_ATOMIC); let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.virtualWrite(' + Vpin + ', "update", ' + id + ',' + mingcheng + ', ' + shujv + ');\n'; return code; }; // Blynk Table小部件高亮显示数据 export const blynk_table_highlight = function (_, generator) { let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC); let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.virtualWrite(' + Vpin + ', "pick", ' + id + ');\n'; return code; }; // Blynk Table小部件选择数据 export const blynk_table_select = function (_, generator) { let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC); let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.virtualWrite(' + Vpin + ', "select", ' + id + ');\n'; return code; }; // Blynk Table小部件取消选择数据 export const blynk_table_unselect = function (_, generator) { let id = generator.valueToCode(this, 'id', generator.ORDER_ATOMIC); let Vpin = this.getFieldValue('Vpin'); let code = 'Blynk.virtualWrite(' + Vpin + ', "deselect", ' + id + ');\n'; return code; }; // Blynk Table小部件数据清除 export const blynk_table_cleardata = function (_, generator) { let Vpin = this.getFieldValue('Vpin'); generator.definitions_["rowIndex_" + Vpin] = 'int rowIndex_' + Vpin + ' = 0;\n'; let code = 'Blynk.virtualWrite(' + Vpin + ', "clr");\nrowIndex_' + Vpin + ' = 0;\n'; return code; }; // blynk服务器连接状态 export const blynk_connected = function (_, generator) { let code = 'Blynk.connected()'; return [code, generator.ORDER_ATOMIC]; }; // ESP32 CAM相机 export const esp_camera = function (_, generator) { let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC); let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC); let mode = this.getFieldValue('mode'); let code = ""; if (mode > 0) { code = 'WiFi.begin(wif_ssid,wif_password);\n' + ' while (WiFi.status() != WL_CONNECTED){\n' + ' delay(500);\n' + ' Serial.print(".");\n' + ' }\n' + ' Serial.println("");\n' + ' Serial.println("WiFi connected");\n' + ' Serial.print("Camera Stream Ready! Go to: http://");\n' + ' Serial.print(WiFi.localIP());\n' + ' Serial.println("");\n'; } else { code = 'Serial.print("Setting AP (Access Point)…");\n' + 'WiFi.softAP(wif_ssid,wif_password);\n' + 'IPAddress IP = WiFi.softAPIP();\n' + 'Serial.print("Camera Stream Ready! Connect to the ESP32 AP and go to: http://");\n' + 'Serial.println(IP);\n' + 'Serial.println("");\n'; } generator.definitions_['esp_camera'] = '#include "esp_camera.h"\n#include <WiFi.h>\n#include "esp_timer.h"\n#include "img_converters.h"\n#include <Arduino.h>\n#include "fb_gfx.h"\n#include "soc/soc.h"\n#include "soc/rtc_cntl_reg.h"\n#include "dl_lib.h"\n#include "esp_http_server.h"\nconst char*wif_ssid = ' + wifi_ssid + ';\nconst char*wif_password = ' + wifi_pass + ';\n#define PART_BOUNDARY "123456789000000000000987654321"\n#define PWDN_GPIO_NUM 32\n#define RESET_GPIO_NUM -1\n#define XCLK_GPIO_NUM 0\n#define SIOD_GPIO_NUM 26\n#define SIOC_GPIO_NUM 27\n#define Y9_GPIO_NUM 35\n#define Y8_GPIO_NUM 34\n#define Y7_GPIO_NUM 39\n#define Y6_GPIO_NUM 36\n#define Y5_GPIO_NUM 21\n#define Y4_GPIO_NUM 19\n#define Y3_GPIO_NUM 18\n#define Y2_GPIO_NUM 5\n#define VSYNC_GPIO_NUM 25\n#define HREF_GPIO_NUM 23\n#define PCLK_GPIO_NUM 22\nstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;\nstatic const char* _STREAM_BOUNDARY = "\\r\\n--" PART_BOUNDARY "\\r\\n";\nstatic const char* _STREAM_PART = "Content-Type: image/jpeg\\r\\nContent-Length: %u\\r\\n\\r\\n";\nhttpd_handle_t stream_httpd = NULL;\nstatic esp_err_t stream_handler(httpd_req_t *req){\n camera_fb_t * fb = NULL;\n esp_err_t res = ESP_OK;\n size_t _jpg_buf_len = 0;\n uint8_t * _jpg_buf = NULL;\n char * part_buf[64];\n res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);\n if(res != ESP_OK){\n return res;\n }\n while(true){\n fb = esp_camera_fb_get();\n if (!fb) {\n Serial.println("Camera capture failed");\n res = ESP_FAIL;\n } else {\n if(fb->width > 400){\n if(fb->format != PIXFORMAT_JPEG){\n bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);\n esp_camera_fb_return(fb);\n fb = NULL;\n if(!jpeg_converted){\n Serial.println("JPEG compression failed");\n res = ESP_FAIL;\n }\n } else {\n _jpg_buf_len = fb->len;\n _jpg_buf = fb->buf;\n }\n }\n }\n if(res == ESP_OK){\n size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);\n res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));\n }\n if(fb){\n esp_camera_fb_return(fb);\n fb = NULL;\n _jpg_buf = NULL;\n } else if(_jpg_buf){\n free(_jpg_buf);\n _jpg_buf = NULL;\n }\n if(res != ESP_OK){\n break;\n }\n }\n return res;\n}\nvoid startCameraServer(){\n httpd_config_t config = HTTPD_DEFAULT_CONFIG();\n config.server_port = 80;\n httpd_uri_t index_uri = {\n .uri = "/",\n .method = HTTP_GET,\n .handler = stream_handler,\n .user_ctx = NULL\n };\n if (httpd_start(&stream_httpd, &config) == ESP_OK) {\n httpd_register_uri_handler(stream_httpd, &index_uri);\n } \n}\n'; generator.setups_['setups_esp_camera'] = ' WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);\n Serial.begin(115200);\n Serial.setDebugOutput(false);\n camera_config_t config;\n config.ledc_channel = LEDC_CHANNEL_0;\n config.ledc_timer = LEDC_TIMER_0;\n config.pin_d0 = Y2_GPIO_NUM;\n config.pin_d1 = Y3_GPIO_NUM;\n config.pin_d2 = Y4_GPIO_NUM;\n config.pin_d3 = Y5_GPIO_NUM;\n config.pin_d4 = Y6_GPIO_NUM;\n config.pin_d5 = Y7_GPIO_NUM;\n config.pin_d6 = Y8_GPIO_NUM;\n config.pin_d7 = Y9_GPIO_NUM;\n config.pin_xclk = XCLK_GPIO_NUM;\n config.pin_pclk = PCLK_GPIO_NUM;\n config.pin_vsync = VSYNC_GPIO_NUM;\n config.pin_href = HREF_GPIO_NUM;\n config.pin_sscb_sda = SIOD_GPIO_NUM;\n config.pin_sscb_scl = SIOC_GPIO_NUM;\n config.pin_pwdn = PWDN_GPIO_NUM;\n config.pin_reset = RESET_GPIO_NUM;\n config.xclk_freq_hz = 20000000;\n config.pixel_format = PIXFORMAT_JPEG; \n if(psramFound()){\n config.frame_size = FRAMESIZE_UXGA;\n config.jpeg_quality = 10;\n config.fb_count = 2;\n } else {\n config.frame_size = FRAMESIZE_SVGA;\n config.jpeg_quality = 12;\n config.fb_count = 1;\n }\n esp_err_t err = esp_camera_init(&config);\n if (err != ESP_OK) {\n Serial.printf("Camera init failed with error 0x%x", err);\n return;\n }\n ' + code + ' startCameraServer();\n'; return 'delay(1);\n'; }; // ESP32 CAM相机 & blynk export const esp_camera_blynk = function (_, generator) { let wifi_ssid = generator.valueToCode(this, 'wifi_ssid', generator.ORDER_ATOMIC); let wifi_pass = generator.valueToCode(this, 'wifi_pass', generator.ORDER_ATOMIC); let server_add = generator.valueToCode(this, 'server', generator.ORDER_ATOMIC); if (!isNaN(server_add.charAt(2))) { server_add = server_add.replace(/"/g, "").replace(/\./g, ","); server_add = 'IPAddress(' + server_add + ')'; } let auth = generator.valueToCode(this, 'auth', generator.ORDER_ATOMIC); generator.definitions_['define_BLYNK_PRINT'] = '#define BLYNK_PRINT Serial'; generator.definitions_['include_WiFi'] = '#include <WiFi.h>'; generator.definitions_['include_BlynkSimpleEsp32'] = '#include <BlynkSimpleEsp32.h>'; generator.definitions_['include_WidgetRTC'] = '#include <WidgetRTC.h>'; generator.definitions_['include_WiFiClient'] = '#include <WiFiClient.h>'; generator.definitions_['include_TimeLib'] = '#include <TimeLib.h>'; generator.definitions_['var_declare_auth_key'] = 'char auth[] = ' + auth + ';'; generator.definitions_['esp_camera'] = '#include "esp_camera.h"\n#include "esp_timer.h"\n#include "img_converters.h"\n#include <Arduino.h>\n#include "fb_gfx.h"\n#include "soc/soc.h"\n#include "soc/rtc_cntl_reg.h"\n#include "dl_lib.h"\n#include "esp_http_server.h"\nconst char*wif_ssid = ' + wifi_ssid + ';\nconst char*wif_password = ' + wifi_pass + ';\n#define PART_BOUNDARY "123456789000000000000987654321"\n#define PWDN_GPIO_NUM 32\n#define RESET_GPIO_NUM -1\n#define XCLK_GPIO_NUM 0\n#define SIOD_GPIO_NUM 26\n#define SIOC_GPIO_NUM 27\n#define Y9_GPIO_NUM 35\n#define Y8_GPIO_NUM 34\n#define Y7_GPIO_NUM 39\n#define Y6_GPIO_NUM 36\n#define Y5_GPIO_NUM 21\n#define Y4_GPIO_NUM 19\n#define Y3_GPIO_NUM 18\n#define Y2_GPIO_NUM 5\n#define VSYNC_GPIO_NUM 25\n#define HREF_GPIO_NUM 23\n#define PCLK_GPIO_NUM 22\nstatic const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;\nstatic const char* _STREAM_BOUNDARY = "\\r\\n--" PART_BOUNDARY "\\r\\n";\nstatic const char* _STREAM_PART = "Content-Type: image/jpeg\\r\\nContent-Length: %u\\r\\n\\r\\n";\nhttpd_handle_t stream_httpd = NULL;\nstatic esp_err_t stream_handler(httpd_req_t *req){\n camera_fb_t * fb = NULL;\n esp_err_t res = ESP_OK;\n size_t _jpg_buf_len = 0;\n uint8_t * _jpg_buf = NULL;\n char * part_buf[64];\n res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);\n if(res != ESP_OK){\n return res;\n }\n while(true){\n fb = esp_camera_fb_get();\n if (!fb) {\n Serial.println("Camera capture failed");\n res = ESP_FAIL;\n } else {\n if(fb->width > 400){\n if(fb->format != PIXFORMAT_JPEG){\n bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);\n esp_camera_fb_return(fb);\n fb = NULL;\n if(!jpeg_converted){\n Serial.println("JPEG compression failed");\n res = ESP_FAIL;\n }\n } else {\n _jpg_buf_len = fb->len;\n _jpg_buf = fb->buf;\n }\n }\n }\n if(res == ESP_OK){\n size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);\n res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);\n }\n if(res == ESP_OK){\n res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));\n }\n if(fb){\n esp_camera_fb_return(fb);\n fb = NULL;\n _jpg_buf = NULL;\n } else if(_jpg_buf){\n free(_jpg_buf);\n _jpg_buf = NULL;\n }\n if(res != ESP_OK){\n break;\n }\n }\n return res;\n}\nvoid startCameraServer(){\n httpd_config_t config = HTTPD_DEFAULT_CONFIG();\n config.server_port = 80;\n httpd_uri_t index_uri = {\n .uri = "/",\n .method = HTTP_GET,\n .handler = stream_handler,\n .user_ctx = NULL\n };\n if (httpd_start(&stream_httpd, &config) == ESP_OK) {\n httpd_register_uri_handler(stream_httpd, &index_uri);\n } \n}\n'; generator.setups_['setups_esp_camera'] = 'WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);\n Serial.begin(115200);\n Serial.setDebugOutput(false);\n camera_config_t config;\n config.ledc_channel = LEDC_CHANNEL_0;\n config.ledc_timer = LEDC_TIMER_0;\n config.pin_d0 = Y2_GPIO_NUM;\n config.pin_d1 = Y3_GPIO_NUM;\n config.pin_d2 = Y4_GPIO_NUM;\n config.pin_d3 = Y5_GPIO_NUM;\n config.pin_d4 = Y6_GPIO_NUM;\n config.pin_d5 = Y7_GPIO_NUM;\n config.pin_d6 = Y8_GPIO_NUM;\n config.pin_d7 = Y9_GPIO_NUM;\n config.pin_xclk = XCLK_GPIO_NUM;\n config.pin_pclk = PCLK_GPIO_NUM;\n config.pin_vsync = VSYNC_GPIO_NUM;\n config.pin_href = HREF_GPIO_NUM;\n config.pin_sscb_sda = SIOD_GPIO_NUM;\n config.pin_sscb_scl = SIOC_GPIO_NUM;\n config.pin_pwdn = PWDN_GPIO_NUM;\n config.pin_reset = RESET_GPIO_NUM;\n config.xclk_freq_hz = 20000000;\n config.pixel_format = PIXFORMAT_JPEG; \n if(psramFound()){\n config.frame_size = FRAMESIZE_UXGA;\n config.jpeg_quality = 10;\n config.fb_count = 2;\n } else {\n config.frame_size = FRAMESIZE_SVGA;\n config.jpeg_quality = 12;\n config.fb_count = 1;\n }\n esp_err_t err = esp_camera_init(&config);\n if (err != ESP_OK) {\n Serial.printf("Camera init failed with error 0x%x", err);\n return;\n }\n WiFi.begin(wif_ssid,wif_password);\n while (WiFi.status() != WL_CONNECTED) {\n delay(500);\n Serial.print(".");\n }\n Seria