実現したいこと
プログラミング初心者です.お助け下さい.
Raspberry Pi picoで温度制御するプログラムをArduinoIDEで開発したいです.
確認用のシリアルモニタが停止するので原因と改善策が知りたいです.
前提
使用ボード:Raspberry Pi pico
コード編集と書き込み:ArduinoIDE ver.1.8.16 (windows)
制御方法:PI制御
温度測定:K型熱電対モジュールAdafruit_MAX31855
出力:GPIO21(SSROUT)
状況
コンパイルしてシリアルモニタを開くと数ループ分表示がされた後何も表示しなくなります.
それ以降ケーブルを抜いてIDEの再起動とコンパイルを実施してもシリアルモニタが動くことが無い状態です.
シリアルモニタのみならず出力ピンも固まったままです.(LEDにて確認)
コンパイラエラーなどは発生しませんでした.
該当のソースコード
C++いけっ,糞コード
1#include<Adafruit_MAX31855.h> 2#include<SPI.h> 3#define TAR 59 4#define SSROUT 21 5#define CLK 18 6#define CS 17 7#define DO 16 8Adafruit_MAX31855 thermocouple(CLK, CS, DO); 9 10double u_t = 0; 11double temperature = thermocouple.readCelsius(); 12double p_ratio = 0; 13double s = 0; 14double s_time = 0; 15double d_former = (TAR - 20); 16double d_now = 0; 17static const double kp = 2.7; 18static const double ki = 0.005; 19 20void sendTemperature() { 21 Serial.print("T="); 22 temperature = thermocouple.readCelsius(); 23 Serial.println(temperature); 24} 25double proportional(double temp, double target) { 26 if ((target - temp) < 0) { 27 return 0; 28 } else { 29 p_ratio = (target - temp) / target * kp; 30 } 31 if ( p_ratio > 1) { 32 p_ratio = 1; 33 } 34 Serial.print("p_ratio = "); 35 Serial.println(p_ratio); 36 return p_ratio; 37} 38double integral(double temp, double target) { 39 d_now = (target - temp); 40 Serial.print("d_now = "); Serial.print(d_now); 41 Serial.print(" d_former = "); Serial.print(d_former); 42 s += (d_former + d_now) * ki / 2; 43 d_former = d_now; 44 Serial.print(" int. time = "); 45 Serial.println(s); 46 return s; 47} 48void setup() { 49 pinMode(SSROUT, OUTPUT); 50 Serial.begin(9600); 51 while (Serial.available())char t = Serial.read(); 52} 53 54void loop() { 55 sendTemperature(); 56 //Serial.println(Serial.available()); 57// s_time = integral(temperature, TAR); 58 u_t = proportional(temperature, TAR) *1000+integral(temperature,TAR); 59 if (u_t >= 1000) { 60 u_t = 1000; 61 } 62 Serial.println(u_t); 63 digitalWrite(SSROUT, HIGH); 64 delay((int)u_t); 65 digitalWrite(SSROUT, LOW); 66 delay((int)(1000 - u_t)); 67}
試したこと
PCの受信バッファが最大であることを確認
バッファクリアのためのコード挿入
Hello worldの繰り返し表示はうまくいきました.
本題とあんま関係ないお願い
コードに改善すべき点等ありましたら教えて頂きたいです.よろしくお願いします.
回答1件
あなたの回答
tips
プレビュー