مقدمه
در این جلسه قصد داریم راه اندازی ماژول OLED و واحد SPI با آردوینو رو آموزش بدیم ، SPI مخفف ( Serial Peripheral Interface ) و به معنی واسط برنامه ریزی سریال میباشد ، این ارتباط یک نوع ارتباط سنکرون میباشد و برای راه اندازی آن نیاز به پالس مشترک داریم ، ارتباط SPI یک ارتباط چهار سیمه میباشد و با چهار پایه زیر ارتباط SPI برقرار میشود .
1_SS : یا Slave Select به ما اجازه انتخاب Slave های مختلف را میدهد.
2_MISO : از این پایه برای ارسال داده فرمانگیر به فرمانده استفاده میشود.
3_MOSI : از این پایه برای ارسال داده از فرمانده به فرمانگیر استفاده میشود.
4_SCK : تامین پالس مشترک.
در ارتباط SPI نیز مانند I2C یک قطعه به عنوان فرمانده یا MASTER و قطعه دیگر که میتواند میکروکنترلر یا دیوایس باشد به عنوان فرمانگیر یا SLAVE میباشد .
نحوه اتصال چند دیوایس در ارتباط SPI
توابع کتابخانه SPI
برای ارتباط SPI از کتابخانه SPI.h استفاده میشود .
دستور ()begin : این دستور پایه های مربوط به SPI رو مقدار دهی میکند یعنی چهار پایه ایی که در بالا معرفی کردیم رو از جالت ورودی و خروجی خارج میکند و در مد SPI قرار میدهد.
نکته : پایه SS رو باید به عنوان خروجی تعریف کرد زیرا میخوام روی آن یا مقدار 1 منطقی یا 0 منمطقی قرار گیرد .
دستور()setBitOrder : دستور برای مشخص کردن ارسال LSB بیت کم ارزش یا MSB بیت پرارزش از این دستور استفاده میشود .
دستور ()setDataMode : از این دستور برای مشخص کردن لبه ی پایین رونده یا بالا روند از این دستور استفاده میشود .
;(setDataMode(MODEX
Mode Capture | Output Edge | Clock Phase (CPHA) | Clock Polaruty (CPOL) | Mode |
Rising | Faling | 0 | 0 | SPI_MODE0 |
Faling | Rising | 1 | 0 | SPI_MODE1 |
Faling | Rising | 0 | 1 | SPI_MODE2 |
Rising | Faling | 1 | 1 | SPI_MODE3 |
دستور()setClockDivider : برا مشخص کردن تقسیم فرکانسی .
;(setClockDivider(SPI_CLOCK_DIV4 : فرکانس کاری برد آردوینو 4MGHZ باشذ با این دستور فرکانس را تقسیم بر 4 میکند . خودمون هم به صورت دستی میتوانیم مقدار را مشخص کنیم .
دستور SPISettings : برای تنظیم کردن سه تا مد بالا از این دستور استفاده میشود .
Syntax
(SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0
دستور()end : برای تمام کردن ارتباط از این دستور استفاده میشود .
دستور ()transfer : از این دستور برای ارسال و دریافت داده استفاده میشود .
شکل اتصالات
نمونه کد ارتباط SPI
کد Master
#include <SPI.h> void setup() { Serial.begin(9600); digitalWrite(SS,HIGH); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV8); } void loop() { char c; digitalWrite(SS,LOW); for (const char * p = "Powerelec.ir\r";c = *p;p++) { SPI.transfer(c); Serial.print(c); } digitalWrite(SS,LOW); delay(1000); }
کد Slave
#include <SPI.h> char buff [50]; volatile byte B; volatile boolean A; void setup() { Serial.begin(9600); pinMode(MISO,OUTPUT); SPCR |= _BV(SPE); A = false; SPI.attachInterrupt(); } ISR (SPI_STC_vect) { byte c = SPDR; if (B < sizeof buff) { buff[B++]=c; if (c=='\r') A = true; } } void loop() { if (A) { A = false; Serial.println(buff); } }
پروژه نمایش دما روی Oled ssd1306 SPI
قطعات مورد نیاز
1_ Arduino
[promotion id=”2809″ ]
2_Oled ssd1306 SPI
3_ DHT11
کد پروژه
#include<SPI.h> #include "SSD1306Ascii.h" #include "SSD1306AsciiSoftSpi.h" #define CS_PIN 7 #define RST_PIN 8 #define DC_PIN 9 #define MOSI_PIN 11 #define CLK_PIN 13 #include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); SSD1306AsciiSoftSpi oled; void setup() { Serial.begin(9600); Serial.print("Powerelec.ir"); dht.begin(); oled.begin(&Adafruit128x64, CS_PIN, DC_PIN, CLK_PIN, MOSI_PIN, RST_PIN); oled.setFont(Callibri11_bold); } void loop() { float t = dht.readTemperature(); float h = dht.readHumidity(); oled.setCursor(0,0); oled.set2X(); oled.println("Temp:"); oled.setCursor(65,0); oled.set2X(); oled.println(t); oled.setCursor(120,0); oled.println("c"); oled.setCursor(0,4); oled.set2X(); oled.println("Hum:"); oled.setCursor(55,4); oled.set2X(); oled.println(h); oled.setCursor(110,4); oled.println("%"); }