Hola, muchas gracias por la ayuda, he buscado por miles de sitios en hilos con la misma pregunta pero no logro dar con la solución, estoy realizando un proyecto donde tengo que utilizar múltiples sensores y visualizarlos en Processing, todo funciona bien la primera vez, pero supongamos que cierro la ventana del programa y lo vuelvo a iniciar es ahí cuando en processing me da ese error “Error, disabling serialEvent() for COM3 null” y no puede volver a iniciar a menos que yo desconecte y conecte de nuevo el USB, así que necesitaría resolver este asunto con código, saber qué estoy haciendo mal? Muchas gracias.
Código en Arduino:
#include <DHT.h>
#define DHTPIN A5
#define DHTTYPE DHT11
String dato;
int rawValue;
const int led = 13;
const int led2 = 12;
char valor = 0;
const int SENSOR = A0;
int aire = 0;
int analogPin=A4;
DHT dht(DHTPIN, DHTTYPE);
unsigned long TiempoAhora = 0;
bool heartbeatDetected(int IRSensorPin, int delay)
{
static int maxValue = 0;
static bool isPeak = false;
bool result = false;
rawValue = analogRead(IRSensorPin);
rawValue *= (1000/delay);
if (rawValue * 4L < maxValue) { maxValue = rawValue * 0.8; }
if (rawValue > maxValue - (1000/delay)) {
if (rawValue > maxValue) {
maxValue = rawValue;
}
if (isPeak == false) {
result = true;
}
isPeak = true;
} else if (rawValue < maxValue - (3000/delay)) {
isPeak = false;
maxValue-=(1000/delay);
}
return result;
}
void setup()
{
Serial.begin(115200);
dht.begin();
analogReference(1);
pinMode(led,OUTPUT);
pinMode(led2,OUTPUT);
digitalWrite(led,LOW);
}
const int delayMsec = 30; // 100msec per sample
void loop()
{
static int beatMsec = 0;
int heartRateBPM = 0;
if (heartbeatDetected(analogPin, delayMsec)) {
heartRateBPM = 60000 / beatMsec;
digitalWrite(led2,1);
beatMsec = 0;
} else {
digitalWrite(led2,0);
}
delay(delayMsec);
//delay(30);
beatMsec += delayMsec;
// TiempoAhora = millis();
// beatMsec += delayMsec;
// while(millis()< TiempoAhora+delayMsec){
// }
int h = dht.readHumidity();
int t = dht.readTemperature();
float hic = dht.computeHeatIndex(t, h, false);
aire = analogRead(SENSOR)*1;
dato = ",";
dato += t;
dato += ",";
dato += aire;
dato +=",";
dato +=h;
dato +=",";
dato +=heartRateBPM;
Serial.println(dato);
if (Serial.available() > 0)
{
valor = Serial.read();
if (valor == 'E')
{
digitalWrite(led,HIGH);
}
else if (valor == 'A')
{
digitalWrite(led,LOW);
}
else
{
Serial.println("Caracter NO PERMITIDO");
}
}
}
Código en Processing: También tengo un “void apagar” para desconectar el puerto serie con un botón creado en el GUI y cuando lo uso el resultado es el mismo, luego de apagar y encender el puerto por segunda vez me da el mismo error.
import g4p_controls.*;
import processing.serial.*;
import peasy.*;
Serial puerto;
boolean encendido = false;
float datoanterior = 0;
float inByte[] = {0,0,0,0,0};
boolean newData = false;
int xPos = 0;
int lastxPos=1;
int lastheight=0;
//Fin de gráfica...............
public void setup(){
size(1000, 600, JAVA2D);
createGUI();
customGUI();
//puerto = new Serial(this,"COM4", 9600);
background(17,34,51);
rect(0, 95, 999, 355,1);
stroke(196,196,196);
fill(258,258,258);
textSize(13);
text("Amplitud",562,565);
text("Zero",685,565);
for (int i = 0; i < 999; i=i+20) {
line(20+i, 95,20+i, 450);
}
for (int i = 0; i < 350; i=i+20) {
line(0, 95+i, 1000, 95+i);
}
}
public void draw(){
fill(17,34,51);
rect(820, 0, 130, 80,1);
fill(258,258,258);//Color del Texto arriba derecha.
textSize(13);
text("Fecha: "+day()+"/"+month()+"/"+year(),828,30);
text("Hora: "+hour()+":"+minute()+":"+second(),828,50);
fill(17,34,51);
rect(7, 451, 170, 80,1);
fill(258,258,258);
textSize(16);
text("Temperatura: "+inByte[1]+"°C",7,470);
text("Humedad: " + inByte[3]+"%",7,500);
//text("BPM: " + inByte[4],7,530);
if(inByte[4]>0){
datoanterior = inByte[4];
text("BPM: " + inByte[4],7,530);
}
else {
text("BPM: " + datoanterior,7,530);
}
if (newData) {
stroke(17,34,51);
strokeWeight(1);
line(lastxPos, lastheight, xPos, height - inByte[0]);
lastxPos= xPos;
lastheight= int(height-inByte[0]);
if (xPos >= width) {
xPos = 0;
lastxPos= 0;
saveFrame( "Pantallazos Automáticos cada 30s"+"/"+day()+"-"+month()+"-"+year()+" a las "+hour()+"_"+minute() +" con "+ second()+"s"+ ".png") ;
rect(0, 95, 999, 355,1);
stroke(196,196,196);
for (int i = 0; i < 999; i=i+20) {
line(20+i, 95,20+i, 450);
}
for (int i = 0; i < 350; i=i+20)
line(0, 95+i, 1000, 95+i);
}
}
else {
// Incrementa la posición horizontal.
xPos++;
}
newData =false;
}
}
public void customGUI(){
}
void serialEvent (Serial myPort) {
// obtener la cadena ASCII:
String inString = myPort.readStringUntil('\n');
if (inString != null) {
inString = trim(inString);
inByte = float(split(inString, ','));
inByte[0] = float(inString);
inByte[0] = map(inByte[2], 0, 1023, 0, height);
newData = true;
}
}
void Encender(){
puerto.write('E');
}
void Apagar(){
puerto.write('A');
}
void GuardarPNG(){
saveFrame( "Pantallazos Guardados con Click"+"/"+day()+"-"+month()+"-"+year()+" a las "+hour()+"_"+minute() +" con "+ second()+"s"+ ".png") ; }
void onoff(){
if (encendido == false) {
puerto = new Serial(this,Serial.list()[0], 115200);
encendido = true;
}
else {
puerto.stop();
encendido = false;
}
}
void Terminar(){
exit();
}
Muchas gracias.