ESCRIBIR EN ARDUINO

PUERTO SERIAL. Continuando con mi anterior artículo Leer de Arduino, os comentaré como poder "escribir" en arduino, es decir, pasarle información a tu sketch...

ESCRIBIR EN ARDUINO

PUERTO SERIAL

Continuando con mi anterior artículo Leer de Arduino, os comentaré como poder "escribir" en arduino, es decir, pasarle información a tu sketch.

Usando como base el código del anterior artículo, puedes incorporar otro método con el que harás el trabajo. En mi caso le paso el intervalo en milisegundos con el que quiero que emita los eventos; así puedo guardar los registros de temperatura.


public synchronized void writeData(int intervalInSeconds) {
    def intervalInMilliSeconds = convertToMilliseconds(intervalInSeconds)
    try {
        outputStream.write(intervalInMilliSeconds.getBytes())
    } catch (Exception e) {
        LOG.error("Unhandled exception writing to port", e)
    }
}
                            

Quedando como resultado algo similar a esto.


package com.mallotore.monitoring.service

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStream
import gnu.io.CommPortIdentifier
import gnu.io.SerialPort
import gnu.io.SerialPortEvent
import gnu.io.SerialPortEventListener
import java.util.Enumeration
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import com.mallotore.monitoring.repository.TemperatureRepository
import com.mallotore.monitoring.model.Temperature

class TemperatureReader implements SerialPortEventListener {

    static Logger LOG = LoggerFactory.getLogger(TemperatureReader.class)

    SerialPort serialPort

    static final PORT_NAMES = [ "/dev/tty.usbserial-A9007UX1", "/dev/ttyACM0", "/dev/ttyUSB0", "COM3" ]
    private BufferedReader inputReader
    private OutputStream outputStream
    private static final int TIME_OUT = 2000
    private static final int DATA_RATE = 9600
    private TemperatureRepository temperatureRepository

    public TemperatureReader(TemperatureRepository temperatureRepository){
        this.temperatureRepository = temperatureRepository
    }

    public void initialize() {
        withPortId(){ portId ->
            try {
                serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
                serialPort.setSerialPortParams(DATA_RATE,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE)
                inputReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream()))
                outputStream = serialPort.getOutputStream()
                serialPort.addEventListener(this)
                serialPort.notifyOnDataAvailable(true)
            } catch (Exception e) {
                LOG.error("Unhandled exception initializing serial port listener",e)
            }
        }
    }

    private withPortId(Closure closure){
        System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0")
        def portId = findAvailablePort()
        if(portId){
            closure(portId)
        }
        else{
            LOG.error("Could not find COM port.")
        }
    }

    private findAvailablePort(){
        for(def portName in PORT_NAMES){

            def portId = CommPortIdentifier.getPortIdentifiers().find{ 
                it.getName().equals(portName) 
            }

            if(portId) return portId
        }
    }

    public synchronized void close() {
        if (serialPort) {
            serialPort.removeEventListener()
            serialPort.close()
            inputReader.close()
            outputStream.close()
        }
    }

    public synchronized void writeData(int intervalInSeconds) {
        def intervalInMilliSeconds = convertToMilliseconds(intervalInSeconds)
        try {
            outputStream.write(intervalInMilliSeconds.getBytes())
        } catch (Exception e) {
            LOG.error("Unhandled exception writing to port", e)
        }
    }

    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                String temperature = inputReader.readLine()
                def currentTemperature = Float.parseFloat(temperature)
                temperatureRepository.save(new Temperature(temperature:temperature))
            } catch (Exception e) {
                LOG.error("Unhandled exception on serial port event",e)
            }
        }
    }
}
                            

Con esto ya somos capaces de comunicarnos con arduino tanto para leer como para escribir.


Share Tweet Send
0 Comentarios
Cargando...