Arduino string function

Оглавление

Функции и методы класса String

Для работы со строками в String предусмотрено множество полезных функций. Приведем краткое описание каждой из них:

  • String() – конструктор, создает элемент класса данных string. Возвращаемого значения нет. Есть множество вариантов, позволяющих создавать String из строк, символов, числе разных форматов.
  • charAt() возвращает указанный в строке элемент. Возвращаемое значение – n-ный символ строки.
  • compareTo() – функция нужна для проверки двух строк на равенство и позволяет выявить, какая из них идет раньше по алфавиту. Возвращаемые значения: отрицательное число, если строка 1 идет раньше строки 2 по алфавиту; 0 – при эквивалентности двух строк; положительное число, если вторая строка идет раньше первой в алфавитном порядке.
  • concat() – функция, которая объединяет две строки в одну. Итог сложения строк объединяется в новый объект String.
  • startsWith() – функция показывает, начинается ли строка с символа, указанного во второй строке. Возвращаемое значение: true, если строка начинается с символа из второй строки, в ином случае false.
  • endsWith() – работает так же, как и startsWith(), но проверяет уже окончание строки. Также возвращает значения true и false.
  • equals() – сравнивает две строки с учетом регистра, т.е. строки «start» и «START» не будут считаться эквивалентными. Возвращаемые значения: true при эквивалентности, false в ином случае.
  • equalsIgnoreCase() – похожа на equals, только эта функция не чувствительна к регистру символов.
  • getBytes() – позволяет скопировать символы указанной строки в буфер.
  • indexOf() –  выполняет поиск символа в строке с начала. Возвращает значение индекса подстроки val или -1, если подстрока не обнаружена.
  • lastIndexOf() –выполняет поиск символа в строке с конца.
  • length() – указывает длину строки в символах без учета завершающего нулевого символа.
  • replace() – заменяет в строке вхождения определенного символа на другой.
  • setCharAt() – изменяет нужный символ в строке.
  • substring() – возвращает подстроку. Может принимать два значения – начальный и конечный индексы. Первый является включительным, т.е. соответствующий ему элемент будет включаться в строку, второй – не является им.
  • toCharArray() – копирует элементы строки в буфер.
  • toLowerCase() – возвращает строку, которая записана в нижнем регистре.
  • toUpperCase() – возвращает записанную в верхнем регистре строку.
  • toInt() – позволяет преобразовать строку в число (целое). При наличии в строке не целочисленных значений функция прерывает преобразование.
  • trim() – отбрасывает ненужные пробелы в начале и в конце строки.

Array Bounds

When working with strings and arrays, it is very important to work within the bounds of strings or arrays. In the example sketch, an array was created, which was 40 characters long, in order to allocate the memory that could be used to manipulate strings.

If the array was made too small and we tried to copy a string that is bigger than the array to it, the string would be copied over the end of the array. The memory beyond the end of the array could contain other important data used in the sketch, which would then be overwritten by our string. If the memory beyond the end of the string is overrun, it could crash the sketch or cause unexpected behavior.

Previous Page
Print Page

Next Page  

Синтаксис

Ниже приведены варианты объявления и присвоения строк:

1 char Str115]; // Объявление массива символов без присваивания значений
2 char Str28 = {'a', 'r', 'd', 'u', 'i', 'n', 'o'}; //  Объявление массива символов и присвоение значений всем элементам, кроме последнего, компилятор Arduino автоматически добавит символ конца строки
3 char Str38 = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'}; // Явно объявлен завершающий символ
4 char Str4  = "arduino"; // Инициализирование массива строковой константой в двойных кавычках. Компилятор автоматически задаст требуемый размер на массив, равный количеству символов плюс завершающий символ
5 char Str58 = "arduino"; // Инициализирование массива с явным заданием размера и присвоением строковой константы
6 char Str615 = "arduino"; // Инициализирование массива с явным заданием дополнительного размера (с запасом), фактически превышающего размер строковой константы при начальном присвоении

Русификация LCD 1602 I2C дисплея

Перед загрузкой следующего скетча, необходимо установить библиотеку LCD_1602_RUS.h для русификации дисплея 1602 Ардуино. Архив с библиотекой можно скачать на нашем сайте на странице — Библиотеки для Ардуино. После установки библиотеки из архива загрузите в микроконтроллер небольшой пример с кодом для LCD, который значительно упростит для вас вывод кириллицы на дисплей.

