37款傳感器與執行器的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止這37種的。鑒於本人手頭積累了一些傳感器和執行器模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里准備逐一動手嘗試系列實驗,不管成功(程序走通)與否,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程)
實驗九十九:8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組
MAX7219
是美國MAXIM 公司推出的多位LED 顯示驅動器,采用3 線串行接口傳送數據,可直接與單片機接口連接,用戶能方便修改其內部參數,以實現多位LED 顯示。它內含硬件動態掃描電路、BCD譯碼器、段驅動器和位驅動器。此外,其內部還含有8X8 位靜態RAM,用於存放8 個數字的顯示數據。顯然,它可直接驅動64 段LED點陣顯示器。當多片MAX7219 級聯時,可控制更多的LED 點陣顯示器。顯示的數據通過單片機數據處理后,送給MAX7219 顯示。
MAX7219/MAX7221是一種集成化的串行輸入/輸出共陰極顯示驅動器,它連接微處理器與8位數字的7段數字LED顯示,也可以連接條線圖顯示器或者64個獨立的LED。其上包括一個片上的B型BCD編碼器、多路掃描回路,段字驅動器,而且還有一個8*8的靜態RAM用來存儲每一個數據。只有一個外部寄存器用來設置各個LED的段電流。MAX7221與SPI™、QSPI™以及 MICROWIRE™相兼容,同時它有限制回轉電流的段驅動來減少EMI(電磁干擾)。一個方便的四線串行接口可以聯接所有通用的微處理器。每個數據可以尋址在更新時不需要改寫所有的顯示。MAX7219/MAX7221同樣允許用戶對每一個數據選擇編碼或者不編碼。整個設備包含一個150μA的低功耗關閉模式,模擬和數字亮度控制,一個掃描限制寄存器允許用戶顯示1-8位數據,還有一個讓所有LED發光的檢測模式。
MAX7219管腳描述
1 DIN 串行數據輸入端口。在時鍾上升沿時數據被載入內部的16位寄存器。
2,3,5-8,10,11 DIG 0–DIG7 八個數據驅動線路置顯示器共陰極為低電平。關閉時7219此管腳輸出高電平,7221呈現高阻抗。
4,9 GND 地線 (4腳和9腳必須同時接地)
12 LOAD (MAX7219) 載入數據。連續數據的后16位在LOAD端的上升沿時被鎖定。CS (MAX7221) 片選端。該端為低電平時串行數據被載入移位寄存器。連續數據的后16位在cs端的上升沿時被鎖定。
13 CLK 時鍾序列輸入端。最大速率為 10MHz.在時鍾的上升沿, 數據移入內部移位寄存器。 下降沿時, 數據從DOUT端輸出。對MAX7221來說,只有當cs端為低電平時時鍾輸入才有效。
14-17,20-23 SEG 7 段和小數點驅動,為顯示器提供電流。當一個段驅A–SEG G, 動關閉時,7219的此端呈低電平,7221呈現高阻抗。DP
18 SET 通過一個電阻連接到VDD 來提高段電流。
19 V+ 正極電壓輸入,+5V
24 DOUT 串行數據輸出端口,從DIN輸入的數據在16.5個時鍾周期后在此端有效。當使用多個MAX7219/MAX7221時用此端方便擴展。
MAX7219功能特點
1 10MHz連續串行口
2 獨立的LED段控制
3 數字的譯碼與非譯碼選擇
4 150μA的低功耗關閉模式
5 亮度的數字和模擬控制
6 高電壓中斷顯示
7 共陰極LED顯示驅動
8 限制回轉電流的段驅動來減少EMI(MAX7221)
9 SPI, QSPI, MICROWIRE串行接口(MAX7221)
10 24腳的 DIP和 SO 封裝
8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組
8X32 LED點陣顯示級聯模塊,MAX7219是一種集成化的串行輸入/輸出共陰極顯示驅動器,它連接微處理器與8位數字的7段數字LED顯示,也可以連接條線圖顯示器或者64個獨立的LED。其上包括一個片上的B型BCD編碼器、多路掃描回路,段字驅動器,而且還有一個8*8的靜態RAM用來存儲每一個數據。只有一個外部寄存器用來設置各個LED的段電流。一個方便的四線串行接口可以聯接所有通用的微處理器。每個數據可以尋址在更新時不需要改寫所有的顯示。MAX7219同樣允許用戶對每一個數據選擇編碼或者不編碼。整個設備包含一個150μA的低功耗關閉模式,模擬和數字亮度控制,一個掃描限制寄存器允許用戶顯示1-8位數據,還有一個讓所有LED發光的檢測模式。只需要3個IO口即可驅動1個點陣!點陣顯示時無閃爍!支持級聯!
8X32 LED點陣顯示模塊參考電原理圖
模塊參數:
1.單個模塊可以驅動一個8*8共陰點陣
2.模塊工作電壓:5V
3.模塊尺寸:長12.8厘米X寬3.2厘米X高1.3厘米
4.帶64個固定螺絲孔,孔徑3mm
5.模塊帶輸入輸出接口,支持多個模塊級聯
接線說明:
1.模塊左邊為輸入端口,右邊為輸出端口。
2.控制單個模塊時,只需要將輸入端口接到CPU
3.多個模塊級聯時,第1個模塊的輸入端接CPU,輸出端接第2個模塊的輸入端,第2個模塊的輸出端接第3個模塊的輸入端,以此類推...
實驗開源代碼
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十九:8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組 1、下載安裝庫: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 2、項目:應用多種函數,顯示字母,笑臉等圖案以及左向移動 3、連線: VCC → 5V GND → GND DIN → D11 CS → D12 CLK → D13 */ #include <MaxMatrix.h> int DIN = 11; // DIN pin of MAX7219 module int CLK = 13; // CLK pin of MAX7219 module int CS = 12; // CS pin of MAX7219 module int maxInUse = 1; MaxMatrix m(DIN, CS, CLK, maxInUse); char A[] = {4, 8, B01111110, B00010001, B00010001, B01111110, }; char B[] = {4, 8, B01111111, B01001001, B01001001, B00110110, }; char smile01[] = {8, 8, B00111100, B01000010, B10010101, B10100001, B10100001, B10010101, B01000010, B00111100 }; char smile02[] = {8, 8, B00111100, B01000010, B10010101, B10010001, B10010001, B10010101, B01000010, B00111100 }; char smile03[] = {8, 8, B00111100, B01000010, B10100101, B10010001, B10010001, B10100101, B01000010, B00111100 }; void setup() { m.init(); // MAX7219 initialization m.setIntensity(8); // initial led matrix intensity, 0-15 } void loop() { // Seting the LEDs On or Off at x,y or row,column position m.setDot(6,2,true); delay(1000); m.setDot(6,3,true); delay(1000); m.clear(); // Clears the display for (int i=0; i<8; i++){ m.setDot(i,i,true); delay(300); } m.clear(); // Displaying the character at x,y (upper left corner of the character) m.writeSprite(2, 0, A); delay(1000); m.writeSprite(2, 0, B); delay(1000); m.writeSprite(0, 0, smile01); delay(1000); m.writeSprite(0, 0, smile02); delay(1000); m.writeSprite(0, 0, smile03); delay(1000); for (int i=0; i<8; i++){ m.shiftLeft(false,false); delay(300); } m.clear(); }
實驗開源代碼之二
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十九:8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組 1、下載安裝庫: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 2、項目:程序中將所要顯示的圖型使用數組方式存放,主回圈中交錯顯示在 8x8 點陣 模塊上產生一個有趣的點陣動畫 3、連線: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include <SPI.h> const byte sprite[2][8] = { { 0xf8, 0xbc, 0x15, 0x7e, 0x7e, 0x15, 0xbc, 0xf8 }, { 0xfc, 0x8e, 0x1b, 0x2e, 0x2e, 0x1b, 0x8e, 0xfc } }; const byte DECODEMODE = 0x09; const byte INTENSITY = 0x0a; const byte SCANLIMIT = 0x0b; const byte SHUTDOWN = 0x0c; const byte DISPLAYTEST = 0x0f; void max7219(const byte reg, const byte data) { digitalWrite(SS, LOW); SPI.transfer(reg); SPI.transfer(data); digitalWrite(SS, HIGH); } void setup() { SPI.begin(); max7219(SCANLIMIT, 7); max7219(DECODEMODE, 0); max7219(INTENSITY, 2); max7219(DISPLAYTEST, 0); max7219(SHUTDOWN, 1); for(byte i=0; i<8; i++) { max7219(i+1, 0); } } void loop() { for(byte j=0; j<2; j++) { for(byte i=0; i<8; i++) { max7219(i+1, sprite[j]); } delay(500); } }
實驗開源代碼之三
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十九:8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組 1、下載庫 https://www.pjrc.com/teensy/arduino_libraries/Matrix_Sprite.zip 2、項目:在四個8x8屏間跳動的紅點(快速掃描所有點陣) 3、連線: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include <Sprite.h> // Sprite before Matrix #include <Matrix.h> const int numChips = 4; //DIN, CLK, SS, #chips Matrix myLeds = Matrix(11, 13, 10, numChips); void setup() { myLeds.clear(); } void loop() { byte x, y; // light one LED at a time, scanning left to right // and top to bottom... useful for testing the matrix for (y=0; y<8; y++) { for (x=0; x<(numChips * 8); x++) { myLeds.write(x, y, HIGH); delay(20); myLeds.write(x, y, LOW); } } }
實驗開源代碼之四
/* 【Arduino】168種傳感器模塊系列實驗(資料代碼+仿真編程+圖形編程) 實驗九十九:8X32 LED點陣顯示模塊 MAX7219 輸出 共陰 5V 四位點陣模組 1、下載庫 https://www.pjrc.com/teensy/arduino_libraries/Matrix_Sprite.zip 2、項目:顯示字母 3、連線: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include <Sprite.h> // Sprite before Matrix #include <Matrix.h> //DIN, CLK, CS, #chips Matrix myLeds = Matrix(11, 13, 10, 3); Sprite letter_L = Sprite(5, 8, B11000, B11000, B11000, B11000, B11000, B11000, B11111, B11111 ); Sprite letter_E = Sprite(5, 8, B11111, B11111, B11000, B11110, B11110, B11000, B11111, B11111 ); Sprite letter_D = Sprite(6, 8, B111100, B111110, B110111, B110011, B110011, B110111, B111110, B111100 ); Sprite letter_S = Sprite(5, 8, B01110, B11111, B11000, B11110, B01111, B00011, B11111, B01110 ); void setup() { myLeds.clear(); myLeds.setBrightness(0); myLeds.write(3, 0, letter_L); myLeds.write(10, 0, letter_E); myLeds.write(18, 0, letter_D); myLeds.write(26, 0, letter_S); } void loop() { }
實驗場景圖
Matrix庫的幾個函數
基本用法,僅限像素
Matrix myLeds = Matrix(DIN,CLK,LOAD,numChips);
使用您選擇的名稱創建Matrix對象的實例。DIN,CLK和LOAD是連接這些信號的引腳號。如果連接了多個單獨連接的MAX7219芯片,則可以創建多個對象。
myLeds。clear();
清除整個顯示屏。
myLeds。setBrightness(15);
設置顯示亮度,從0到15(最亮)。
myLeds。write(x,y,value);
更改單個像素。對於關閉,值應為LOW,對於on,值應為HIGH。
基本用法,使用Sprite
Sprite myIcon = Sprite(寬度,高度,B11000,B11000,B11111,B11111);
創建一個精靈對象。您可以根據需要創建任意數量的精靈,每個精靈都有一個唯一的名稱。寬度應與每個數據值中的位數匹配,高度應與數據值的數量匹配。
myLeds。write(x,y,myIcon);
在顯示屏上繪制一個閃爍的精靈。
Sprite庫允許創建與Matrix庫一起使用的圖像精靈
Sprite
啟動LCD庫。
width()
返回精靈的寬度(以像素為單位)。
height()
返回精靈的高度(以像素為單位)。
write()
將數據寫入精靈的x,y位置。
read()
返回存儲在sprite的x,y位置的數據。
實驗開源仿真編程(Linkboy V4.63)
實驗開源圖形編程(Mind+、Mixly、編玩邊學)
【花雕動手做】有趣好玩的音樂可視化系列小項目(08)---四位32段點陣屏
項目之三:紅綠色32段級聯頻譜點陣屏燈(FFT算法)
實驗開源代碼
/* 【花雕動手做】有趣好玩的音樂可視化系列小項目(08)---四位32段點陣屏 項目之三:紅綠色32段級聯頻譜點陣屏燈(FFT算法) 接腳連線:MAX9814 接A0 MAX7219 UNO VCC →→→→→ 5V GND →→→→→ GND DIN →→→→→ D11(數據,數據接收引腳) CS →→→→→ D10(負載,命令接收引腳) CLK →→→→→ D13(時鍾,時鍾引腳) */ #include <arduinoFFT.h> #include <MD_MAX72xx.h> #include <SPI.h> MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 1); arduinoFFT FFT = arduinoFFT(); double realComponent[64]; double imagComponent[64]; int spectralHeight[] = {0b00000000, 0b10000000, 0b11000000, 0b11100000, 0b11110000, 0b11111000, 0b11111100, 0b11111110, 0b11111111 }; int index, c, value; void setup() { disp.begin(); Serial.begin(9600); } void loop() { int sensitivity = map(analogRead(A0), 0, 1023, 50, 100); Serial.println (analogRead(A0)); for (int i = 0; i < 64; i++) { realComponent[i] = analogRead(A7) / sensitivity; imagComponent[i] = 0; } FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD); FFT.ComplexToMagnitude(realComponent, imagComponent, 64); for (int i = 0; i < 32; i++) { realComponent[i] = constrain(realComponent[i], 0, 80); realComponent[i] = map(realComponent[i], 0, 80, 0, 8); index = realComponent[i]; value = spectralHeight[index]; c = 31 - i; disp.setColumn(c, value); } }
實驗場景動態圖
https://img.mydigit.cn/forum/202111/22/142941orny1mpjp1ktcdtr.gif
實驗視頻剪輯
https://v.youku.com/v_show/id_XNTgyMTc1NTk2OA==.html?spm=a2hcb.playlsit.page.1