🐥

Arduino(7) ソースの統合

2021/08/16に公開

はじめに

今まで実装した、LCD液晶/RTC/SDカード/LANの実装を全部統合して一つにします。

まずは実装

全部なので、結構長いです。過去分のソースの寄せ集めです。

#include <stdio.h>

//LCD
#include <Wire.h>
//RTC
#include <DS3232RTC.h>
//LAN
#include <Ethernet.h>
#include <ArduinoJson.h>
//SD
#include <SPI.h>
#include <SD.h>

byte lcdAddress = 0x50;
char str[] = {"0000/00/00      00:00:00"};

//LAN
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
EthernetServer server(80);
//char *rxBuffer;
//int rxBufferIndex;

//-----------------------------------------------
//  時刻の表示
//-----------------------------------------------
void rtc2lcd()
{
  char buffer[] = {"0000"};
  int value;

  //年を取得して文字列に代入
  value = year();
  itoa(value, buffer, 10);
  strncpy(str, buffer, 4);

  //月を取得して文字列に代入
  buffer[0] = '0';
  value = month();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[5], &buffer[1], 2);
  }else{
    strncpy(&str[5], buffer, 2);
  }
  
  //日を取得して文字列に代入
  value = day();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[8], &buffer[1], 2);
  }else{
    strncpy(&str[8], buffer, 2);
  }

  //時を取得して文字列に代入
  value = hour();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[16], &buffer[1], 2);
  }else{
    strncpy(&str[16], buffer, 2);
  }

  //分を取得して文字列に代入
  value = minute();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[19], &buffer[1], 2);
  }else{
    strncpy(&str[19], buffer, 2);
  }
  
  //秒を取得して文字列に代入
  value = second();
  itoa(value, &buffer[1], 10);
  if(value > 9)
  {
    strncpy(&str[22], &buffer[1], 2);
  }else{
    strncpy(&str[22], buffer, 2);
  }
  lcdWrite(str);                      //LCDに反映
}
//-----------------------------------------------
//  ACM1602NI初期化
//-----------------------------------------------
void lcdInit()
{
  i2cCmdWrite(0x01);    //Clear Display
  delay(5);
  i2cCmdWrite(0x38);    //Function Set
  delay(5);
  i2cCmdWrite(0x0c);    //Display ON/OFF Control
  delay(5);
  i2cCmdWrite(0x06);    //Entry Mode Set
  delay(5);  
}
//-----------------------------------------------
//  文字列の書き出し
//-----------------------------------------------
void lcdWrite(char* str)
{
  int i;

  i2cCmdWrite(0x80);    //1行目の先頭にカーソルを移動
  delay(5);
  for(i = 0;i < 16;i++)
  {
    if(*str == '\0')break;
    i2cDataWrite(*str++);
    delay(5);
  }
  i2cCmdWrite(0xc0);    //2行目の先頭にカーソルを移動
  delay(5);
  for(i = 0;i < 16;i++)
  {
    if(*str == '\0')break;
    i2cDataWrite(*str++);
    delay(5);
  }
}
//-----------------------------------------------
//  I2CにてACM1602NIにコマンドを送信
//-----------------------------------------------
int i2cCmdWrite(byte cmd){
  Wire.beginTransmission(lcdAddress);
  Wire.write(0x00);
  Wire.write(cmd);
  return Wire.endTransmission();
}

//-----------------------------------------------
//  I2CにてACM1602NIに表示文字を送信
//-----------------------------------------------
int i2cDataWrite(byte data){
  Wire.beginTransmission(lcdAddress);
  Wire.write(0x80);
  Wire.write(data);
  return Wire.endTransmission();
}

//-----------------------------------------------
//  受信した値をRTCにセットする
//-----------------------------------------------
void lanRx()
{
  byte c;
  String line = "" ;
  time_t t;
  tmElements_t tm;
  int getTimeCount = 0;

  const char* sensor;
  char* times;
  char* date;
  char* sd;
  double latitude;
  double longitude;
  
  EthernetClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        line = client.readStringUntil('\n');

        StaticJsonDocument<200> doc;
        DeserializationError err = deserializeJson(doc, line);
        times = doc["time"];
        date = doc["date"];
        sd = doc["sd"];
        
        if(strlen(date) == 8)
        {
          String Data = date;
          Serial.println(Data);
          tm.Year  = y2kYearToTm((Data.substring(0, 2)).toInt());
          tm.Month = (Data.substring(3, 3 + 2)).toInt();
          tm.Day   = (Data.substring(6, 6 + 2)).toInt();
          getTimeCount++;
        }
        if(strlen( times) == 8)
        {
          String Data = times;
          Serial.println(Data);
          tm.Hour = (Data.substring(0, 2)).toInt();
          tm.Minute = (Data.substring(3, 3 + 2)).toInt();
          tm.Second = (Data.substring(6, 6 + 2)).toInt();
          getTimeCount++;
        }
        
        if(strlen(sd) >= 1)
        {
          Serial.print("--- SD Write Proc ---");
          File myFile = SD.open("test.txt", FILE_WRITE);
          if (myFile) {
            Serial.print("Writing to test.txt...");
            myFile.print(str);
            myFile.print("   ");
            myFile.println(sd);
            myFile.close();
            Serial.println("done.");
          } else {
            Serial.println("error opening test.txt");
          }
        }
        
      }
    }
    if(getTimeCount == 2)
    {
        t = makeTime(tm);
        RTC.set(t);
        setTime(t);
    }
  }
  delay(1);
  // close the connection:
  client.stop();  
}
//-----------------------------------------------
//  Main
//-----------------------------------------------
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("start");
  //LCD
  Wire.begin();
  lcdInit();
  
  //RTC
  setSyncProvider(RTC.get);
  if(timeStatus() != timeSet)
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time");
  
  //LAN
  Ethernet.begin(mac, ip);
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  //rxBuffer = (char*)malloc(200);
  //rxBuffer[0] = '\n';

  //SD
  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("SD initialization done.");
  
}

void loop() {
  // put your main code here, to run repeatedly:
  rtc2lcd();
  lanRx();
  delay(1000);
  Serial.println("Proc...");
}

動作確認

コマンドにて時刻合わせ出来ます。(ここは従来通り)

コマンドにてSDカードへの書き込みも出来ます。時刻合わせと同じ形式として「SD」文言と書き込みたい文字列を送る事でSD書き込みを実施する様にしました。

この結果は、SDカード内に「TEST.TXT」ファイルが作成されて、コマンドの内容が書き込まれます。

残件

ソースコードが汚いのはご勘弁を。
次は何しようか…。

Discussion