完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
ESP8266 NodeMCU Dev。套件我在控制红外屏障感应到的水滴频率时遇到了问题。
连接的硬件是: - 一台步进电机,其步进由数字输出 D3 控制 - 一个红外传感器,用于检测连接到数字输入 D0 的水滴 - 一个 pH 探头连接到模拟输入 A0 设计方式: 根据所需的水滴流量,计算滴之间的时间。 在循环中使用 millis(),程序等待下降之间的时间已经到达并开始向步进电机发送步进,直到红外传感器检测到下降。然后重复这个过程。 上述过程非常顺利和稳定。 此外,系统必须使用模拟输入 A0 监测 pH 值。这是行不通的。 问题: 当我在循环中添加一行以读取模拟输入时,有时(非常频繁),程序会错过数字输入上的一个脉冲,这会导致第二滴水。我已经用示波器检查过红外线检测到下降,但程序没有检测到数字输入。 如果我用 analogRead() 注释该行,几天后一切正常。 我怀疑 analogRead() 进程对循环做了一些事情,导致一些循环周期丢失了足够的时间来错过水滴信号。 就时间而言,当检测到跌落时,数字输入打开约 500 微秒。 代码:全选#define BLYNK_MAX_SENDBYTES 1000 #define BLYNK_PRINT Serial #include #include #include #include #include #define VIRTUAL_PIN_Terminal 0 #define dosis 2 #define Virtual_Peristaltica 1 #define Analog_read 4 #define Virtual_pH 3 #define Virtual_tpo_gota 5 # define input_gota D0 # define pH_analog A0 #define StepPin D3 // pulse this pin to move one step float pendiente = 0.0000f; float constante = 0.0000f; float pH_val = 0.0000f; float Calibracion_1 = 20; SimpleTimer timer; WidgetTerminal terminal(VIRTUAL_PIN_Terminal); // Attach virtual serial terminal to Virtual Pin char auth[] = "XXXXXXXXXX"; // Authtoken Deleted by security reasons bool Peristaltica = false; bool pH_Enable = false; float millis_anterior = 0; float millis_actual = 0; float delta_millis = 0; int Conteo_paso = 0; bool Dosificando = false; float tiempo_gota = 2; float millis_gota = 0; float temp_millis_gota = 0; bool Bool_StepPin = false; String bitacora=""; String Resumen = ""; int retardo_mail = 0; int gota = 0; bool gota_nueva = true; float tpo_gota_actual = 0; float delta_tpo_gota = 0; BLYNK_CONNECTED() { // Synchronize time on connection Blynk.syncAll(); terminal.println(); terminal.println(F("Blynk v" BLYNK_VERSION)); terminal.println(F("---------------------")); terminal.println(F("** Listo **")); terminal.println(F("----------------------")); } BLYNK_WRITE(dosis) { float pinData = param.asFloat(); tiempo_gota = ( 60 * 60 * 24 ) / ( pinData * Calibracion_1 ); if (tiempo_gota < 2) tiempo_gota=2; } BLYNK_WRITE(Virtual_Peristaltica) { int pinData = param.asInt(); Peristaltica = false; if ( pinData == 1 ) Peristaltica = true; } void setup() { // put your setup code here, to run once: Serial.begin(9600); // See the connection status in Serial Monitor Wire.begin(); setSyncInterval(1); // Configura entradas y salidas pinMode(StepPin, OUTPUT); pinMode(input_gota, INPUT); // Una vez conectado a WiFi inicia Blynk con el Token predefinido Blynk.config(auth); //Una vez conectado a WiFi se conecta a Blynk Blynk.connect(); //Una vez conectado a Blynk notifica al terminal de la app setSyncInterval(60000); EEPROM.begin(1212); for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings[thisReading] = 0; } eeAddress = 0; EEPROM.get(eeAddress, pendiente); eeAddress += sizeof(float); //Move address to the next byte after float. EEPROM.get(eeAddress, constante); } void loop() { Blynk.run(); timer.run(); millis_actual = millis(); if ((((millis_actual + millis_gota - tpo_gota_actual)/1000) >= tiempo_gota) and !Dosificando) { // pH_val = pendiente * analogRead(pH_analog) + constante; / This line has to be commented in order not to miss drops. Blynk.virtualWrite(Virtual_pH, pH_val); Dosificando = true; temp_millis_gota = millis_actual; } Conteo_paso++; if ( (Conteo_paso >= 30) and Dosificando ) { digitalWrite(StepPin, !digitalRead(StepPin)); Conteo_paso = 0; } gota = digitalRead(input_gota); if ( (gota == 1) and Dosificando) { delta_tpo_gota = (millis_actual-tpo_gota_actual)/1000; tpo_gota_actual = millis_actual; millis_gota = tpo_gota_actual - temp_millis_gota; Blynk.virtualWrite(Virtual_tpo_gota, delta_tpo_gota); Dosificando = false; } } |
|
相关推荐
1个回答
|
|
您可以尝试使用ADC(模数转换器)库来读取模拟输入,并避免使用analogRead()和digitalRead()在同一循环中。以下是示例代码:
#include ADC_MODE(ADC_VCC); void setup() { Serial.begin(9600); ADC.begin(); //初始化模数转换器 } void loop() { float pH = ADC.read(0) * (3.3 / 1023.0); //读取模拟输入并转换为电压值 Serial.println(pH); delay(1000); } 您需要先安装ADC库并调用ADC_MODE(ADC_VCC)以启用ADC库。然后,使用ADC.begin()初始化模数转换器,并使用ADC.read()读取模拟输入。请注意,ADC.read()返回0到1023之间的整数值,因此您需要将其乘以VCC(通常为3.3V)并除以1023来将其转换为电压值。 请注意,在读取模拟输入时,您可能需要添加适当的电容器和电阻器以稳定读数。 |
|
|
|
只有小组成员才能发言,加入小组>>
1002 浏览 1 评论
554浏览 6评论
463浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
447浏览 5评论
448浏览 4评论
422浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 13:38 , Processed in 0.745709 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号