ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ: ΜΙΚΡΟΕΛΕΓΚΤΕΣ Ι. Έλληνας Δεκέμβριος 2018
Άσκηση 1 Να συνδεθεί ο Arduino Uno με το LED matrix 8X8 μέσω SPI. Να γραφτεί πρόγραμμα το οποίο θα δημιουργεί μετρητή από 0 έως 9. MOSI (pin 11) pin 3 of MAX 7219 SCLK (pin 13) pin 5 of MAX 7219 SS (pin 10) pin 4 of MAX 7219 #include <Arduino.h> #include <SPI.h> #define SS_PIN 10 // MAX7219 registers #define MAX7219_NOOP #define MAX7219_DIGIT0 #define MAX7219_DIGIT1 #define MAX7219_DIGIT2 #define MAX7219_DIGIT3 #define MAX7219_DIGIT4 #define MAX7219_DIGIT5 #define MAX7219_DIGIT6 #define MAX7219_DIGIT7 #define MAX7219_DECODEMODE #define MAX7219_INTENSITY #define MAX7219_SCANLIMIT #define MAX7219_SHUTDOWN #define MAX7219_TEST 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA 0xB 0xC 0xF 2
char letter; String text = "0123456789"; const byte cp437_font [][8] PROGMEM = { { 0x3E, 0x7F, 0x71, 0x59, 0x4D, 0x7F, 0x3E, 0x00, // '0' { 0x40, 0x42, 0x7F, 0x7F, 0x40, 0x40, 0x00, 0x00, // '1' { 0x62, 0x73, 0x59, 0x49, 0x6F, 0x66, 0x00, 0x00, // '2' { 0x22, 0x63, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00, // '3' { 0x18, 0x1C, 0x16, 0x53, 0x7F, 0x7F, 0x50, 0x00, // '4' { 0x27, 0x67, 0x45, 0x45, 0x7D, 0x39, 0x00, 0x00, // '5' { 0x3C, 0x7E, 0x4B, 0x49, 0x79, 0x30, 0x00, 0x00, // '6' { 0x03, 0x03, 0x71, 0x79, 0x0F, 0x07, 0x00, 0x00, // '7' { 0x36, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00, // '8' { 0x06, 0x4F, 0x49, 0x69, 0x3F, 0x1E, 0x00, 0x00, // '9' ; void sendspi( byte address, byte value) { digitalwrite(ss_pin, LOW); // Start transfer SPI.transfer(address); // Send address SPI.transfer(value); // Send value digitalwrite(ss_pin, HIGH); // Finish transfer. Serial.begin(9600); pinmode(ss_pin, OUTPUT); digitalwrite(ss_pin, HIGH); SPI.beginTransaction(SPISettings(16000000, MSBFIRST, SPI_MODE0)); SPI.begin(); sendspi(max7219_test, 0x00); // Finish test sendspi(max7219_decodemode, 0x00); // Disable BCD mode sendspi(max7219_intensity, 0x00); // Lowest intensity sendspi(max7219_scanlimit, 0x07); // Scan all digits sendspi(max7219_shutdown, 0x01); // Turn on chip Serial.println("Start of MAX7219 operation"); void loop() { for (int i=0;i<text.length();i++){ letter=text.charat(i)-0x30; for (int col = 0; col < 8; col++) { byte b=pgm_read_byte(&cp437_font[letter] [col]); sendspi(col+1, b); delay(2000); Σημείωση: letter=text.charat(i) 0x30; Το ( 0x30) έχει τοποθετηθεί επειδή οι αριθμητικοί χαρακτήρες έχουν μετατοπιστεί στην αρχή του πίνακα ASCII (αντί δηλαδή να έχουν τιμές από 0x30 έως 0x39, έχουν τιμές από 0x00 έως 0x09). 3
Να συμπληρωθεί το πρόγραμμα έτσι ώστε να δείχνει στην οθόνη τους δεκαεξαδικούς αριθμούς 0 έως F. Άσκηση 2 Να συνδεθεί ο Arduino Uno με την 0.96 OLED οθόνη 128Χ64 pixels (SSD1306) χρησιμοποιώντας I2C. VCC + 5V SCL A5 Arduino I2C SCL SDA A4 Arduino I2C SDA RES RESET Arduino DC Ground (Address = 0x3C) Χρησιμοποιούνται οι βιβλιοθήκες Adafruit SSD1306 και Adafruit GFX (για γραφικά). Ενεργοποίηση του module #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin (or -1 if Arduino reset pin) Adafruit_SSD1306 display(screen_width, SCREEN_HEIGHT, &Wire, OLED_RESET); display.begin(ssd1306_switchcapvcc, 0x3C); //device address=0x3c display.display(); //show memory to display void loop() { Ένδειξη κειμένου #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin (or -1 if Arduino reset pin) Adafruit_SSD1306 display(screen_width, SCREEN_HEIGHT, &Wire, OLED_RESET); display.begin(ssd1306_switchcapvcc, 0x3C); //device address=0x3c display.cleardisplay(); display.settextcolor(white); display.setcursor(35,30); display.println("hello World!"); display.display(); //show memory to display void loop() { 4
Αλλάξτε τις συντεταγμένες αρχής του κειμένου Χρησιμοποιήστε την εντολή: display.settextcolor(black, WHITE); Χρησιμοποιήστε την εντολή μεγέθυνσης: display.settextsize() με τιμές από 1 έως 6. Χρησιμοποιείστε την εντολή: display.write(character ASCII code) και γράψτε το Hello World! Ένδειξη γεωμετρικών σχημάτων display.drawline(startx, starty, endx, endy, color) display.width() display.height() Σχεδίαση διαγώνιων γραμμών: display.drawline(0,0,display.width()-1, display.height()-1, WHITE); display.drawline(display.width()-1,0,0, display.height()-1, WHITE); Σχεδίαση τετραγώνου: display.drawrect(upperleftx, upperlefty, width, height, color) display.fillrect(upperleftx, upperlefty, width, height, WHITE) display.drawroundrect(upperleftx, upperlefty, width, height, cornerradius, color) display.drawfillroundrect(upperleftx, upperlefty, width, height, cornerradius, WHITE) display.drawcircle(centerx, centery, radius, color) Σχεδίαση τριγώνου: display.drawtriangle(poin1x, point1y, point2x, point2y, point3x, point3y, color) display.filltriangle(poin1x, point1y, point2x, point2y, point3x, point3y, WHITE) Σημείο: display.drawpixel(pixelx, pixely, color) 5
Ένδειξη εικόνων #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(screen_width, SCREEN_HEIGHT, &Wire, OLED_RESET); static const unsigned char PROGMEM logo_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 ; display.begin(ssd1306_switchcapvcc, 0x3C); //device address=0x3c display.cleardisplay(); display.drawbitmap(32,16,logo_bmp, 16, 16, WHITE); display.display(); //show memory to display void loop() { // loop can be empty for now Για να δείτε όλες τις δυνατότητες της βιβλιοθήκης επιλέξτε από τα παραδείγματα της βιβλιοθήκης Adafruit, το ssd1306_128x64_i2c.ino. Παρατηρήστε πως απεικονίζονται οι χαρακτήρες και εικόνες bitmap. Πρέπει στο πρόγραμμα να θέσουμε: #define OLED_RESET 1 και if (!display.begin(ssd1306_switchcapvcc, 0x3C)) 6