// 用 Serial 傳遞資料int incomingByte = 0; // 用來儲存收進來的 data bytevoid setup() { Serial.begin(9600); Serial.println("Hello Arduino");}void loop() { // 檢查是否有資料可供讀取 if (Serial.available()>0){ // 讀取進來的 byte incomingByte = Serial.read(); // 印出收到的資料 Serial.print("data received: "); Serial.print(incomingByte, DEC); Serial.print(", "); Serial.print(incomingByte, HEX); Serial.print(" (HEX)"); Serial.println((char)incomingByte); }}實作 Uno 跟 Uno 說話
#include <SoftwareSerial.h>SoftwareSerial mySerial(10, 11); // RX, TXvoid setup(){ Serial.begin(9600); mySerial.begin(9600); mySerial.println("This is Uno 1 Speaking......");}void loop(){ if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()){ mySerial.print("Uno 2 Speaking "); mySerial.write(Serial.read()); mySerial.println(" to me!"); }}SPI 通訊
IIC (Inter-Integrated Circuit),它其實是I²C Bus簡稱,所以中文應該叫積體電路匯流排
Wire.begin(自己在 I2C 匯流排上的位置); )Wire.beginTransmission(要通訊的物件位置);Wire.write(訊息內文);Wire.endTransmission();#include <Wire.h>void setup(){ Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner");}void loop(){ byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ){ Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0){ Serial.print("I2C device found at address 0x"); if (address<16){ Serial.print("0"); } Serial.print(address,HEX); Serial.println("!"); nDevices++; }else if (error==4){ Serial.print("Unknow error at address 0x"); if (address<16){ Serial.print("0"); } Serial.println(address,HEX); } } if (nDevices == 0){ Serial.println("No I2C devices found\n"); }else{ Serial.println("done\n"); } delay(5000);}使用 Adafruit_SSD1306 預設的裝置類型編譯會出錯,需要修改 Adafruit_SSD1306.h
//這是 Adafruit_SSD1306 函式庫的 ssd1306_128x64_i2c 範例
#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define OLED_RESET 4Adafruit_SSD1306 display(OLED_RESET);#define NUMFLAKES 10#define XPOS 0#define YPOS 1#define DELTAY 2#define LOGO16_GLCD_HEIGHT 16#define LOGO16_GLCD_WIDTH 16static const unsigned char PROGMEM logo16_glcd_bmp[] ={ B00000000, B11000000,B00000001, B11000000,B00000001, B11000000,B00000011, B11100000, B11110011, B11100000,B11111110, B11111000,B01111110, B11111111,B00110011, B10011111, B00011111, B11111100,B00001101, B01110000,B00011011, B10100000,B00111111, B11100000, B00111111, B11110000,B01111100, B11110000,B01110000, B01110000,B00000000, B00110000};#if (SSD1306_LCDHEIGHT != 64)#error("Height incorrect, please fix Adafruit_SSD1306.h!");#endifvoid setup(){ //改成自己的 I²C 位址
display.display(); delay(2000); display.clearDisplay(); // draw a single pixel display.drawPixel(10, 10, WHITE); display.display(); delay(2000); display.clearDisplay(); // draw many lines testdrawline(); display.display(); delay(2000); display.clearDisplay(); // draw rectangles testdrawrect(); display.display(); delay(2000); display.clearDisplay(); // draw multiple rectangles testfillrect(); display.display(); delay(2000); display.clearDisplay(); // draw mulitple circles testdrawcircle(); display.display(); delay(2000); display.clearDisplay(); // draw a white circle, 10 pixel radius display.fillCircle(display.width()/2, display.height()/2, 10, WHITE); display.display(); delay(2000); display.clearDisplay(); testdrawroundrect(); delay(2000); display.clearDisplay(); testfillroundrect(); delay(2000); display.clearDisplay(); testdrawtriangle(); delay(2000); display.clearDisplay(); testfilltriangle(); delay(2000); display.clearDisplay(); // draw the first ~12 characters in the font testdrawchar(); display.display(); delay(2000); display.clearDisplay(); // draw scrolling text testscrolltext(); delay(2000); display.clearDisplay(); // text display tests display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Hello, world!"); display.setTextColor(BLACK, WHITE); // 'inverted' text display.println(3.141592); display.setTextSize(2); display.setTextColor(WHITE); display.print("0x"); display.println(0xDEADBEEF, HEX); display.display(); delay(2000); // miniature bitmap display display.clearDisplay(); display.drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); display.display(); // invert the display display.invertDisplay(true); delay(1000); display.invertDisplay(false); delay(1000); // draw a bitmap icon and 'animate' movement testdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);}void loop() {}void testdrawbitmap(const uint8_t *bitmap, uint8_t w, uint8_t h) { uint8_t icons[NUMFLAKES][3]; srandom(666); // whatever seed // initialize for (uint8_t f=0; f< NUMFLAKES; f++) { icons[f][XPOS] = random() % display.width(); icons[f][YPOS] = 0; icons[f][DELTAY] = random() % 5 + 1; } while (1) { // draw each icon for (uint8_t f=0; f< NUMFLAKES; f++) { display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, WHITE); } display.display(); delay(200); // then erase it + move it for (uint8_t f=0; f< NUMFLAKES; f++) { display.drawBitmap(icons[f][XPOS], icons[f][YPOS], logo16_glcd_bmp, w, h, BLACK); // move it icons[f][YPOS] += icons[f][DELTAY]; // if its gone, reinit if (icons[f][YPOS] > display.height()) { icons[f][XPOS] = random() % display.width(); icons[f][YPOS] = 0; icons[f][DELTAY] = random() % 5 + 1; } } }}void testdrawchar(void) { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); for (uint8_t i=0; i < 168; i++) { if (i == '\n'){ continue; } display.write(i); if ((i > 0) && (i % 21 == 0)){ display.println(); } } display.display();}void testdrawcircle(void) { for (int16_t i=0; i<display.height(); i+=2) { display.drawCircle(display.width()/2, display.height()/2, i, WHITE); display.display(); }}void testfillrect(void) { uint8_t color = 1; for (int16_t i=0; i<display.height()/2; i+=3) { // alternate colors display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2); display.display(); color++; }}void testdrawtriangle(void) { for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) { display.drawTriangle(display.width()/2, display.height()/2-i, display.width()/2-i, display.height()/2+i, display.width()/2+i, display.height()/2+i, WHITE); display.display(); }}void testfilltriangle(void) { uint8_t color = WHITE; for (int16_t i=min(display.width(),display.height())/2; i>0; i-=5) { display.fillTriangle(display.width()/2, display.height()/2-i, display.width()/2-i, display.height()/2+i, display.width()/2+i, display.height()/2+i, WHITE); if (color == WHITE){ color = BLACK; }else{ color = WHITE; } display.display(); }}void testdrawroundrect(void) { for (int16_t i=0; i<display.height()/2-2; i+=2) { display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, WHITE); display.display(); }}void testfillroundrect(void) { uint8_t color = WHITE; for (int16_t i=0; i<display.height()/2-2; i+=2) { display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color); if (color == WHITE){ color = BLACK; }else{ color = WHITE; } display.display(); }} void testdrawrect(void) { for (int16_t i=0; i<display.height()/2; i+=2) { display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE); display.display(); }}void testdrawline() { for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(0, 0, i, display.height()-1, WHITE); display.display(); } for (int16_t i=0; i<display.height(); i+=4) { display.drawLine(0, 0, display.width()-1, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(0, display.height()-1, i, 0, WHITE); display.display(); } for (int16_t i=display.height()-1; i>=0; i-=4) { display.drawLine(0, display.height()-1, display.width()-1, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=display.width()-1; i>=0; i-=4) { display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE); display.display(); } for (int16_t i=display.height()-1; i>=0; i-=4) { display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE); display.display(); } delay(250); display.clearDisplay(); for (int16_t i=0; i<display.height(); i+=4) { display.drawLine(display.width()-1, 0, 0, i, WHITE); display.display(); } for (int16_t i=0; i<display.width(); i+=4) { display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE); display.display(); } delay(250);}void testscrolltext(void) { display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(10,0); display.clearDisplay(); display.println("scroll"); display.display(); display.startscrollright(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x0F); delay(2000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll();}延伸的作業:把 Uno 跟 Uno 說話顯示出來
#include <SoftwareSerial.h>SoftwareSerial mySerial(10, 11); // RX, TXvoid setup(){ Serial.begin(9600); mySerial.begin(9600);}void loop(){ if (Serial.available()){ mySerial.write(Serial.read()); }}#include <SoftwareSerial.h>SoftwareSerial mySerial(10, 11); // RX, TX#include <Wire.h>#include <SPI.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define OLED_RESET 4Adafruit_SSD1306 display(OLED_RESET);#if (SSD1306_LCDHEIGHT != 64)#error("Height incorrect, please fix Adafruit_SSD1306.h!");#endifint incomingByte = 0;void setup(){ //改成自己的 I²C 位址 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Waiting Uno Speaking... "); display.display(); Serial.begin(9600); mySerial.begin(9600);}void loop() { if (mySerial.available()){ display.clearDisplay(); display.setCursor(0,0); display.setTextSize(2); display.setTextColor(WHITE); display.println("Uno speak"); display.println(readLine()); display.display(); }}String readLine(){ String s = ""; char c; while((c = mySerial.read()) !='\n'){ s += c; } return s;}