Arduino
mqtt
PID
サーミスタ

arduinoで温度コントロール

More than 1 year has passed since last update.

概要

arduino megaでPID使って温度コントロールしてみた。
センサーはサーミスタ、熱源はドライヤー、対象はスロットルボディ。
c#でsangoにmqtt pubしてjsdoでwebsocketでsubしてグラフ化しました。

写真

MVC-018S.JPG

グラフ

paho6.JPG

回路図

ondo.JPG

サンプルコード

#include <PID_v1.h>

unsigned long time;
int sampleTime = 1000;
double Setpoint = 0;
double Input = 0;
double Output = 0;
PID body(&Input, &Output, &Setpoint, 20.0, 5.0, 3.0, DIRECT);
float r1 = 15000.0;
int i = 0;

float temp1(float rr0)
{
    float t;
    t = log(rr0);
    t = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * t * t)) * t);
    return t - 273.15;
}
void setup()
{
    Serial.begin(115200);
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    Setpoint = 25.0;
    body.SetOutputLimits(-255.0, 255.0);
    body.SetSampleTime(sampleTime);
    body.SetMode(AUTOMATIC);
}
void loop()
{
    int d;
    float r;
    if (millis() - time >= sampleTime)
    {
        time = millis();
        d += analogRead(A0);
        r = r1 * d / (1024.0 - d);
        Input = temp1(r);
        i++;
        if (i > 19)
        {
            i = 0;
            Serial.println(Input);
        }
        if (body.Compute())
        {
            //Serial.println(Output);
        }
        else
        {
            Serial.println("ng!!");
        }
        if (Output > 0)
        {
            digitalWrite(10, LOW);
        }
        else
        {
            digitalWrite(10, HIGH);
        }
    }
}

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
using uPLibrary.Networking.M2Mqtt;

namespace ConsoleApplication6
{
    class Program
    {
        private static MqttClient client;
        static void Main(string[] args)
        {            
            client = new MqttClient("lite.mqtt.shiguredo.jp", 1883, false, null);
            var ret = client.Connect("paho", "ohisama@github", "");
            Console.WriteLine("Connected with result code {0}", ret);
            SerialPort port = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            try
            {
                port.Open();
                port.DtrEnable = true;
                port.RtsEnable = true;
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }
            Console.WriteLine("port open>");
            string comand = null;
            comand = Console.ReadLine();
        }
        private static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort)sender;
            string data = port.ReadExisting();
            Console.Write(data);
            pub(data);
        }
        private static void pub(string value)
        {
            Console.WriteLine("pub");
            //Console.WriteLine(value);
            Byte[] dat = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(value);
            client.Publish("ohisama@github/test0", dat, 0, false);
        }
    }
}

サンプルコード

var myChart;
window.onload = function() {
    var ctx = document.getElementById("chart").getContext("2d");
    var data = {
        labels : ["", "", "", "", "", "", "", "", "", "", ""],
        datasets : [{
            label : "temp",
            fillColor : "rgba(151, 187, 205, 0.2)",
            strokeColor : "rgba(151, 187, 205, 1)",
            pointColor : "rgba(151, 187, 205, 1)",
            pointStrokeColor : "#fff",
            pointHighlightFill : "#fff",
            pointHighlightStroke : "rgba(151, 187, 205, 1)",
            data : [20, 20, 20, 20, 20, 20, 20, 20, 20]
        }]
    };
    myChart = new Chart(ctx).Line(data, {
        scaleOverride : true,
        scaleSteps : 10,
        scaleStepWidth : 3.0,
        scaleStartValue : 10,
        scaleShowGridLines : false
    });
}
var client;
function setup() {
    var userName = 'ohisama@github';
    var password = '';
    var websocketUrl = 'ws://lite.mqtt.shiguredo.jp:8080/mqtt';
    client = new Paho.MQTT.Client(websocketUrl, 'papo');
    client.connect({
         userName : userName,
         password : password,
         onSuccess : onConnect,
         onFailure : failConnect
    });
    client.onConnectionLost = onConnectionLost;
    client.onMessageArrived = onMessageArrived;
}
function failConnect(e) {
    alert('failed!');
}
function onConnect() {
    alert("connect");
    client.subscribe('ohisama@github/test0');
}
function onMessageArrived(message) {
    var val = message.payloadString;
    var s = parseFloat(val);
    myChart.addData([s], "");
    myChart.removeData();
}
function onConnectionLost(responseObject) {
    if (responseObject.errorCode !== 0) 
    {
        alert("onConnectionLost:" + responseObject.errorMessage);
    }
}
setup();