diff --git a/.gitignore b/.gitignore index b68e17f..14484fa 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ uart.h /.idea/.gitignore /.idea/vcs.xml /.idea/modules.xml +/CMakeLists.txt diff --git a/Lcd_print.cpp b/Lcd_print.cpp deleted file mode 100644 index 6379e6f..0000000 --- a/Lcd_print.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lcdpcf8574.h" -#include "pcf8574.h" -#include "i2cmaster.h" -#include "lcd.h" -#include - -struct DisplayData { - char topLine[64]; - int value1; - int value2; - int value3; -}; - -struct TextCounter { - unsigned long startTime; - int incrementValue; -}; - -TextCounter textCounter; - -void Lcd_inciliation() { - lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея - lcd_home(); // домой курсор - lcd_led(0); // вкл подсветки - textCounter.startTime = millis(); // Запоминаем время запуска программы -} - -void fillBuffer1(const char * source, char * buffer, size_t bufferSize, int incrementValue) { - int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue - int endIndex = startIndex + 16; - - if (endIndex > strlen(source)) { - // Если endIndex превышает длину строки source, переносим его на начало строки - endIndex = endIndex - strlen(source); - - // Копируем символы с конца строки source - strncpy(buffer, source + startIndex, strlen(source) - startIndex); - - // Копируем оставшиеся символы с начала строки source - strncat(buffer, source, endIndex); - } else { - strncpy(buffer, source + startIndex, endIndex - startIndex); - } - buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера -} - -void fillBuffer2(int value1, int value2, int value3, char * buffer, size_t bufferSize) { - snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); -} - -int convertR(char h, char t, char o) -{ - return ((h - '0') * 100 + (t - '0') * 10 + (o - '0') * 1); - -} - - -void first_nine(struct DisplayData arr) { - size_t len = strlen(arr.topLine); - memmove(arr, arr.topLine + 9, len - 8 ); -} - -void printLcd(const char * inputText) -{ - unsigned long currentTime = millis(); // Текущее время - // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue - if (currentTime - textCounter.startTime >= 500) { - textCounter.incrementValue++; // Увеличиваем incrementValue на 1 - textCounter.startTime = currentTime; // Обновляем время - } - - struct DisplayData displayData; - strncpy(displayData.topLine, inputText, sizeof(displayData.topLine) - 1); - displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; - displayData.value1 = convertR(displayData.topLine[0], displayData.topLine[1], displayData.topLine[2]); - displayData.value2 = convertR(displayData.topLine[3], displayData.topLine[4], displayData.topLine[5]); - displayData.value3 = convertR(displayData.topLine[6], displayData.topLine[7], displayData.topLine[8]); - - first_nine(displayData); - - // Буферы для заполнения данных - char buffer1[17]; - char buffer2[17]; - - // Заполнение буфера 1 - fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); - - // Заполнение буфера 2 - fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); - - // Создание массива для вывода на дисплей - char displayArray[32]; - strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray - strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 - - // Вывод данных на экран - lcd_gotoxy(0, 0); - lcd_puts(displayArray); - - lcd_gotoxy(0, 1); - lcd_puts(displayArray + 16); // Вывод второй половины displayArray -} - diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp b/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp deleted file mode 100644 index 08a41f7..0000000 --- a/LiquidCrystal_I2C/LiquidCrystal_I2C.cpp +++ /dev/null @@ -1,315 +0,0 @@ -// Based on the work by DFRobot - -#include "LiquidCrystal_I2C.h" -#include -#if defined(ARDUINO) && ARDUINO >= 100 - -#include "Arduino.h" - -#define printIIC(args) Wire.write(args) -inline size_t LiquidCrystal_I2C::write(uint8_t value) { - send(value, Rs); - return 1; -} - -#else -#include "WProgram.h" - -#define printIIC(args) Wire.send(args) -inline void LiquidCrystal_I2C::write(uint8_t value) { - send(value, Rs); -} - -#endif -#include "Wire.h" - - - -// When the display powers up, it is configured as follows: -// -// 1. Display clear -// 2. Function set: -// DL = 1; 8-bit interface data -// N = 0; 1-line display -// F = 0; 5x8 dot character font -// 3. Display on/off control: -// D = 0; Display off -// C = 0; Cursor off -// B = 0; Blinking off -// 4. Entry mode set: -// I/D = 1; Increment by 1 -// S = 0; No shift -// -// Note, however, that resetting the Arduino doesn't reset the LCD, so we -// can't assume that its in that state when a sketch starts (and the -// LiquidCrystal constructor is called). - -LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows) -{ - _Addr = lcd_Addr; - _cols = lcd_cols; - _rows = lcd_rows; - _backlightval = LCD_NOBACKLIGHT; -} - -void LiquidCrystal_I2C::init(){ - init_priv(); -} - -void LiquidCrystal_I2C::init_priv() -{ - Wire.begin(); - _displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS; - begin(_cols, _rows); -} - -void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) { - if (lines > 1) { - _displayfunction |= LCD_2LINE; - } - _numlines = lines; - - // for some 1 line displays you can select a 10 pixel high font - if ((dotsize != 0) && (lines == 1)) { - _displayfunction |= LCD_5x10DOTS; - } - - // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION! - // according to datasheet, we need at least 40ms after power rises above 2.7V - // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50 - delay(50); - - // Now we pull both RS and R/W low to begin commands - expanderWrite(_backlightval); // reset expanderand turn backlight off (Bit 8 =1) - delay(1000); - - //put the LCD into 4 bit mode - // this is according to the hitachi HD44780 datasheet - // figure 24, pg 46 - - // we start in 8bit mode, try to set 4 bit mode - write4bits(0x03 << 4); - delayMicroseconds(4500); // wait min 4.1ms - - // second try - write4bits(0x03 << 4); - delayMicroseconds(4500); // wait min 4.1ms - - // third go! - write4bits(0x03 << 4); - delayMicroseconds(150); - - // finally, set to 4-bit interface - write4bits(0x02 << 4); - - - // set # lines, font size, etc. - command(LCD_FUNCTIONSET | _displayfunction); - - // turn the display on with no cursor or blinking default - _displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF; - display(); - - // clear it off - clear(); - - // Initialize to default text direction (for roman languages) - _displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT; - - // set the entry mode - command(LCD_ENTRYMODESET | _displaymode); - - home(); - -} - -/********** high level commands, for the user! */ -void LiquidCrystal_I2C::clear(){ - command(LCD_CLEARDISPLAY);// clear display, set cursor position to zero - delayMicroseconds(2000); // this command takes a long time! -} - -void LiquidCrystal_I2C::home(){ - command(LCD_RETURNHOME); // set cursor position to zero - delayMicroseconds(2000); // this command takes a long time! -} - -void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){ - int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; - if ( row > _numlines ) { - row = _numlines-1; // we count rows starting w/0 - } - command(LCD_SETDDRAMADDR | (col + row_offsets[row])); -} - -// Turn the display on/off (quickly) -void LiquidCrystal_I2C::noDisplay() { - _displaycontrol &= ~LCD_DISPLAYON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} -void LiquidCrystal_I2C::display() { - _displaycontrol |= LCD_DISPLAYON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} - -// Turns the underline cursor on/off -void LiquidCrystal_I2C::noCursor() { - _displaycontrol &= ~LCD_CURSORON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} -void LiquidCrystal_I2C::cursor() { - _displaycontrol |= LCD_CURSORON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} - -// Turn on and off the blinking cursor -void LiquidCrystal_I2C::noBlink() { - _displaycontrol &= ~LCD_BLINKON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} -void LiquidCrystal_I2C::blink() { - _displaycontrol |= LCD_BLINKON; - command(LCD_DISPLAYCONTROL | _displaycontrol); -} - -// These commands scroll the display without changing the RAM -void LiquidCrystal_I2C::scrollDisplayLeft(void) { - command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT); -} -void LiquidCrystal_I2C::scrollDisplayRight(void) { - command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT); -} - -// This is for text that flows Left to Right -void LiquidCrystal_I2C::leftToRight(void) { - _displaymode |= LCD_ENTRYLEFT; - command(LCD_ENTRYMODESET | _displaymode); -} - -// This is for text that flows Right to Left -void LiquidCrystal_I2C::rightToLeft(void) { - _displaymode &= ~LCD_ENTRYLEFT; - command(LCD_ENTRYMODESET | _displaymode); -} - -// This will 'right justify' text from the cursor -void LiquidCrystal_I2C::autoscroll(void) { - _displaymode |= LCD_ENTRYSHIFTINCREMENT; - command(LCD_ENTRYMODESET | _displaymode); -} - -// This will 'left justify' text from the cursor -void LiquidCrystal_I2C::noAutoscroll(void) { - _displaymode &= ~LCD_ENTRYSHIFTINCREMENT; - command(LCD_ENTRYMODESET | _displaymode); -} - -// Allows us to fill the first 8 CGRAM locations -// with custom characters -void LiquidCrystal_I2C::createChar(uint8_t location, uint8_t charmap[]) { - location &= 0x7; // we only have 8 locations 0-7 - command(LCD_SETCGRAMADDR | (location << 3)); - for (int i=0; i<8; i++) { - write(charmap[i]); - } -} - -// Turn the (optional) backlight off/on -void LiquidCrystal_I2C::noBacklight(void) { - _backlightval=LCD_NOBACKLIGHT; - expanderWrite(0); -} - -void LiquidCrystal_I2C::backlight(void) { - _backlightval=LCD_BACKLIGHT; - expanderWrite(0); -} - - - -/*********** mid level commands, for sending data/cmds */ - -inline void LiquidCrystal_I2C::command(uint8_t value) { - send(value, 0); -} - - -/************ low level data pushing commands **********/ - -// write either command or data -void LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) { - uint8_t highnib=value&0xf0; - uint8_t lownib=(value<<4)&0xf0; - write4bits((highnib)|mode); - write4bits((lownib)|mode); -} - -void LiquidCrystal_I2C::write4bits(uint8_t value) { - expanderWrite(value); - pulseEnable(value); -} - -void LiquidCrystal_I2C::expanderWrite(uint8_t _data){ - Wire.beginTransmission(_Addr); - printIIC((int)(_data) | _backlightval); - Wire.endTransmission(); -} - -void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ - expanderWrite(_data | En); // En high - delayMicroseconds(1); // enable pulse must be >450ns - - expanderWrite(_data & ~En); // En low - delayMicroseconds(50); // commands need > 37us to settle -} - - -// Alias functions - -void LiquidCrystal_I2C::cursor_on(){ - cursor(); -} - -void LiquidCrystal_I2C::cursor_off(){ - noCursor(); -} - -void LiquidCrystal_I2C::blink_on(){ - blink(); -} - -void LiquidCrystal_I2C::blink_off(){ - noBlink(); -} - -void LiquidCrystal_I2C::load_custom_character(uint8_t char_num, uint8_t *rows){ - createChar(char_num, rows); -} - -void LiquidCrystal_I2C::setBacklight(uint8_t new_val){ - if(new_val){ - backlight(); // turn backlight on - }else{ - noBacklight(); // turn backlight off - } -} - -void LiquidCrystal_I2C::printstr(const char c[]){ - //This function is not identical to the function used for "real" I2C displays - //it's here so the user sketch doesn't have to be changed - print(c); -} - - -// unsupported API functions -void LiquidCrystal_I2C::off(){} -void LiquidCrystal_I2C::on(){} -void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {} -uint8_t LiquidCrystal_I2C::status(){return 0;} -uint8_t LiquidCrystal_I2C::keypad (){return 0;} -uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;} -void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){} -void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){} -void LiquidCrystal_I2C::setContrast(uint8_t new_val){} - - diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.h b/LiquidCrystal_I2C/LiquidCrystal_I2C.h deleted file mode 100644 index faf19fb..0000000 --- a/LiquidCrystal_I2C/LiquidCrystal_I2C.h +++ /dev/null @@ -1,126 +0,0 @@ -//YWROBOT -#ifndef LiquidCrystal_I2C_h -#define LiquidCrystal_I2C_h - -#include -#include "Print.h" -#include - -// commands -#define LCD_CLEARDISPLAY 0x01 -#define LCD_RETURNHOME 0x02 -#define LCD_ENTRYMODESET 0x04 -#define LCD_DISPLAYCONTROL 0x08 -#define LCD_CURSORSHIFT 0x10 -#define LCD_FUNCTIONSET 0x20 -#define LCD_SETCGRAMADDR 0x40 -#define LCD_SETDDRAMADDR 0x80 - -// flags for display entry mode -#define LCD_ENTRYRIGHT 0x00 -#define LCD_ENTRYLEFT 0x02 -#define LCD_ENTRYSHIFTINCREMENT 0x01 -#define LCD_ENTRYSHIFTDECREMENT 0x00 - -// flags for display on/off control -#define LCD_DISPLAYON 0x04 -#define LCD_DISPLAYOFF 0x00 -#define LCD_CURSORON 0x02 -#define LCD_CURSOROFF 0x00 -#define LCD_BLINKON 0x01 -#define LCD_BLINKOFF 0x00 - -// flags for display/cursor shift -#define LCD_DISPLAYMOVE 0x08 -#define LCD_CURSORMOVE 0x00 -#define LCD_MOVERIGHT 0x04 -#define LCD_MOVELEFT 0x00 - -// flags for function set -#define LCD_8BITMODE 0x10 -#define LCD_4BITMODE 0x00 -#define LCD_2LINE 0x08 -#define LCD_1LINE 0x00 -#define LCD_5x10DOTS 0x04 -#define LCD_5x8DOTS 0x00 - -// flags for backlight control -#define LCD_BACKLIGHT 0x08 -#define LCD_NOBACKLIGHT 0x00 - -#define En B00000100 // Enable bit -#define Rw B00000010 // Read/Write bit -#define Rs B00000001 // Register select bit - -class LiquidCrystal_I2C : public Print { -public: - LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows); - void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS ); - void clear(); - void home(); - void noDisplay(); - void display(); - void noBlink(); - void blink(); - void noCursor(); - void cursor(); - void scrollDisplayLeft(); - void scrollDisplayRight(); - void printLeft(); - void printRight(); - void leftToRight(); - void rightToLeft(); - void shiftIncrement(); - void shiftDecrement(); - void noBacklight(); - void backlight(); - void autoscroll(); - void noAutoscroll(); - void createChar(uint8_t, uint8_t[]); - void setCursor(uint8_t, uint8_t); -#if defined(ARDUINO) && ARDUINO >= 100 - virtual size_t write(uint8_t); -#else - virtual void write(uint8_t); -#endif - void command(uint8_t); - void init(); - -////compatibility API function aliases -void blink_on(); // alias for blink() -void blink_off(); // alias for noBlink() -void cursor_on(); // alias for cursor() -void cursor_off(); // alias for noCursor() -void setBacklight(uint8_t new_val); // alias for backlight() and nobacklight() -void load_custom_character(uint8_t char_num, uint8_t *rows); // alias for createChar() -void printstr(const char[]); - -////Unsupported API functions (not implemented in this library) -uint8_t status(); -void setContrast(uint8_t new_val); -uint8_t keypad(); -void setDelay(int,int); -void on(); -void off(); -uint8_t init_bargraph(uint8_t graphtype); -void draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); -void draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end); - - -private: - void init_priv(); - void send(uint8_t, uint8_t); - void write4bits(uint8_t); - void expanderWrite(uint8_t); - void pulseEnable(uint8_t); - uint8_t _Addr; - uint8_t _displayfunction; - uint8_t _displaycontrol; - uint8_t _displaymode; - uint8_t _numlines; - uint8_t _cols; - uint8_t _rows; - uint8_t _backlightval; -}; - -#endif diff --git a/LiquidCrystal_I2C/LiquidCrystal_I2C.o b/LiquidCrystal_I2C/LiquidCrystal_I2C.o deleted file mode 100644 index bca78e0..0000000 Binary files a/LiquidCrystal_I2C/LiquidCrystal_I2C.o and /dev/null differ diff --git a/LiquidCrystal_I2C/README.md b/LiquidCrystal_I2C/README.md deleted file mode 100644 index aee58d3..0000000 --- a/LiquidCrystal_I2C/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# LiquidCrystal_I2C -LiquidCrystal Arduino library for the DFRobot I2C LCD displays diff --git a/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde b/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde deleted file mode 100644 index 492612d..0000000 --- a/LiquidCrystal_I2C/examples/CustomChars/CustomChars.pde +++ /dev/null @@ -1,70 +0,0 @@ -//YWROBOT -//Compatible with the Arduino IDE 1.0 -//Library version:1.1 -#include -#include - -#if defined(ARDUINO) && ARDUINO >= 100 -#define printByte(args) write(args); -#else -#define printByte(args) print(args,BYTE); -#endif - -uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4}; -uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0}; -uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0}; -uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; -uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0}; -uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0}; -uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0}; -uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4}; - -LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display - -void setup() -{ - lcd.init(); // initialize the lcd - lcd.backlight(); - - lcd.createChar(0, bell); - lcd.createChar(1, note); - lcd.createChar(2, clock); - lcd.createChar(3, heart); - lcd.createChar(4, duck); - lcd.createChar(5, check); - lcd.createChar(6, cross); - lcd.createChar(7, retarrow); - lcd.home(); - - lcd.print("Hello world..."); - lcd.setCursor(0, 1); - lcd.print(" i "); - lcd.printByte(3); - lcd.print(" arduinos!"); - delay(5000); - displayKeyCodes(); - -} - -// display all keycodes -void displayKeyCodes(void) { - uint8_t i = 0; - while (1) { - lcd.clear(); - lcd.print("Codes 0x"); lcd.print(i, HEX); - lcd.print("-0x"); lcd.print(i+16, HEX); - lcd.setCursor(0, 1); - for (int j=0; j<16; j++) { - lcd.printByte(i+j); - } - i+=16; - - delay(4000); - } -} - -void loop() -{ - -} - diff --git a/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde b/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde deleted file mode 100644 index 6dfdee8..0000000 --- a/LiquidCrystal_I2C/examples/HelloWorld/HelloWorld.pde +++ /dev/null @@ -1,28 +0,0 @@ -//YWROBOT -//Compatible with the Arduino IDE 1.0 -//Library version:1.1 -#include -#include - -LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display - -void setup() -{ - lcd.init(); // initialize the lcd - lcd.init(); - // Print a message to the LCD. - lcd.backlight(); - lcd.setCursor(3,0); - lcd.print("Hello, world!"); - lcd.setCursor(2,1); - lcd.print("Ywrobot Arduino!"); - lcd.setCursor(0,2); - lcd.print("Arduino LCM IIC 2004"); - lcd.setCursor(2,3); - lcd.print("Power By Ec-yuan!"); -} - - -void loop() -{ -} diff --git a/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde b/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde deleted file mode 100644 index fdbbc64..0000000 --- a/LiquidCrystal_I2C/examples/SerialDisplay/SerialDisplay.pde +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Displays text sent over the serial port (e.g. from the Serial Monitor) on - * an attached LCD. - * YWROBOT - *Compatible with the Arduino IDE 1.0 - *Library version:1.1 - */ -#include -#include - -LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display - -void setup() -{ - lcd.init(); // initialize the lcd - lcd.backlight(); - Serial.begin(9600); -} - -void loop() -{ - // when characters arrive over the serial port... - if (Serial.available()) { - // wait a bit for the entire message to arrive - delay(100); - // clear the screen - lcd.clear(); - // read all the available characters - while (Serial.available() > 0) { - // display each character to the LCD - lcd.write(Serial.read()); - } - } -} diff --git a/LiquidCrystal_I2C/keywords.txt b/LiquidCrystal_I2C/keywords.txt deleted file mode 100644 index 8c450a9..0000000 --- a/LiquidCrystal_I2C/keywords.txt +++ /dev/null @@ -1,46 +0,0 @@ -########################################### -# Syntax Coloring Map For LiquidCrystal_I2C -########################################### - -########################################### -# Datatypes (KEYWORD1) -########################################### - -LiquidCrystal_I2C KEYWORD1 - -########################################### -# Methods and Functions (KEYWORD2) -########################################### -init KEYWORD2 -begin KEYWORD2 -clear KEYWORD2 -home KEYWORD2 -noDisplay KEYWORD2 -display KEYWORD2 -noBlink KEYWORD2 -blink KEYWORD2 -noCursor KEYWORD2 -cursor KEYWORD2 -scrollDisplayLeft KEYWORD2 -scrollDisplayRight KEYWORD2 -leftToRight KEYWORD2 -rightToLeft KEYWORD2 -shiftIncrement KEYWORD2 -shiftDecrement KEYWORD2 -noBacklight KEYWORD2 -backlight KEYWORD2 -autoscroll KEYWORD2 -noAutoscroll KEYWORD2 -createChar KEYWORD2 -setCursor KEYWORD2 -print KEYWORD2 -blink_on KEYWORD2 -blink_off KEYWORD2 -cursor_on KEYWORD2 -cursor_off KEYWORD2 -setBacklight KEYWORD2 -load_custom_character KEYWORD2 -printstr KEYWORD2 -########################################### -# Constants (LITERAL1) -########################################### diff --git a/LiquidCrystal_I2C/library.json b/LiquidCrystal_I2C/library.json deleted file mode 100644 index 5a23a39..0000000 --- a/LiquidCrystal_I2C/library.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "LiquidCrystal_I2C", - "keywords": "LCD, liquidcrystal, I2C", - "description": "A library for DFRobot I2C LCD displays", - "repository": - { - "type": "git", - "url": "https://github.com/marcoschwartz/LiquidCrystal_I2C.git" - }, - "frameworks": "arduino", - "platforms": - [ - "atmelavr" - ] -} \ No newline at end of file diff --git a/LiquidCrystal_I2C/library.properties b/LiquidCrystal_I2C/library.properties deleted file mode 100644 index e64a7f5..0000000 --- a/LiquidCrystal_I2C/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=LiquidCrystal I2C -version=1.1.2 -author=Frank de Brabander -maintainer=Marco Schwartz -sentence=A library for I2C LCD displays. -paragraph= The library allows to control I2C displays with functions extremely similar to LiquidCrystal library. THIS LIBRARY MIGHT NOT BE COMPATIBLE WITH EXISTING SKETCHES. -category=Display -url=https://github.com/marcoschwartz/LiquidCrystal_I2C -architectures=avr diff --git a/Lsd_print/Lsd_print.cpp b/Lsd_print/Lsd_print.cpp deleted file mode 100644 index 2a0afe3..0000000 --- a/Lsd_print/Lsd_print.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "lcdpcf8574.h" -#include "pcf8574.h" -#include "i2cmaster.h" -#include "lsd.h" -#include - -struct DisplayData { - char topLine[64]; - int value1; - int value2; - int value3; -}; - -struct TextCounter { - unsigned long startTime; - int incrementValue; -}; - -TextCounter textCounter; - -void Lsd_inciliation() { - lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея - lcd_home(); // домой курсор - lcd_led(0); // вкл подсветки - textCounter.startTime = millis(); // Запоминаем время запуска программы -} - -void fillBuffer1(const char * source, char * buffer, size_t bufferSize, int incrementValue) { - int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue - int endIndex = startIndex + 16; - - if (endIndex > strlen(source)) { - // Если endIndex превышает длину строки source, переносим его на начало строки - endIndex = endIndex - strlen(source); - - // Копируем символы с конца строки source - strncpy(buffer, source + startIndex, strlen(source) - startIndex); - - // Копируем оставшиеся символы с начала строки source - strncat(buffer, source, endIndex); - } else { - strncpy(buffer, source + startIndex, endIndex - startIndex); - } - buffer[endIndex - startIndex] = '\0'; // Установка нулевого символа в конце буфера -} - -void fillBuffer2(int value1, int value2, int value3, char * buffer, size_t bufferSize) { - snprintf(buffer, bufferSize, "%d.%d.%d", value1, value2, value3); -} - - -void printLsd(const char * inputText) -{ - unsigned long currentTime = millis(); // Текущее время - // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue - if (currentTime - textCounter.startTime >= 500) { - textCounter.incrementValue++; // Увеличиваем incrementValue на 1 - textCounter.startTime = currentTime; // Обновляем время - } - - DisplayData displayData; - strncpy(displayData.topLine, inputText, sizeof(displayData.topLine) - 1); - displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; - displayData.value1 = 500; - displayData.value2 = 800; - displayData.value3 = 855; - - // Буферы для заполнения данных - char buffer1[17]; - char buffer2[17]; - - // Заполнение буфера 1 - fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); - - // Заполнение буфера 2 - fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); - - // Создание массива для вывода на дисплей - char displayArray[32]; - strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray - strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 - - // Вывод данных на экран - lcd_gotoxy(0, 0); - lcd_puts(displayArray); - - lcd_gotoxy(0, 1); - lcd_puts(displayArray + 16); // Вывод второй половины displayArray -} - diff --git a/Lsd_print/lsd.h b/Lsd_print/lsd.h deleted file mode 100644 index 2b495ce..0000000 --- a/Lsd_print/lsd.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef Lsd_print_h -#define Lsd_print_h -#include - -void Lsd_inciliation(); -void printLsd(const char* inputText); - -#endif \ No newline at end of file diff --git a/Lсd_print/Lcd_print.cpp b/Lсd_print/Lcd_print.cpp new file mode 100644 index 0000000..3c59604 --- /dev/null +++ b/Lсd_print/Lcd_print.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +struct DisplayData { + char topLine[64]; + float value1; + float value2; + float value3; +}; + +struct TextCounter { + unsigned long startTime; + int incrementValue; +}; + +TextCounter textCounter; + +void Lcd_inciliation() { + lcd_init(LCD_DISP_ON_BLINK); // инициализация дисплея + lcd_home(); // домой курсор + lcd_led(0); // вкл подсветки + textCounter.startTime = millis(); // Запоминаем время запуска программы +} + +void fillBuffer1(const char* source, char* buffer, size_t bufferSize, int incrementValue) { + int startIndex = incrementValue % strlen(source); // Определяем начальный индекс на основе incrementValue + int endIndex = startIndex + 16; + + for (int i = 0; i < 16; ++i) { + buffer[i] = source[(startIndex + i) % strlen(source)]; + } + buffer[16] = '\0'; // Установка нулевого символа в конце буфера +} + +void fillBuffer2(float value1, float value2, float value3, char* buffer, size_t bufferSize) { + snprintf(buffer, bufferSize, "%.2f.%.2f.%.2f", value1, value2, value3); +} + +void printLcd(struct message* decode_message) { + unsigned long currentTime = millis(); // Текущее время + // Проверяем, прошло ли 500 мс с момента последнего увеличения incrementValue + if (currentTime - textCounter.startTime >= 500) { + textCounter.incrementValue++; // Увеличиваем incrementValue на 1 + textCounter.startTime = currentTime; // Обновляем время + } + + struct DisplayData displayData; + strncpy(displayData.topLine, decode_message->str, sizeof(displayData.topLine) - 1); + displayData.topLine[sizeof(displayData.topLine) - 1] = '\0'; + displayData.value1 = decode_message->numbers[0]; + displayData.value2 = decode_message->numbers[1]; + displayData.value3 = decode_message->numbers[2]; + + // Буферы для заполнения данных + char buffer1[17]; + char buffer2[17]; + + // Заполнение буфера 1 + fillBuffer1(displayData.topLine, buffer1, sizeof(buffer1), textCounter.incrementValue); + + // Заполнение буфера 2 + fillBuffer2(displayData.value1, displayData.value2, displayData.value3, buffer2, sizeof(buffer2)); + + // Создание массива для вывода на дисплей + char displayArray[32]; + strncpy(displayArray, buffer1, 16); // Копирование первых 16 символов из buffer1 в displayArray + strncpy(displayArray + 16, buffer2, 16); // Копирование первых 16 символов из buffer2 в displayArray, начиная с позиции 16 + + // Вывод данных на экран + lcd_gotoxy(0, 0); + lcd_puts(displayArray); + + lcd_gotoxy(0, 1); + lcd_puts(displayArray + 16); // Вывод второй половины displayArray +} + +void dder() { + Lcd_inciliation(); + + uint8_t encode_message[100]; + size_t len_encode_message = 0; + struct message message; + + + // Получаем данные из протокола + protocol_encode(message, encode_message, &len_encode_message); + + // Декодируем данные из протокола + struct message decode_message; + protocol_decode(encode_message, len_encode_message, &decode_message); + + // Выводим данные на экран + printLcd(&decode_message); +} \ No newline at end of file diff --git a/Lсd_print/lcd.h b/Lсd_print/lcd.h new file mode 100644 index 0000000..f798ae0 --- /dev/null +++ b/Lсd_print/lcd.h @@ -0,0 +1,8 @@ +#ifndef Lsd_print_h +#define Lsd_print_h +#include "protocol.h" + +void Lcd_inciliation(); +void printLcd(struct message* decode_message); + +#endif \ No newline at end of file diff --git a/MyLCD/MyLCD.h b/MyLCD/MyLCD.h index 2a167ba..f9d17f9 100644 --- a/MyLCD/MyLCD.h +++ b/MyLCD/MyLCD.h @@ -3,7 +3,7 @@ #define MYLCD_H_ -// +// ���������� ��� ���� #include #include #include diff --git a/hdlc/client.c b/hdlc/client.c index 8dc6933..b2b7318 100644 --- a/hdlc/client.c +++ b/hdlc/client.c @@ -2,14 +2,6 @@ #include "hdlc.h" #include "stdio.h" -#define ERR_INVALID_DATA_SIZE -1 -#define ERR_ALL_BUFFERS_FILL -2 -#define ERR_INVALID_PARAMS -3 -#define ERR_INVALID_STATE -4 -#define ERR_FRAME_TIME_OUT -5 -#define ERR_INVALID_SEQ_NUMBER_FRAME -6 -#define ERR_TIMEOUT_ANSWER -7 - #define SIZE_DATA_BUFFERS 64 int connecting_frame_timeout_bf; @@ -113,6 +105,8 @@ int hdlc_decode_recived_raw_data(struct Client* client, uint8_t* buffer, size_t } *len_recived_data = sizeof(recive)-2; + + client->state = SEND; break; case S_FRAME_NACK: client->state = DISCONNECTING; diff --git a/hdlc/client.h b/hdlc/client.h index 99573bb..8702fa1 100644 --- a/hdlc/client.h +++ b/hdlc/client.h @@ -5,13 +5,22 @@ #include #include "hdlc.h" +#define ERR_INVALID_DATA_SIZE -1 +#define ERR_ALL_BUFFERS_FILL -2 +#define ERR_INVALID_PARAMS -3 +#define ERR_INVALID_STATE -4 +#define ERR_FRAME_TIME_OUT -5 +#define ERR_INVALID_SEQ_NUMBER_FRAME -6 +#define ERR_TIMEOUT_ANSWER -7 + enum HDLCState { UNINITIALIZED_STATE = 0, // состояние до инцилизации IDLE_STATE, // Состояние ожидания начала READY_STATE, // Состояние принятия CONNECTING, // состояние соединения DISCONNECTING, // состояния отключения - RECIVING // состояние приема и отправки + RECIVING, // состояние приема и отправки + SEND, //данные отправлены }; struct Client{ diff --git a/lcd.h b/lcd.h deleted file mode 100644 index b66935b..0000000 --- a/lcd.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef Lcd_print_h -#define Lcd_print_h -#include - -void Lcd_inciliation(); -void printLcd(const char* inputText); - -#endif \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..9c9bf50 --- /dev/null +++ b/main.c @@ -0,0 +1,110 @@ +//#include "Lсd_print/lcd.h" +#include "hdlc/client.h" +#include "UART/uart.h" +#include "stdbool.h" +//#include "stdio.h" +#include "Lсd_print/lcd.h" +//#include "protocol.h" + +int main() { + struct Client hdlc; + bool flag_connection = false; + + Lcd_inciliation(); + UART_init(); + init_hdlc_client(&hdlc, 200); + +// while(true){ +// if (!flag_connection){ +// } +// } + + hdlc_connect(&hdlc); + uint8_t buffer[10]; + + hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer); + + UART_send(buffer, sizeof buffer); + + while(!flag_connection){ + uint8_t* buffer_recive[10]; + UART_receive(buffer_recive, sizeof buffer_recive); + + int err = hdlc_timeout_handler(&hdlc, 1); + if (err == ERR_FRAME_TIME_OUT){ + hdlc_get_raw_frame(&hdlc, buffer, sizeof buffer); + UART_send(buffer, sizeof buffer); + continue; + } + + err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive, sizeof buffer_recive, 0, 0); + if (err < 0){ + if (err == ERR_INVALID_SEQ_NUMBER_FRAME){ + uint8_t* buffer_rej[10]; + hdlc_get_raw_frame(&hdlc, buffer_rej, sizeof buffer_rej); + UART_send(buffer_rej, sizeof buffer_rej); + return err; + } + return err; + } + + if (hdlc.state == READY_STATE){ + flag_connection = true; + } + } + + struct message mess; + mess.numbers[0] = 1.23; + mess.numbers[1] = 22.1; + mess.numbers[2] = 100; + mess.len_numbers = 3; + mess.str = "word war in new world io ex"; + mess.len_str = sizeof mess.str; + + uint8_t data[64]; + size_t len_data; + protocol_encode(mess, data, &len_data); + + hdlc_send_data(&hdlc, data, len_data); + uint8_t buffer_data[72]; + hdlc_get_raw_frame(&hdlc, buffer_data, sizeof buffer_data); + + UART_send(buffer_data, sizeof buffer_data); + + bool flag_recive = false; + uint8_t data_recive[64]; + size_t len_data_recive; + while (!flag_recive){ + uint8_t* buffer_recive_data[72]; + UART_receive(buffer_recive_data, sizeof buffer_recive_data); + + int err = hdlc_timeout_handler(&hdlc, 1); + if (err == ERR_FRAME_TIME_OUT){ + hdlc_get_raw_frame(&hdlc, buffer_data, sizeof buffer_data); + UART_send(buffer_data, sizeof buffer_data); + continue; + } + + err = hdlc_decode_recived_raw_data(&hdlc, buffer_recive_data, sizeof buffer_recive_data, data_recive, &len_data_recive); + if (err < 0){ + if (err == ERR_INVALID_SEQ_NUMBER_FRAME){ + uint8_t* buffer_rej[10]; + hdlc_get_raw_frame(&hdlc, buffer_rej, sizeof buffer_rej); + UART_send(buffer_rej, sizeof buffer_rej); + return err; + } + return err; + } + + if (hdlc.state == SEND){ + flag_recive = true; + } + } + + struct message resp; + protocol_decode(data_recive, len_data_recive, &resp); + + printLcd(&resp); + + return 0; +} \ No newline at end of file diff --git a/main_sketch/main_sketch.ino b/main_sketch/main_sketch.ino deleted file mode 100644 index 9cdffa7..0000000 --- a/main_sketch/main_sketch.ino +++ /dev/null @@ -1,72 +0,0 @@ -#include "lcd.h" -#include "client.h" -#include "uart.h" -#include "stdbool.h" -#include "stdio.h" - -struct Client hdlc; -bool flag_connection = false; - -void setup() { - Lsd_inciliation(); - UART_init(); - init_hdlc_client(&hdlc, 200); -} - -void loop() { - if (!flag_connection){ - hdlc_connect(&hdlc); - uint8_t buffer; - hdlc_get_raw_frame(&hdlc, &buffer, sizeof(buffer)); - - UART_send(&buffer, sizeof(buffer)); - - bool flag_recive = true; - while(flag_recive){ - uint8_t buffer; - UART_receive(&buffer, sizeof(buffer)); - - int err = hdlc_timeout_handler(&hdlc, 1); - if (err != 0){ - return err; - } - - int ret = hdlc_decode_recived_raw_data(&hdlc, &fake_buffer, sizeof(fake_buffer), 0, 0); - - if (ret == -6){ - uint8_t buffer; - hdlc_get_raw_frame(&hdlc, &hdlc->frame_rej, &buffer, sizeof(buffer)); - UART_send(&buffer, sizeof(buffer)); - } - - if (ret == 0 && client->state == READY_STATE){ - flag_connection = true; - } - } - } else { - bool flag_recive = true; - while(flag_recive){ - uint8_t buffer; - UART_receive(&buffer, sizeof(buffer)); - - int err = hdlc_timeout_handler(&hdlc, 1); - if (err != 0){ - return err; - } - - uint8_t recived_data; - size_t len_recived_data; - - int ret = hdlc_decode_recived_raw_data(&hdlc, &fake_buffer, sizeof(fake_buffer), &recived_data, &len_recived_data); - - if (ret == -6){ - uint8_t buffer; - hdlc_get_raw_frame(&hdlc, &hdlc->frame_rej, &buffer, sizeof(buffer)); - UART_send(&buffer, sizeof(buffer)); - } - - printLsd(recived_data); - } - } - -} \ No newline at end of file diff --git a/protocol/protocol.h b/protocol/protocol.h index a69f0bf..c23f040 100644 --- a/protocol/protocol.h +++ b/protocol/protocol.h @@ -10,7 +10,7 @@ #define FLAG_WORD 1 struct message{ - float numbers[4]; + float numbers[3]; size_t len_numbers; char* str; size_t len_str;