// Blink #define LED_BUITIN PC_13 // LEDはPC_13なので追加した。 void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }Arduino-IDEの→ボタン(コンパイルと書き込み)を押すことで問題なく書き込めました。boot sw は0,0のままです。
// LCDtest01 #include <LiquidCrystal.h> LiquidCrystal lcd(PB10,PB11,PB12,PB13,PB14,PB15);//rs, en, d4, d5, d6, d7 void setup() { lcd.begin(16, 2); lcd.print("hello, world! 2"); } void loop() { lcd.setCursor(0, 1); lcd.print(millis() / 1000); }問題なく表示できました。
//"serial_test01" void setup(){ Serial2.begin(9600); Serial2.println("Hello Serial 2"); } void loop() { Serial2.println("Hello World!"); while(1) { // Serial2.println(); Serial2.write(Serial2.read() + 1); } }↑
//RTCtest01 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10,PB11,PB12,PB13,PB14,PB15);//rs, en, d4, d5, d6, d7 char *wday[] = {"Mon","Tue","Wed","Thr","Fri","Sat","Sun"}; // セットアップ void setup() { struct tm_t t; Serial2.begin(115200); while (!Serial2) delay(100); t.year = 2019-1970; // 年 [1970からの経過年数] t.month = 6; // 月 [0-11] 0から始まることに注意 t.day = 30; // 日 [1-31] t.weekday = 6; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = 20; // 時 [0-23] t.minute = 5; // 分 [0-59] t.second = 0; // 秒 [0-59] // rtc.setTime(t); // 時刻の設定 ←時刻を設定するときはコメントアウトしない lcd.begin(16, 2); lcd.print("hello, world! 2"); } void loop() { char str[64]; struct tm_t st; rtc.getTime(st); // 時刻取得 sprintf(str, "%04d/%02d/%02d [%s] %02d:%02d:%02d", st.year+1970, // 西暦年 st.month, // 月 st.day, // 日 wday[st.weekday], // 曜日 st.hour, // 時 st.minute, // 分 st.second // 秒 ); Serial2.println(str); sprintf(str, "%04d %02d %02d %s ", st.year+1970, // 西暦年 st.month, // 月 st.day, // 日 wday[st.weekday] // 曜日 ); lcd.setCursor(0, 0); lcd.print(str); sprintf(str, "%02d:%02d:%02d ", st.hour, // 時 st.minute, // 分 st.second // 秒 ); lcd.setCursor(0, 1); lcd.print(str); delay(1000); }問題はプログラムの重さです。これだけで 37kB(56%)を使っています。時計を作るならともかく、他の処理に時刻を与えるにはおもすぎるのではないかと思います。なお、表示間隔にdelay(1000)を使っているので変更が必要です。
//RTCtest03 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10,PB11,PB12,PB13,PB14,PB15);//rs, en, d4, d5, d6, d7 char *wday[] = {"Mon","Tue","Wed","Thr","Fri","Sat","Sun"}; // セットアップ void setup() { struct tm_t t; Serial2.begin(115200); while (!Serial2) delay(100); t.year = 2019-1970; // 年 [1970からの経過年数] t.month = 6; // 月 [0-11] 0から始まることに注意 t.day = 30; // 日 [1-31] t.weekday = 6; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = 20; // 時 [0-23] t.minute = 5; // 分 [0-59] t.second = 0; // 秒 [0-59] // rtc.setTime(t); // 時刻の設定 設定時はコメントアウトしない lcd.begin(16, 2); lcd.print("hello, world! "); } void loop() { char str[64]; struct tm_t st; rtc.getTime(st); // 時刻取得 lcd.setCursor(0, 0); // 1行目に年月日を表示 lcd.print(st.year+1970); lcd.print(" "); if(st.month<10)lcd.print(" "); lcd.print(st.month);//1桁のときは空白を入れる lcd.print(" "); if(st.day<10)lcd.print(" "); lcd.print(st.day); lcd.print(" "); lcd.setCursor(0, 1); // 2行目に時分秒を表示 if(st.hour<10)lcd.print(" "); lcd.print(st.hour); lcd.print(":"); if(st.minute<10)lcd.print("0"); lcd.print(st.minute); lcd.print(":"); if(st.second<10)lcd.print("0"); lcd.print(st.second); lcd.print(" "); delay(1000); }Arduinoに変換するために12kBほど必要としているようですから、RTCの読み取りとlcd表示に6kBほどを要していることになります。全容量64kBから考えると許容範囲ということになるのでしょうか。
//RTCtest04 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10,PB11,PB12,PB13,PB14,PB15);//rs, en, d4, d5, d6, d7 char *wday[] = {"Mon","Tue","Wed","Thr","Fri","Sat","Sun"}; // セットアップ void setup() { struct tm_t t; Serial2.begin(115200); while (!Serial2) delay(100); t.year = 2019-1970; // 年 [1970からの経過年数] t.month = 6; // 月 [0-11] 0から始まることに注意 t.day = 30; // 日 [1-31] t.weekday = 6; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = 20; // 時 [0-23] t.minute = 5; // 分 [0-59] t.second = 0; // 秒 [0-59] // rtc.setTime(t); // 時刻の設定 lcd.begin(16, 2); lcd.print("hello, world! 2"); } void loop() { char str[64],s[17]; struct tm_t st; rtc.getTime(st); // 時刻取得 s[0]='2'; s[1]='0'; s[2]=((st.year-30)/10)+48; s[3]=((st.year-30)%10)+48; s[4]=' '; s[5]=((st.month)/10)+48; s[6]=((st.month)%10)+48; s[7]=' '; s[8]=((st.day)/10)+48; s[9]=((st.day)%10)+48; s[10]=' '; s[11]=' '; s[12]=' '; s[13]=' '; s[14]=' '; s[15]=' '; s[16]='\0'; lcd.setCursor(0, 0); lcd.print(s); s[0]=((st.hour)/10)+48; s[1]=((st.hour)%10)+48; s[2]=':'; s[3]=((st.minute)/10)+48; s[4]=((st.minute)%10)+48; s[5]=':'; s[6]=((st.second)/10)+48; s[7]=((st.second)%10)+48; s[8]=' '; s[9]=' '; s[10]=' '; s[11]=' '; s[12]=' '; s[13]=' '; s[14]=' '; s[15]=' '; s[16]='\0'; lcd.setCursor(0, 1); lcd.print(s); delay(1000); }
//RTCtest05 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10, PB11, PB12, PB13, PB14, PB15); //rs, en, d4, d5, d6, d7 //char *wday[] = {"Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"}; void setup() { pinMode(PB4, INPUT_PULLUP); pinMode(PB5, INPUT_PULLUP); pinMode(PC13, OUTPUT); Serial2.begin(115200); while (!Serial2) delay(100); lcd.begin(16, 2); lcd.print("hello, world! 2"); } void loop() { char s1[17], s2[17]; struct tm_t t, st; int sec; //時刻設定 if (digitalRead(PB4) == 0) { digitalWrite(PC13, 0); Serial2.println("Set Time. YY,MM,DD,hh,mm,ss"); while (Serial2.available() < 18) {}; t.year = Serial2.parseInt() + 30; // 年 [1970からの経過年数] t.month = Serial2.parseInt() - 1; // 月 [0-11] 0から始まることに注意 t.day = Serial2.parseInt(); // 日 [1-31] t.weekday = 0; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = Serial2.parseInt();// 時 [0-23] t.minute = Serial2.parseInt(); // 分 [0-59] t.second = Serial2.parseInt(); // 秒 [0-59] rtc.setTime(t); // 時刻の設定 } else digitalWrite(PC13, 1); //四捨五入 if (digitalRead(PB5) == 0) { if (st.second > 29) st.minute += 1; st.second = 0; rtc.setTime(st); // 時刻の設定 } rtc.getTime(st); // 時刻取得 if (st.second != sec) {//LCD表示 s1[0] = '2'; s1[1] = '0'; s1[2] = ((st.year - 30) / 10) + 48; s1[3] = ((st.year - 30) % 10) + 48; s1[4] = ' '; s1[5] = ((st.month + 1) / 10) + 48; s1[6] = ((st.month + 1) % 10) + 48; s1[7] = ' '; s1[8] = ((st.day) / 10) + 48; s1[9] = ((st.day) % 10) + 48; s1[10] = ' '; s1[11] = ' '; s1[12] = ' '; s1[13] = ' '; s1[14] = ' '; s1[15] = ' '; s1[16] = '\0'; lcd.setCursor(0, 0); lcd.print(s1); s2[0] = ((st.hour) / 10) + 48; s2[1] = ((st.hour) % 10) + 48; s2[2] = ':'; s2[3] = ((st.minute) / 10) + 48; s2[4] = ((st.minute) % 10) + 48; s2[5] = ':'; s2[6] = ((st.second) / 10) + 48; s2[7] = ((st.second) % 10) + 48; s2[8] = ' '; s2[9] = ' '; s2[10] = ' '; s2[11] = ' '; s2[12] = ' '; s2[13] = ' '; s2[14] = ' '; s2[15] = ' '; s2[16] = '\0'; lcd.setCursor(0, 1); lcd.print(s2); sec = st.second; } // Serial2.print(s1); // Serial2.println(s2); // delay(1000); }↑
//RTCtest06 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> //#include <Streaming.h> // http://arduiniana.org/libraries/streaming/ Adafruit_BMP280 bme; // I2C pppppppppp RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10, PB11, PB12, PB13, PB14, PB15); //rs, en, d4, d5, d6, d7 //char *wday[] = {"Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"}; void setup() { pinMode(PB4, INPUT_PULLUP); pinMode(PB5, INPUT_PULLUP); pinMode(PC13, OUTPUT); Serial2.begin(115200); while (!Serial2) delay(100); lcd.begin(16, 2); // lcd.print("hello, world! 2"); bme.begin(); } void loop() { char s1[17], s2[17]; struct tm_t t, st; int sec, f1, f2, flg; while (1) { //時刻設定 if (digitalRead(PB4) == 0) { digitalWrite(PC13, 0); Serial2.println("Set Time. YY,MM,DD,hh,mm,ss"); while (Serial2.available() < 18) {}; t.year = Serial2.parseInt() + 30; // 年 [1970からの経過年数] t.month = Serial2.parseInt() - 1; // 月 [0-11] 0から始まることに注意 t.day = Serial2.parseInt(); // 日 [1-31] t.weekday = 0; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = Serial2.parseInt();// 時 [0-23] t.minute = Serial2.parseInt(); // 分 [0-59] t.second = Serial2.parseInt(); // 秒 [0-59] rtc.setTime(t); // 時刻の設定 } else digitalWrite(PC13, 1); //四捨五入 if (digitalRead(PB5) == 0) { if (st.second > 29) st.minute += 1; st.second = 0; rtc.setTime(st); // 時刻の設定 } rtc.getTime(st); // 時刻取得 f2 = f1; f1 = st.second; flg = 0; if (f1 != f2)flg = 1; if (flg == 1) { s1[0] = '2'; s1[1] = '0'; s1[2] = ((st.year - 30) / 10) + 48; s1[3] = ((st.year - 30) % 10) + 48; s1[4] = ' '; s1[5] = ((st.month + 1) / 10) + 48; s1[6] = ((st.month + 1) % 10) + 48; s1[7] = ' '; s1[8] = ((st.day) / 10) + 48; s1[9] = ((st.day) % 10) + 48; s1[10] = ' '; s1[11] = '\0'; s1[12] = ' '; s1[13] = ' '; s1[14] = ' '; s1[15] = ' '; s1[16] = '\0'; lcd.setCursor(0, 0); lcd.print(s1); s2[0] = ((st.hour) / 10) + 48; if ((st.hour / 10 ) == 0) s2[0] = ' '; s2[1] = ((st.hour) % 10) + 48; s2[2] = ':'; s2[3] = ((st.minute) / 10) + 48; s2[4] = ((st.minute) % 10) + 48; s2[5] = ':'; s2[6] = ((st.second) / 10) + 48; s2[7] = ((st.second) % 10) + 48; s2[8] = ' '; s2[9] = ' '; s2[10] = '\0'; s2[11] = ' '; s2[12] = ' '; s2[13] = ' '; s2[14] = ' '; s2[15] = ' '; s2[16] = '\0'; lcd.setCursor(0, 1); lcd.print(s2); // Serial2.print(s1); // Serial2.println(s2); lcd.setCursor(11, 0); int pres = bme.readPressure() / 100 + 4; lcd.print(pres); lcd.setCursor(11, 1); int temp = bme.readTemperature() * 10; lcd.print(temp / 10); lcd.print('.'); lcd.print(temp % 10); } } // delay(1000); }↑
//RTCtest07 #include <RTClock.h> #include <time.h> #include <LiquidCrystal.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> #include <SPI.h> #include <SD.h> //#include <Streaming.h> // http://arduiniana.org/libraries/streaming/ Adafruit_BMP280 bme; // I2C pppppppppp const int chipSelect = PA4; // SD CS RTClock rtc(RTCSEL_LSE); LiquidCrystal lcd(PB10, PB11, PB12, PB13, PB14, PB15); //rs, en, d4, d5, d6, d7 //char *wday[] = {"Mon", "Tue", "Wed", "Thr", "Fri", "Sat", "Sun"}; void setup() { pinMode(PB4, INPUT_PULLUP); pinMode(PB5, INPUT_PULLUP); pinMode(PC13, OUTPUT); Serial2.begin(115200); while (!Serial2) delay(100); lcd.begin(16, 2); // lcd.print("hello, world! 2"); bme.begin(); pinMode(PA4, OUTPUT); // set OUTPUT for SPI if (!SD.begin(chipSelect)) { Serial2.println("Card failed, or not present"); // don't do anything more: return; } Serial2.println("card initialized."); } void loop() { char s1[17], s2[17]; struct tm_t t, st; int sec, f1, f2, flg; while (1) { //時刻設定 if (digitalRead(PB4) == 0) { digitalWrite(PC13, 0); Serial2.println("Set Time. YY,MM,DD,hh,mm,ss"); while (Serial2.available() < 18) {}; t.year = Serial2.parseInt() + 30; // 年 [1970からの経過年数] t.month = Serial2.parseInt() - 1; // 月 [0-11] 0から始まることに注意 t.day = Serial2.parseInt(); // 日 [1-31] t.weekday = 0; // 曜日 [0-6] 0:月曜 〜 6:日曜 t.hour = Serial2.parseInt();// 時 [0-23] t.minute = Serial2.parseInt(); // 分 [0-59] t.second = Serial2.parseInt(); // 秒 [0-59] rtc.setTime(t); // 時刻の設定 } else digitalWrite(PC13, 1); //四捨五入 if (digitalRead(PB5) == 0) { if (st.second > 29) st.minute += 1; st.second = 0; rtc.setTime(st); // 時刻の設定 } rtc.getTime(st); // 時刻取得 f2 = f1; f1 = st.second; flg = 0; if (f1 != f2)flg = 1; if (flg == 1) { s1[0] = '2'; s1[1] = '0'; s1[2] = ((st.year - 30) / 10) + 48; s1[3] = ((st.year - 30) % 10) + 48; s1[4] = ' '; s1[5] = ((st.month + 1) / 10) + 48; s1[6] = ((st.month + 1) % 10) + 48; s1[7] = ' '; s1[8] = ((st.day) / 10) + 48; s1[9] = ((st.day) % 10) + 48; s1[10] = ' '; s1[11] = '\0'; s1[12] = ' '; s1[13] = ' '; s1[14] = ' '; s1[15] = ' '; s1[16] = '\0'; lcd.setCursor(0, 0); lcd.print(s1); s2[0] = ((st.hour) / 10) + 48; if ((st.hour / 10 ) == 0) s2[0] = ' '; s2[1] = ((st.hour) % 10) + 48; s2[2] = ':'; s2[3] = ((st.minute) / 10) + 48; s2[4] = ((st.minute) % 10) + 48; s2[5] = ':'; s2[6] = ((st.second) / 10) + 48; s2[7] = ((st.second) % 10) + 48; s2[8] = ' '; s2[9] = ' '; s2[10] = '\0'; s2[11] = ' '; s2[12] = ' '; s2[13] = ' '; s2[14] = ' '; s2[15] = ' '; s2[16] = '\0'; lcd.setCursor(0, 1); lcd.print(s2); // Serial2.print(s1); // Serial2.println(s2); lcd.setCursor(11, 0); int pres = bme.readPressure() / 100 + 4; lcd.print(pres); lcd.setCursor(11, 1); int temp = bme.readTemperature() * 10; lcd.print(temp / 10); lcd.print('.'); lcd.print(temp % 10); File dataFile = SD.open("abc112.txt", FILE_WRITE); if (dataFile) { dataFile.print(st.hour); dataFile.print(" "); dataFile.print(st.minute); dataFile.print(" "); dataFile.print(st.second); dataFile.print(" "); dataFile.println(" "); dataFile.close(); } } } // delay(1000); }↑
1 boot0を'1'にセットする。 2 serial1にUSB-シリアルをつなぐ。(1に注意) 3 D:\xxxxxxx\stm32flash-0.5-win64 フォルダ内でコマンドプロンプトを開く。 このフォルダ内に generic_boot20_pc13.bin をコピーしてある。 4 "stm32flash.exe -f -v -w generic_boot20_pc13.bin COM5"を実行する。COM番号注意。 5 エラーなら電源を入れ直して実行する。 6 次の結果が得られた。 D:\xxxxxx\stm32flash-0.5-win64>stm32flash.exe -f -v -w generic_boot20_pc13.bin COM5 stm32flash 0.5 http://stm32flash.sourceforge.net/ Using Parser : Raw BINARY Interface serial_w32: 57600 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0410 (STM32F10xxx Medium-density) - RAM : 20KiB (512b reserved by bootloader) - Flash : 128KiB (size first sector: 4x1024) - Option RAM : 16b - System RAM : 2KiB Write to memory Erasing memory Wrote and verified address 0x08001bc0 (100.00%) Done.その後、\stm32flash-0.5-win64>stm32flash.exe -f COM5 でよいことがわかった。(bootスイッチ注意)
D:\xxxxxxx\stm32flash-0.5-win64>stm32flash.exe -f COM5 stm32flash 0.5 http://stm32flash.sourceforge.net/ Interface serial_w32: 57600 8E1 Version : 0x22 Option 1 : 0x00 Option 2 : 0x00 Device ID : 0x0410 (STM32F10xxx Medium-density) - RAM : 20KiB (512b reserved by bootloader) - Flash : 128KiB (size first sector: 4x1024) - Option RAM : 16b - System RAM : 2KiB↑
// oled_01.ino DrawText #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif Adafruit_SSD1306 display(-1);//リセット端子なし void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//3V3電源,スレーブ0X3C } void loop() { int i = 0; display.display();//デフォルトロゴ表示。最初に書けばcppから。 delay(2000); display.clearDisplay();// 画面表示をクリア display.display(); while (1) { display.clearDisplay();// バッファクリア display.setTextSize(2);// テキストサイズを設定 以下テキストをバッファに書き込み display.setTextColor(WHITE);// テキスト色を設定 display.setCursor(0, 0);// テキストの開始位置を設定 display.println("Hello");// 1行目に"Hello"を表示 display.setCursor(0, 20);// 2行目に display.print("World! "); display.println(i); display.setCursor(0, 40);// 3行目に display.println("10:59:28am"); バッファに書き込み終わり display.display();// 描画バッファの内容を画面に表示 delay(1000); i++; } }
// L-chika void setup() { pinMode(PA1, OUTPUT); pinMode(PA3, OUTPUT); } void loop() { digitalWrite(PA1, LOW); // ON delay(2000); digitalWrite(PA1, HIGH); // OFF delay(1000); digitalWrite(PA3, LOW); // ON delay(1300); digitalWrite(PA3, HIGH); // OFF delay(500); }多くを忘れていて、これだけ書くのにも大変でした。 ↑
プログラムです。 //プログラム"serial_test03" void setup() { Serial1.begin(9600); while (!Serial1) delay(100); Serial1.println("Serial1 OK "); } void loop() { int i; char a; Serial1.println("Hello World!"); while (1) { Serial1.println(" menu 1--3 ?"); while (!Serial1. available()); a = Serial1.read(); Serial1.println(); if (a == '1') Serial1.println(" good morning"); if (a == '2') Serial1.println(" afternoon tea"); if (a == '3') Serial1.println(" night music"); delay(1000); } }arduinoプログラムを少しずつ思い出しています。 ↑
// program:wire01-20210725 #include <Wire.h> // I2Cのヘッダファイル #include <LiquidCrystal_I2C.h> // 液晶のヘッダファイル LiquidCrystal_I2C lcd(0x27, 16, 2); // LCDの登録 I2Cアドレス、文字数、行数 void setup() { Wire.begin(); // join i2c bus (address optional for master) lcd.begin(); // LCD開始 lcd.backlight(); // バックライトON lcd.clear(); // 消去 lcd.setCursor(0, 1); // カーソル 0文字位置 2行目 lcd.print("Hello world..."); // 出力 } void loop() { lcd.setCursor(0,0); // カーソル 0文字位置 1行目 (文字位置0から, 行0から) lcd.print("OK! good."); while(1){}; }LiquidCrystal_I2C には次の命令があります(全部ではありません)。
begin(adds,cols, rows); backlight(); setCursor(col, row); home(); clear(); print(data) 数値、文字列 blink(); noBlink(); cursor(); noCursor(); |
// program: LCD-nomal01-20210725 #includeLiquidCrystal lcd(PB10, PB11, PB12, PB13, PB14, PB15); //(rs, enable, d4, d5, d6, d7) void setup() { lcd.begin(16, 2); } void loop() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("hello world!"); lcd.setCursor(0, 1); lcd.print("Good Morning!"); while (1) {} }