Скетч с библиотекой LCD_1602_RUS.h

#include <Wire.h> // библиотека для управления устройствами по I2C 
#include <LCD_1602_RUS.h> // подключаем библиотеку LCD_1602_RUS

LCD_1602_RUS LCD(0x27,16,2); // присваиваем имя LCD для дисплея

void setup() {
   LCD.init(); // инициализация LCD дисплея
   LCD.backlight(); // включение подсветки дисплея
   
   LCD.setCursor(2,0); // ставим курсор на 3 символ первой строки
   LCD.print("РУСИФИКАЦИЯ!"); // печатаем символ на первой строке
}

void loop() {
 
}

Arduino String Serial Command Control

Now lets look at the section that you will write after the comment:

The easiest way to do it is to examine the 1st character and use that
in a switch statement. To access a character at a specific position se
the charAt member function of String.

Here’s the switch statement that decodes each command

Notice how a Serial.println is used to send information back to
the user. This is not really necessary but allows you to see that a
command has been actioned — making the program easier to use. The variables start and test are defined earlier in the program.

The above code gives you simple control of variables within a microcontroller.

Решение

Общий тип литья
В C ++ существуют различные типы приведений, которые можно использовать для преобразования между типами. Они важны, потому что C ++ является строго типизированным языком, и компилятор не обязательно знает, что любое данное преобразование между типами является безопасным или разумным. По умолчанию он выдаст ошибку или предупреждение, если вы явно не укажете ему, что делать.

Все приведения C ++ имеют следующий формат:

может быть одним из следующих: , , , или же ,

Переинтерпретация приведение используется, когда вы хотите заставить компилятор конвертировать между не связанными типами указателей. Результатом является указатель на точно такой же фрагмент данных в памяти. Тем не менее, он будет обрабатываться (или интерпретироваться), как если бы это был другой тип, который может позволить некоторые интересные операции.

Например, допустим, у вас есть указатель на 4-байтовое целое число без знака, и вы хотите получить доступ к каждому байту отдельно. Вы можете сделать это, переосмыслив указатель на 1-байтовый тип, например так:

указатели а также оба указывают на данные, хранящиеся в переменная. Разница в том, что доступ к нему через приведет к тому, что компилятор будет рассматривать его как 1-байтовое целое число без знака (вместо исходного 4-байтового типа). Это позволяет извлекать / манипулировать отдельными байтами в разных местах в исходной переменной.

Для простого примера, как это, вполне безопасно

Тем не менее, есть много ситуаций, когда он может пойти очень плохо или просто ничего не делать, если его не использовать осторожно. Примером будет попытка переосмыслить указатель как , Само по себе это не сделает ничего плохого

Результат будет совершенно бесполезным, потому что лежащее в основе двоичное представление не имеет смысла, если вы пытаетесь справиться с этим как ,

Тот же подход может работать для объектов, позволяя вам интерпретировать экземпляр одного класса, как если бы он был экземпляром другого. Однако, это не делает никакого интеллектуального преобразования. Это просто заставляет необработанные двоичные данные обрабатываться по-другому, а это означает, что вы должны быть очень уверены, что реинтерпретация имеет смысл.

Arduino
Строка, которую вы определили в файле Arduino, довольно сложна, когда она полностью развернута, поэтому мы немного разберем ее. Как вы думаете, вы определили макрос и этот макрос принимает параметр с именем ,

Как следует из названия, он предназначен для использования со строковым литералом, , Под поверхностью компилятор обрабатывает строковый литерал как указатель на массив символов; или другими словами, ,

Внутри макрос, строковый литерал помещается в другой макрос, называемый , Это, в основном, добавляет целый ряд других вещей, которые говорят компилятору хранить строковые данные в программном пространстве (где эскиз находится на вашем Arduino), а не в SRAM (где живут переменные).

На данный момент, вступает в игру

Все вещи в это важно, но это не влияет на тип данных, который видят актеры. Вы можете себе представить, что он действует примерно так:

является классом, что означает, что его тип не связан с , Вот почему мы должны переосмыслить это, чтобы компилятор знал, что мы берем на себя ответственность за безопасность работы. Когда используется результат приведения, он будет действовать как указатель на объект, то есть его методы могут использоваться для доступа / обработки строковых данных.

