🐥
Arduino(7) ソースの統合
はじめに
今まで実装した、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