本職ではない人のAIによるソフト作成

## はじめに
私は、たまにマイコンいじっていますが何年たっても初心者の域を脱出できないのです。
運送とか商品の包装とかの確認も私の仕事ですが、ここでどうしても箱の外の温度と中の温度、そして中に包んだ製品の温度変化を確認しなければならなくなりました。
データロガーを買ってしまえば解決なのでしょうが、意外にそういう買い物は会社が許してくれません。手元にArduino UNOがあるのでなんとかできないか考えてみました。
### 解決すべき壁
先ほども書いた通り、たまにArduinoでLED光らせたり　温度計作ったりしていますがそこまでで、規模感のあるソフトウェアを組むということがなかったのです。
また、他にもいろいろしたい人なので、そこに時間を割くことができませんでした。
### AIによる、ソフト開発の可能性
そこで、目をつけたのがAIによる開発です。
職場でも、たまに単語は出てきますが、そこは本職では無いのでそれが何なのか特に気を留めることもなかったのです。
ですが、噂話程度ですが「プログラム作成」もできるらしいということでやってみました。
### 実際にできたもの
まず、AIが作ってくれたものをここに載せます。
ここまで作ってくれるとは、驚きました。
素人だと、ここまでのプログラムを組むことは困難です。

```
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <DHT.h>
#include <RTClib.h>

// ピンの定義
#define DHTPIN1 2
#define DHTPIN2 3
#define THERMISTORPIN A0
#define SD_CS_PIN 10
#define LED_PIN 13

// センサーのタイプ
#define DHTTYPE DHT22

// インスタンスの作成
DHT dht1(DHTPIN1, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);

File dataFile;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);
  lcd.init();
  lcd.begin(16,2);
  lcd.backlight();

  // SDカードの初期化
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("SDカードの初期化に失敗しました");
    return;
  }

  // RTCの初期化
  if (!rtc.begin()) {
    Serial.println("RTCの初期化に失敗しました");
    return;
  }

  if (!rtc.isrunning()) {
    Serial.println("RTCが動作していません。現在時刻を設定します。");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  // DHTセンサーの初期化
  dht1.begin();
  dht2.begin();

  // 初期化メッセージ
  lcd.setCursor(0, 0);
  lcd.print("Initializing...");
  delay(2000);
  lcd.clear();
}

void loop() {
  digitalWrite(LED_PIN, HIGH); // LEDを点灯

  DateTime now = rtc.now();

  // 外気の温度と湿度を取得
  float outsideTemp = dht1.readTemperature();
  float outsideHum = dht1.readHumidity();

  // 包装内の温度と湿度を取得
  float insideTemp = dht2.readTemperature();
  float insideHum = dht2.readHumidity();

  // サーミスターの温度を取得
  int thermistorValue = analogRead(THERMISTORPIN);
  float glassTemp = calculateTemperature(thermistorValue);

  // データをSDカードに記録
  dataFile = SD.open("datalog.csv", FILE_WRITE);
  if (dataFile) {
    dataFile.print(now.timestamp());
    dataFile.print(",");
    dataFile.print(outsideTemp);
    dataFile.print(",");
    dataFile.print(outsideHum);
    dataFile.print(",");
    dataFile.print(insideTemp);
    dataFile.print(",");
    dataFile.print(insideHum);
    dataFile.print(",");
    dataFile.println(glassTemp);
    dataFile.close();
  } else {
    Serial.println("データファイルを開けませんでした");
  }

  // シリアルモニターにデータを表示
  Serial.print("Date/Time: ");
  Serial.print(now.timestamp());
  Serial.print(" Outside Temp: ");
  Serial.print(outsideTemp);
  Serial.print(" Outside Hum: ");
  Serial.print(outsideHum);
  Serial.print(" Inside Temp: ");
  Serial.print(insideTemp);
  Serial.print(" Inside Hum: ");
  Serial.print(insideHum);
  Serial.print(" Glass Temp: ");
  Serial.println(glassTemp);

  // LCDにデータを表示
  lcd.setCursor(0, 0);
  lcd.print("Out: ");
  lcd.print(outsideTemp);
  lcd.print("C ");
  lcd.print(outsideHum);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("In: ");
  lcd.print(insideTemp);
  lcd.print("C ");
  lcd.print(insideHum);
  lcd.print("%");

  digitalWrite(LED_PIN, LOW); // LEDを消灯

  delay(30000); // 30秒待機
}

float calculateTemperature(int analogValue) {
  // サーミスターの温度計算（例）
  float resistance = (1023.0 / analogValue) - 1;
  resistance = 10000.0 / resistance;
  float temperature = (1 / (log(resistance / 10000.0) / 3950 + 1 / 298.15) - 273.15)+2.0;
  return temperature;
}
```

### 元になったAIへの注文書
結局、仕様書みたいなものを書くことになりました。
逆に言うとやりたいことがはっきりしていると、ここまで自動で作ってくれます。
最後、実際のプログラムを動かすときはLCD1602の初期化とサーミスタの温度補正のところだけいじりました。


```
プログラムと回路図を作成してください。

1,装置の仕様
・Arfuino Uno　1台
・SDカード	32Gbyte
	SDカードのCSピンはD10である。
・温度湿度センサー	AM2301　2個
・温度測定用	サーミスター		103JT-025
・RTC	DS-1307
・表示用LCD1602（I2c）
・プログラムの作成環境	ArduinoIDE　2.3.2

2,装置の目的
この装置は箱に包装したガラスの温度、湿度、露点と外気温度、湿度、露点を検討することにより、外気の影響により包装して保管しているときにガラスのヤケが発生するのか否かを検討することを目的にデータを収集する。

3,センサーの配置
外気用・・・AM2301による温度湿度測定
包装（箱）の中・・・AM2301による温度湿度測定
ガラス表面	・・・ガラスに接着したサーミスター103JT-025による温度測定

4,作成プログラムの概要
スイッチON
初期化
表示用LCD1602（I2c）初期化
割り込み時間は#define=30秒で設定でする。

RTCにより割り込み発生
	復帰
	外気用・・・AM2301による温度湿度測定
	包装（箱）の中・・・AM2301による温度湿度測定
	ガラス表面	・・・ガラスに接着したサーミスター103JT-025による温度測定
	SDカードにCSV形式により追加記録を行う。
	ファイルが無ければ作成する。
	ファイルがあれば、そのファイルに追加で記録する。
	シリアル通信でそのデータをPCに送ってシリアルモニターで確認する。
	LCD1602（I2c）に測定したデータを表示する。
割り込み終了

これを繰り返す。
また、動作していることが確認できるようにプログラム正常動作中はArduino UNO内蔵のLEDを点滅させておく。

5,記録用CSVデータのフォーマット（値のみ）
日付,時,外気の温度,外気の湿度,包装（箱）の中の温度,湿度,ガラス表面のサーミスター103JT-025による温度

以上
```

## まとめ
素人というのは、わがままなもので盛りだくさんの機能を要求してしまいます。
それは、技術的にどれほど困難かわからないからです。
自分の専門なら、そこの部分は自制が効くのですがあまり知らないことだとどうしてもあれこれ考えてしまい、これがフラストレーションになってしまいます。
今回、AIでプログラムが簡単に作成できることがわかり、このフラストレーションの部分を埋めることができました。

また、本来の仕事に時間をつぎ込めます。

今後も、私の力量はあまり伸びないでしょうが、そこはこのAIを使って埋めて実現化していきたいと思いました。
![IMG20240904204830.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876479/058a0c50-4504-781a-8926-eb519ef03839.jpeg)