На самом деле, ни одного случая на самом деле создан. Базовые данные — все еще только наш строковый литерал. Это один из интересных аспектов C ++ — вы можете на самом деле вызывать методы объекта, который не существует, если объект не пытается получить доступ к несуществующим данным-членам.

8

Когда использовать строковый объект или массив строковых символов

Объект String намного проще в использовании, чем массив строковых символов. Объект имеет встроенные функции, которые могут выполнять ряд операций со строками, которые полностью задокументированы в справочном разделе на веб-сайте Arduino.

Основным недостатком использования объекта String является то, что он использует много памяти и может быстро использовать оперативную память Arduino, что может привести к зависанию, сбою или неожиданному поведению Arduino. Это особенно верно для небольших плат, таких как Arduino Uno.

Если скетч на Arduino небольшой и ограничивает использование объектов, то проблем возникнуть не должно.

Строки символьных массивов сложнее использовать, и вам может потребоваться написать свои собственные функции для работы с этими типами строк. Преимущество состоит в том, что у вас есть контроль над размером создаваемых массивов строк, поэтому вы можете сохранять массивы небольшими для экономии памяти.

Вам нужно убедиться, что вы не пишете через конец границ массива строковыми массивами. У объекта String нет этой проблемы, и он позаботится о границах строки за вас при условии, что у него достаточно памяти. Объект String может попытаться выполнить запись в несуществующую память, когда ему не хватает памяти, но никогда не будет записывать поверх конца строки, с которой он работает.

String Character Arrays

The first type of string that we will learn is the string that is a series of characters of the type char. In the previous chapter, we learned what an array is; a consecutive series of the same type of variable stored in memory. A string is an array of char variables.

A string is a special array that has one extra element at the end of the string, which always has the value of 0 (zero). This is known as a «null terminated string».

String Character Array Example

This example will show how to make a string and print it to the serial monitor window.

Example

