由于arduino中esp8266的引脚不足,我需要一种方法来检测按钮在哪里;
momentary press runs snooze()
15 sec press runs conf_Desk()
30 sec press runs calibration()
Run Code Online (Sandbox Code Playgroud)
preconfig;
int buttonPin = D7;
pinMode( buttonPin , INPUT_PULLUP);
Run Code Online (Sandbox Code Playgroud)
同时允许主循环运行.
如果我捕获一个中断,它会停止循环循环(),几毫秒的延迟是可以的,但是延迟的秒数太多了.
功能已经写好了我似乎无法提出如何跟踪并确认保持长度以根据正确的时间调用正确的功能而不停止其他必须保持循环的过程.
我想使用 Arduino CLI 或任何其他解决方案通过 OTA 在我的 Wemos D1 mini 上上传草图,但不使用 Arudino IDE,因为我需要使进程自行运行。(1. 从 web 获取代码 / 2. 将其保存到 sketch.ino 文件 / 3. 使用脚本将其编译为 .bin 文件,4. 使用 espota.py 上传)
我可以通过 ITA 使用 espota.py 命令上传草图,但我需要一个已经编译的 .bin 文件,这是我使用 Arduino IDE 获得的,所以这不是我想要的。
CMD:~/Sketch> python espota.py -d -i ip_esp8266 -f sketch.bin
ip_esp8266 例如 = 192.168.1.101 sketch.bin = 从 Arduino IDE -> Sketch -> 导出编译的二进制文件生成的文件
arduino command-line-interface ota arduino-uno arduino-esp8266
我绝望了!我希望我的ESP8266从TCP客户端接收一个字符串,执行相应的函数并给出TCP响应.但不幸的是,响应字符串以某种奇怪的方式被破坏:假设我输入了一个'未知命令',前11个字节通过串行接口正确打印(其余是转储),客户端收到的前11个字节是转储,但其余的都是正确的(见下面脚本中的评论).但是当我输入'dim'命令时,结果是正确的(但返回字符串也比"error:unknown command"短).目前我完全不知道如何解决这个问题,即使我已经尝试了很多.
#include <WiFiClient.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <string.h>
struct parsed_query{
String command;
String arguments;
};
struct parsed_query parser(void){
// this function receives and parses a query
struct parsed_query result;
result.command="entered command";
result.arguments="entered arguments"
return result
}
char* str2char(String as_string){
int i_0=0;
while(as_string[i_0]!='\0'){i_0++;}
char as_char[i_0+1];
as_char[i_0]='\0';
for(int i=0;i<i_0;i++){
as_char[i]=as_string[i];
}
return as_char;
}
String executor(String command,String arguments){
String response;
if(command=="dim"){
response="dimming";
}
else if(command=="on"){
response="switching ON";
}
else{
response="error: unknown command";
}
return response;
}
void setup(){
// initialize …Run Code Online (Sandbox Code Playgroud) 如何使用 Nodemcu - Arduino 代码发送 HTTPS - GET/POST 请求。
我花了几天时间寻找一个使用 HTTPS 协议向网站发送 GET 请求的工作示例,但我发现的所有示例均不成功。
我希望它也能帮助其他人!
我有 2 个 ESP8266 PubSubClient,它们连接到安装在 Raspberry PI3 上的 MQTT 代理。我能够连接它们并进行开/关操作,没问题!但是当我要使用它们来操作时,它会挂起并卡在重新连接循环中,当我关闭其中一个时,它工作正常。
这是我在 ESP8266 上的代码:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "SSID";
const char* password = "PASSWORD";
const char* mqtt_server = "192.168.1.10";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup() {
//pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
//Serial.begin(115200);
Serial.begin(9600);
pinMode(0, OUTPUT);
digitalWrite(0, HIGH);
pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
pinMode(4, OUTPUT); …Run Code Online (Sandbox Code Playgroud) 我正在使用PlatformIO用Arduino框架编译我的ESP8266(ESP12e)。在某些时候,如果按一定顺序使用#include,我会遇到错误。
下面是简化我的代码:
平台
[env:esp12e]
platform = espressif8266
board = esp12e
framework = arduino
upload_speed = 460800
Run Code Online (Sandbox Code Playgroud)
Teste.h
//#include <cstdlib> //<<--this
#include <cstring> //<<-- and/or this causes error!
#include <Arduino.h>
#include <map>
Run Code Online (Sandbox Code Playgroud)
测试文件
#include "Teste.h"
void setup() {}
void loop() {}
Run Code Online (Sandbox Code Playgroud)
输出量
$ pio run
Please wait while upgrading PlatformIO ...
Updating atmelavr @ 1.3.1: [Up-to-date]
Updating toolchain-atmelavr @ 1.40902.0: [Up-to-date]
Updating framework-arduinoavr @ 1.10612.1: [Up-to-date]
Updating espressif8266 @ 1.3.0: [Up-to-date]
Updating toolchain-xtensa @ 1.40802.0: [Up-to-date]
Updating tool-esptool @ …Run Code Online (Sandbox Code Playgroud) ESP SDK 库(非公开)存在限制,例如在 promisc 模式下数据包 recv 的长度(最大 112 字节)。
我试图联系他们以获得一些意见和指示 - 但他们的回答似乎都是废话。
是否可以在没有 SDK 的情况下对芯片进行编程 - 从而制作我自己的 SDK 并忘记它们的限制?
我在 Arduino 设备(本例中为 ESP8266)的 Visual Studio Code 中看不到任何 Serial.print() 输出。我期待在调试控制台上看到它。我是否配置不正确?
我知道我的代码正在工作,因为 LED 正在闪烁,但我在任何地方都没有看到任何输出。
这是我的代码:
#include <Arduino.h>
void setup()
{
Serial.begin(9600); // EDIT: added this line
Serial.println("Setup...");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
Serial.print("On!");
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
Serial.print("Off!");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此板: https://www.waveshare.com/wiki/e-Paper_ESP8266_Driver_Board
这是我的 platformio.ini 文件:
[env:esp12e]
platform = espressif8266 …Run Code Online (Sandbox Code Playgroud) 我购买了ESP32 -WROOM-32,我意识到与Arduino Nano、Arduino Uno或Arduino Mega 2560相比,有些东西不一样。
我意识到不同的事情之一是如何从控制器存储和读取数据。我想将一些数据保存到 EEPROM 中,即使设备关闭也能保留该值。
我在 Arduino 板的小型项目中一直使用以下代码。该代码包括创建一个OLED菜单,我可以在其中导航真实页面并更改整数值,这些值存储在 EEPROM 中。
我上传到 ESP32 的相同代码没有任何问题,并且菜单工作正常。我可以更改整数值。问题是关闭/打开电路板后,这些值不会保留。
我已经在网上查看了一些关于EEPROM和ESP32的教程并尝试实现它,但不幸的是没有结果。
#include <EEPROM.h>
#include <OneButton.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define DISP_RESET -1
const char*Vartext[] {"Data_0", "Data_1", "Data_2"};
const byte maxAnz = sizeof(Vartext) / sizeof(Vartext[0]);
const int mindata[maxAnz] {0, 0, 0};
const int maxdata[maxAnz] {10000, 200, 300};
uint32_t longstart;
byte Varindex;
byte Page = 0; …Run Code Online (Sandbox Code Playgroud) 我想使用 ESP32 在我的计算机上执行与 netcat“nc” 命令相同的请求:
电脑:
$ nc tcpbin.com 4242
Test
Test
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
#include <Arduino.h>
#include <WiFi.h>
WiFiClient localClient;
const char* ssid = "...";
const char* password = "...";
const uint port = 4242;
const char* ip = "45.79.112.203"; // tcpbin.com's ip
void setup() {
Serial.begin(115200);
Serial.println("Connect Wlan");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(WiFi.localIP());
}
void loop() {
sendRequest();
delay(200);
}
void sendRequest() {
if(!localClient.connected()) {
if (localClient.connect(ip, port)) …Run Code Online (Sandbox Code Playgroud) 所以我知道millis() 返回自程序开始运行以来经过的时间,对吗?
现在我遇到了这样的情况,在延迟中使用了 millis():
long dly = millis();
while (millis() - dly < 250) {
yield(); // enough time to send response
}
Run Code Online (Sandbox Code Playgroud)
的值怎么可能millis() - dly大于0?如果关键是无限期让步,为什么有人会使用这样的延迟?
我试图解决在编程 ESP8266 MCU 时遇到的一个问题,我基本上需要将一个对象声明为全局对象,这样就不会导致用户发送 HTTP 请求时其中一个库执行的回调问题,但我还需要等到从 EEPROM 获得一些数据后才能调用构造函数,因此很多人告诉我应该使用placement new,它非常适合我想要做的事情。但仍有一些我不明白的地方:在我调用该对象的构造函数之后,因为它是全局声明的,并且我试图保留它,我不应该通过调用析构函数来删除它,但我应该删除第一个我用来保存对象的指针(我不完全确定我的措辞是否正确)?
class display{
public:
display(int b){
std::cout<<"the value of a: "<<b;
}
};
char *memory= new char[sizeof(display)];
display *obj;
int main(){
int a=69;
obj=new(memory) display(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这或多或少是我在 ESP 代码中所做的事情(没有所有其他内容,但就我尝试对新的放置所做的事情而言是相同的)。我的问题是,在有人做了类似的事情之后,如果我删除*内存会导致问题还是没有必要?
arduino-esp8266 ×13
arduino ×8
esp8266 ×7
c++ ×4
esp32 ×2
arduino-c++ ×1
arduino-ide ×1
arduino-uno ×1
button ×1
compilation ×1
https ×1
mqtt ×1
nodemcu ×1
ota ×1
platformio ×1
raspberry-pi ×1
string ×1
tcp ×1
timed ×1
wifi ×1