void setup() {
   char my_str; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str = 'H'; // the string consists of 5 characters
   my_str = 'e';
   my_str = 'l';
   my_str = 'l';
   my_str = 'o';
   my_str = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

The following example shows what a string is made up of; a character array with printable characters and 0 as the last element of the array to show that this is where the string ends. The string can be printed out to the Arduino IDE Serial Monitor window by using Serial.println() and passing the name of the string.

This same example can be written in a more convenient way as shown below −

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

In this sketch, the compiler calculates the size of the string array and also automatically null terminates the string with a zero. An array that is six elements long and consists of five characters followed by a zero is created exactly the same way as in the previous sketch.

Платы и модули для функционала

Существует много плат Arduino, описание которых говорит о различиях в объеме памяти, портах, питании, тактовой частоте и др. Одни предназначены для решения простых задач, другие — для решения более сложных.

К популярным платам относятся следующие виды:

  1. Arduino Uno. Наиболее распространенная плата. Есть большой выбор уроков. Плата допускает замену контроллера. Оснащена 14 цифровыми вводами-выводами (6 ШИМ), 6 аналоговыми входами, флеш-памятью 32 Кб (ATmega328), из которых 0,5 Кб использует загрузчик.
  2. Arduino Mega 2560. Создана на базе микроконтроллера ATmega2560. Флеш-память — 256 Кб, из которых 8 Кб использует загрузчик. Имеет 54 цифровых вводов-выводов (14 ШИМ), 16 аналоговых входов, 8 Кб оперативной памяти. Среди всех плат «Ардуино» у этой самый большой размер.
  3. Arduino Due. Оснащена 54 цифровыми вводами-выводами (12 ШИМ), 12 аналоговыми входами (2 выходами). Создана на базе микроконтроллера AT91SAM3X8E с рабочим напряжением 3,3 В и флеш-памятью 512 Кб.
  4. Arduino Pro Mini 3.3V. Самая миниатюрная плата в семействе Arduino. Напряжение — 3,3 В. Требует использования внешнего программатора. Память данных составляет 2 Кб. Создана на базе микроконтроллера ATmega328P. Количество цифровых выводов — 14 линий (6 из которых — ШИМ), аналоговых — 6.
  5. Arduino Pro Mini 5V. Аналог предыдущей модели с напряжением 5 В.
  6. Arduino Nano V3.0. Создана на базе ATmega328. Сдержит 32 Кб памяти, из которых 2 Кб использует загрузчик. Имеет 14 цифровых вводов-выводов (6 ШИМ), 6 аналоговых входов, встроенный порт USB. Напряжение — 5 В.
  7. Arduino Micro. Разновидность платы c возможностью имитировать различные USB-устройства при подключении к ПК. Оснащена 20 цифровыми вводами-выводами (7 ШИМ), 12 аналоговыми входами.

Кроме того, существуют дополнительные модули и датчики с нужными ответвлениями:

  1. Датчики. Системы, считывающие, отправляющие и обрабатывающие информацию. Расширяют аппаратные функции проекта.
  2. Модули. Дополнения, которые позволяют расширить вычислительные мощности проекта. К ним относят карты памяти, вспомогательные процессы.

Датчики можно разделить на категории:

  1. Устройства получения информации. Датчики и сканеры, позволяющие получить сведения об окружающей среде: давлении, температуре, влажности, расстоянии до объектов. Есть возможность вводить параметры, зависящие от этих показаний. С помощью датчика расстояния можно создавать роботы-пылесосы, которые передвигаются по комнате, избегая препятствий.
  2. Устройства обработки информации. Реализуются отдельно или совместно с предыдущими датчиками. Используются для совершения промежуточных операций.
  3. Устройства вывода информации. Это ЖК-экраны, светодиодные индикаторы, сенсорные экраны, динамики и т. д.

Среди наиболее популярных модулей «Ардуино» можно выделить:

  1. Ультразвуковой дальномер HC-SR04. Датчик, позволяющий с помощью ультразвука измерить расстояние от 2 см до 4 м.
  2. Инфракрасный дальномер Sharp. Измеряет расстояние от 20 см до 1,5 м посредством инфракрасного излучения.
  3. Модуль температуры и влажности DHT11. Измеряет температуру в диапазоне от 0 до +50°C и влажность от 20 до 90%. Используется для теплиц или в качестве комнатного термометра. Часто приобретается для умного дома.
  4. Датчик влажности почвы FC-28. Измеряет влажность почвы или другой среды. Нужен для автоматизированного полива растений.
  5. Bluetooth HC-06. Помогает организовать беспроводную связь с другими устройствами.

Программирование Ардуино

Язык программирования устройств Ардуино основан на C/C++. Он прост в освоении, и на данный момент Arduino — это, пожалуй, самый удобный способ программирования устройств на микроконтроллерах.

Базовые и полезные знания, необходимые для успешного программирования под платформу Arduino:

  • Начало работы с Arduino в Windows
  • Работа с Arduino Mini
  • Цифровые выводы
  • Аналоговые входы
  • Широтно-импульсная модуляция
  • Память в Arduino
  • Использование аппаратных прерываний в Arduino
  • Переменные
  • Функции
  • Создание библиотек для Arduino
  • Использование сдвигового регистра 74HC595 для увеличения количества выходов
  • Прямое управления выходами через регистры микроконтроллера Atmega

Справочник языка Ардуино

Язык Arduino можно разделить на три раздела:

Операторы

  • setup()
  • loop()
Управляющие операторы
  • if
  • if…else
  • for
  • switch case
  • while
  • do… while
  • break
  • continue
  • return
  • goto
Синтаксис
  • ; (semicolon)
  • {} (curly braces)
  • // (single line comment)
  • /* */ (multi-line comment)
Арифметические операторы
  • = (assignment)
  • + (addition)
  • — (subtraction)
  • * (multiplication)
  • / (division)
  • % (modulo)
Операторы сравнения
  • == (equal to)
  • != (not equal to)
  • < (less than)
  • > (greater than)
  • <= (less than or equal to)
  • >= (greater than or equal to)
Логические операторы
  • && (И)
  • || (ИЛИ)
  • ! (Отрицание)
Унарные операторы
  • ++ (increment)
  • — (decrement)
  • += (compound addition)
  • -= (compound subtraction)
  • *= (compound multiplication)
  • /= (compound division)

Данные

Константы
  • HIGH | LOW
  • INPUT | OUTPUT
  • true | false
  • Целочисленные константы
  • Константы с плавающей запятой
Типы данных
  • boolean
  • char
  • byte
  • int
  • unsigned int
  • word
  • long
  • unsigned long
  • float
  • double
  • string — массив символов
  • String — объект класса
  • массив (array)
  • void
Преобразование типов данных
  • char()
  • byte()
  • int()
  • long()
  • float()
Область видимости переменных и квалификаторы
  • Область видимости
  • static
  • volatile
  • const

Функции

Цифровой ввод/вывод
  • pinMode()
  • digitalWrite()
  • digitalRead()
Аналоговый ввод/вывод
  • analogRead()
  • analogReference()
  • analogWrite()
Дополнительные фунции ввода/вывода
  • tone()
  • noTone()
  • shiftOut()
  • pulseIn()
Работа со временем
  • millis()
  • micros()
  • delay()
  • delayMicroseconds()
Математические функции
  • min()
  • max()
  • abs()
  • constrain()
  • map()
  • pow()
  • sq()
  • sqrt()
Тригонометрические функции
  • sin()
  • cos()
  • tan()
Генераторы случайных значений
  • randomSeed()
  • random()
Внешние прерывания
  • attachInterrupt()
  • detachInterrupt()
Функции передачи данных

Serial

Библиотеки Arduino

Servo — библиотека управления сервоприводами.EEPROM — чтение и запись энергонезависимой памяти микроконтроллера.SPI — библиотека, реализующая передачу данных через интерфейс SPI.Stepper — библиотека управления шаговыми двигателями.

Создание строк в ардуино с помощью String

В ардуино у нас есть несколько способов создать строку, приведем основные:

  • char myCharStr = “Start”;  – массив типа char с завершающим пустым символом;
  • String myStr = “Start”; – объявляем переменную, создаем экземпляр класса String и записываем в него константу-строку.
  • String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы
  • String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.
  • String myStr = String(50); – создаем строку из целого числа (преобразование int to string).
  • String myStr = String(30, H); – создаем строку – представление числа в 16-чной системе (HEX to String)
  • String myStr = String(16, B); – создаем строку – представление числа в двоичной системе (Byte to String).

Каждый раз, когда мы объявляем в коде строку с использованием двойных кавычек, мы создаем неявный объект класса String, являющийся константой. При этом обязательно использование именно двойных кавычек: “String” – это строка. Одинарные кавычки нужны для обозначения отдельных символов. ‘S’ – это символ.

Преобразование String в массив char

Тип данных Char позволяет объявлять текстовые строки несколькими способами:

  • char myStr1; – в данном случае объявлен массив определенного размера.
  • char myStr2 = <‘a’, b, ‘c’, ‘d’, ‘e’>; – объявлен сам массив. Конечный символ не записанявно, его прибавит сам компилятор.
  • char myStr3 = <‘a’, b, ‘c’, ‘d’, ‘e’’/0’>; – объявлен массив, при этом в конце прописан признак окончания строки.
  • char myStr4 = “abcde”; – инициализация массива строковой постоянной. Размер и завершающий символ добавляются автоматически компилятором.
  • char myStr5 = “abcde”; – инициализация массива с точным указанием его размера.
  • char myStr 6 = “abcde”; – аналогично, но размер указан больше для возможности использования строк большей длины.

Еще раз напомним, что в типе данных char строковые константы нужно записывать в двойные кавычки «Abcde», а одиночные символы – в одинарные ‘a’.

Конвертировать строку в массив сhar array можно при помощи следующего кода:

String stringVar = “111”;

Можно сделать обратное преобразование – char to string.

char[] chArray = “start”;

Пример преобразования String to const char*. Указание звездочкой char*означает, что это массив указателей.

String stringVar=string (`start);

Char charVar;

Код

 1 /*
 2   Строковые функции indexOf() и lastIndexOf()
 3 
 4   Несколько примеров того, как анализировать строки, а также искать и заменять в них определенные символы.
 5 
 6  Создан 27 июля 2010, 
 7  модифицирован 2 апреля 2012 Томом Иго (Tom Igoe)
 8 
 9  http://arduino.cc/en/Tutorial/StringIndexOf
10 
11  Этот код не защищен авторским правом. 
12  */
13 
14 void setup() {
15   // Инициализируем последовательную передачу данных и ждем открытия порта:
16   Serial.begin(9600);
17   while (!Serial) {
18     ; // ждем подключения последовательного порта (нужно только для Leonardo)
19   }
20 
21   // Отсылаем вступительную часть:
22   Serial.println("\n\nString indexOf() and lastIndexOf()  functions:");
23   Serial.println();
24 }
25 
26 void loop() {
27   // Функция indexOf() возвращает самую первую позицию (т.е. индекс) определенного символа, находящегося в строке. 
28   // Ее можно использовать, например, при анализе HTML-тегов:
29   String stringOne = "<HTML><HEAD><BODY>";
30   int firstClosingBracket = stringOne.indexOf('>');
31   Serial.println("The index of > in the string " + stringOne + " is " + firstClosingBracket);
32 
33   stringOne = "<HTML><HEAD><BODY>";
34   int secondOpeningBracket = firstClosingBracket + 1;
35   int secondClosingBracket = stringOne.indexOf('>', secondOpeningBracket );
36   Serial.println("The index of  the second > in the string " + stringOne + " is " + secondClosingBracket);
37 
38   // Кроме того, при помощи indexOf() можно искать и совокупности символов
39   // или даже целые строки:
40   stringOne = "<HTML><HEAD><BODY>";
41   int bodyTag = stringOne.indexOf("<BODY>");
42   Serial.println("The index of the body tag in the string " + stringOne + " is " + bodyTag);
43 
44   stringOne = "<UL><LI>item<LI>item<LI>item</UL>";
45   int firstListItem = stringOne.indexOf("<LI>");
46   int secondListItem = stringOne.indexOf("item", firstListItem + 1 );
47   Serial.println("The index of the second list item in the string " + stringOne + " is " + secondClosingBracket);
48 
49   // Функция lastIndexOf() возвращает самый последний индекс заданного символа, находящегося в строке:
50   int lastOpeningBracket = stringOne.lastIndexOf('<');
51   Serial.println("The index of the last < in the string " + stringOne + " is " + lastOpeningBracket);
52 
53   int lastListItem  = stringOne.lastIndexOf("<LI>");
54   Serial.println("The index of the last list item in the string " + stringOne + " is " + lastListItem);
55 
56 
57   // при помощи lastIndexOf() тоже можно искать совокупности символов и строки:
58   stringOne = "<p>Lorem ipsum dolor sit amet</p><p>Ipsem</p><p>Quod</p>";
59   int lastParagraph = stringOne.lastIndexOf("<p");
60   int secondLastGraf = stringOne.lastIndexOf("<p", lastParagraph - 1);
61   Serial.println("The index of the second last paragraph tag " + stringOne + " is " + secondLastGraf);
62 
63   // Пока условие верно, ничего не делаем:
64   while(true);
65 }

Работа программного обеспечения

Интерфейс DS5000

Программа, приведённая в Приложении, написана для взаимодействия DS5000 с DS1307 с помощью двухпроводного интерфейса. DS5000 запрограммирован с использованием макетной платы DS5000T фирмы Dallas Semiconductor, которая позволяет использовать ПК в качестве терминала ввода/вывода. Программные средства KIT5K поставляемые вместе с макетной платой DS5000T обеспечивают высокоуровневый интерфейс для загрузки программных приложений в DS5000 или установки его параметров через Program command. Программное обеспечение KIT5K содержит эмулятор терминала ввода/вывода, чтобы позволить пользователю запускать программные приложения в микроконтроллер DS5000, который связан с пользователем через COM порт ПК.

Исходный код DS1307

Первый раздел исходного кода, расположенный в Приложении, используется при конфигурации DS5000 для последовательного соединения с ПК. Также в начале кода находится подпрограмма MASTER_CONTROLLER, которая используется для управления демонстрационной программой.

Подпрограммы, которые следуют непосредственно за подпрограммой MASTER_CONTROLLER, являются драйверами низкого уровня и служат для управления двухпроводным интерфейсом. Они не являются индивидуальными для DS1307, а могут быть использованы с любым совместимым с двухпроводным интерфейсом «ведомым» устройством. Вот эти подпрограммы:

SEND_START

Подпрограмма используется для генерации состояния START на двухпроводной шине.

SEND_STOP

Подпрограмма используется для генерации состояния STOP на двухпроводной шине.

SEND_BYTE

Подпрограмма посылает 8-разрядное слово (первым является старший значащий бит (MSB)) по двухпроводной шине и девятый тактовый импульс для импульса подтверждения приёма.

READ_BYTE

Подпрограмма читает 8-разрядное слово с двухпроводной шины. Она проверяет очищен ли флаг LASTREAD после того, как считан последний байт из «ведомого» устройства. Если это был не последний байт, то DS5000 посылает импульс подтверждения по девятому тактовому импульсу, а если это был последний считанный байт из «ведомого» устройства, то DS5000 посылает «неподтверждение».

SCL_HIGH

Подпрограмма осуществляет переход линии SCL из низкого в высокое состояние и обеспечивает высокое состояние линии SCL перед продолжением.

DELAY и DELAY_4

Эти две подпрограммы включены для обеспечения сохранения временной диаграммы двухпроводной шины.

Остальная часть кода, включённая в приложение, специально предназначена для демонстрации функций DS1307. Продемонстрированы следующие функции:

Setting Time

Время считывается с клавиатуры и сохраняется в сверхоперативной памяти DS5000. Затем оно передаётся по двухпроводной шине в DS1307.

Set RAM

Одиночный байт в шестнадцатеричном виде считывается с клавиатуры и записывается в RAM DS1307.

Read Date/Time

Дата и время считываются по двухпроводной шине и сохраняются в сверхоперативной памяти DS5000. Затем они выводятся на экран. Это продолжается до тех пор, пока не будет нажата кнопка на клавиатуре.

OSC On/OSC Off

Тактовый генератор DS1307 может быть включен или выключен.

SQW/OUT On/SQW/OUT Off

Функция SQW/OUT может быть включена или выключена. Она будет переключаться на частоте 1 Гц.

Таблица 1. AC электрические характеристики

Параметр Символ Эффективноезначение Единицы
Тактовая частота SCL fSCL 59 кГц
Время свободного состояния шины между состояниями STOP и START tBUF 5.7 мкс
Время удержания(повторенного) состояния START tHD:STA 6.2 мкс
Период низкого состояния тактового импульса SCL tLOW 10.5 мкс
Период высокого состояния тактового импульса SCL tHIGH 6.5 мкс
Время установки для повторного состояния START tSU:STA 5.3 мкс
Время удержания данных tHD:DAT 5.5 мкс
Время установки данных tSU:DAT 3.1 мкс
Время установки для состояния STOP tSU:STO 5.4 мкс

Заключение

Было показано, как правильно подсоединять напрямую DS1307 или любое двухпроводное «ведомое» устройство к 8051-совместимому микроконтроллеру. Соединение должно быть таким, чтобы временная диаграмма двухпроводного интерфейса на микроконтроллере не нарушалась драйверами низкого уровня. Для этого в программный код должны быть включены подпрограммы задержки. Приведённых в таблице 1 эффективных значений, придерживались при конфигурации аппаратной части, описанной в данном техническом руководстве.

Документация

  Rus Пример программы на языке Асемблер
  100 Kb Engl Исходный фаил
  Rus Описание интерфейса I2C
  Програмное обеспечение микроконтроллеров MCS-51
  200 Kb Engl Описание DS1307 — часы реального времени с IIC интерфейсом

Главная —
Микросхемы —
DOC —
ЖКИ —
Источники питания —
Электромеханика —
Интерфейсы —
Программы —
Применения —
Статьи

Функция write() библиотеки Serial

Если мы хотим передать в монитор порта не ASCII код числа, а само число, то у нас есть возможность это сделать с помощью функции write().

  • Serial.write(65);  –  В данном случае на экране мы увидим символ A, так как 65 – это символ A в ASCII. Используя функцию write, мы отправляем число 65 монитору порта в виде… числа 65, а не текста “65”, как в случае функции print(). При выводе на экран уже сам монитор порта будет конвертировать его в соответствие с таблице ASCII. В данном случае, таким символом является латинская буква A.
  • Serial.print(65);  – А теперь мы увидим на экране 65, т.к. в монитор придет уже строка, а не цифра. Каждая цифра исходного числа 65 будет предварительно сконвертирована в ASCII код и монитор порта увидит сроку «65», а не число. Этим и отличаются друг от друга функции print и write.

Arduino String Serial Command Decode Structure

With these four bits of code you can make up the serial receiver as follows:

The code in setup() initializes the serial port to 9600 Baud and prints out the first string message.

In loop() the serial port is continuously monitored and if a byte is
received it is placed into variable ch and appended to the string sdata. If
the byte was a Carriage Return (CR — when you hit the return key), then
the trim function is used to remove all white space at the end of
sdata. sdata is now ready to be decoded.

Notice how you can concatenate strings, that is add one to the end of
another by using the overloaded ‘+’ operator, here using the shortened
form ‘+=’.

Just before leaving the if condition, sdata is set to nothing ready for the next command decode.

Проблемы при использовании с ATtiny

В библиотеке для буферов используется большой объем памяти. Он включает в себя 3 разных байтовых буфера, каждый размером 32 байта. Это не большая проблема для ATmega, но ATtiny (например, ATtiny48) обладает меньшим количеством RAM (512/1K у ATmega, и 256/512 у ATtiny). Когда я попытался использовать библиотеку Wire на ATtiny, у меня появлялись случайные сбои, зависания и т.д. Как только я изменил размер буфера (в .\libraries\Wire\utility\twi.h) на 6, всё отлично заработало.

Не делайте ошибку, думая, что вы можете просто указать в своем скетче  потому, что это не работает. Способ, которым Arduino IDE компилирует ваш код, не очевиден. Библиотека компилируется отдельно от вашего скетча, а затем линкуется с ним. Поэтому вам придется изменить размер буфера в заголовочном файле библиотеки, который также включается в исходном файле библиотеки (twi.c).

Создание строк в ардуино с помощью String

В ардуино у нас есть несколько способов создать строку, приведем основные:

  • char myCharStr = “Start”; – массив типа char с завершающим пустым символом;
  • String myStr = “Start”; – объявляем переменную, создаем экземпляр класса String и записываем в него константу-строку.
  • String myStr = String(“Start”); – аналогичен предыдущему: создаем строку из константы
  • String myStr(myCharStr); – создаем объект класса String с помощью конструктра, принимающего на вход массив типа char и создающего из char String.
  • String myStr = String(50); – создаем строку из целого числа (преобразование int to string).
  • String myStr = String(30, H); – создаем строку – представление числа в 16-чной системе (HEX to String)
  • String myStr = String(16, B); – создаем строку – представление числа в двоичной системе (Byte to String).

Каждый раз, когда мы объявляем в коде строку с использованием двойных кавычек, мы создаем неявный объект класса String, являющийся константой. При этом обязательно использование именно двойных кавычек: “String” – это строка. Одинарные кавычки нужны для обозначения отдельных символов. ‘S’ – это символ.

Выводим на LCD 1602 русский шрифт

QAPASS дисплей поддерживает 8 новых символов (пронумерованных от 0 до 7) размером 5 на 8 пикселей. Букву на кириллице, как и символ, можно задать массивом из восьми байт, характеризующих соответствующую строку. Можно добавить до 8 символов, поэтому используйте при выводе сочетание латинских и кириллических букв, как на примере. Загрузите скетч с надписью «Я РОБОТЕХНИКА18.РФ»

Скетч с русскими буквами на LCD I2C

#include <Wire.h> // библиотека для управления устройствами по I2C 
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 1602

LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея

// создаем символ сердца и четырех букв на кириллице

byte heart = { 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 };

byte I = { 0b01111, 0b10001, 0b10001, 0b01111, 0b00101, 0b01001, 0b10001, 0b00000 };
byte B = { 0b11111, 0b10000, 0b10000, 0b11110, 0b10001, 0b10001, 0b11110, 0b00000 };
byte N = { 0b10001, 0b10001, 0b10011, 0b10101, 0b11001, 0b10001, 0b10001, 0b00000 };
byte F = { 0b01110, 0b10101, 0b10101, 0b10101, 0b01110, 0b00100, 0b00100, 0b00000 };

void setup() {
   LCD.init(); // инициализация LCD дисплея
   LCD.backlight(); // включение подсветки дисплея

   // присваиваем символам порядковый номер
   LCD.createChar(1, heart);
   LCD.createChar(2, I);
   LCD.createChar(3, B);
   LCD.createChar(4, N);
   LCD.createChar(5, F);
  
   LCD.setCursor(6,0); // устанавливаем курсор на 6 символ первой строки
  
   LCD.print(char(2));
   LCD.print(" ");
   LCD.print(char(1));
  
   LCD.setCursor(0,1); // устанавливаем курсор на начало второй строки
  
   LCD.print("PO");
   LCD.print(char(3));
   LCD.print("OTEXH");
   LCD.print(char(4));
   LCD.print("KA18.P");
   LCD.print(char(5));
}

void loop() {
 
}

Пояснения к коду:

  1. массивы строк в функции можно прописывать в строку;
  2. слово РОБОТЕХНИКА18.РФ использует набор русских и латинских букв.