Arduino

Часы из старого калькулятора

Если у вас завалялся старый калькулятор, то не спешите его выбрасывать. На его базе можно сделать электронные часы. Причем используется тот же дисплей и корпус, а также большая часть оригинальной схемы калькулятора, но с некоторой дополнительной электроникой.
Конкретно в статье рассмотрена модель ibico 066 V1, но если модель другая, можно использовать следующие шаги в качестве общего руководства.

Инструменты и материалы:
-Мультиметр;
-Осциллограф;
-Паяльник;
-Инструменты для травления и изготовления печатных плат;
-Компьютер с Arduino IDE;
-Электронные компоненты (файл со спецификацией можно скачать здесь);

Шаг первый: устройство и разборка калькулятора
Большинство подобных калькуляторов состоят из общих основных частей:
VFD (вакуумный флуоресцентный дисплей)
Батарейный отсек
Микроконтроллер
Повышающий трансформатор
Печатная плата клавиатуры

Дисплей может быть выполнен по разным технологиям, но это не важно, так как им будет управлять микроконтроллер.
Благодаря батарейному отсеку, можно узнать при каком напряжении работал данный калькулятор. Мастер собирается подавать питание для основной платы калькулятора, используя собственную схему. В данной модели устанавливалось 4 батарейки АА, и при тестировании на переменном источнике питания выбранная модель (ibico 066 V1) могла работать в диапазоне от 3 В до 6 В. В связи с этим он решил использовать напряжение 5 В. В случае если калькулятор работает только от 2 батареек AA, то придется добавить стабилизатор напряжения 3,3 В в схему источника питания.

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

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

Шаг второй: отображение даты и времени на дисплее
Эту задачу можно реализовать по-разному. Самый простой способ, который мастер придумал, — это имитировать нажатие клавиш на клавиатуре с помощью дополнительного микроконтроллера.

Поэтому он заменил печатную плату клавиатуры новой печатной платой, которая содержит:
Перезаряжаемый литий-ионный аккумулятор.
Микросхема IP5305 для зарядки аккумулятора и повышения напряжения аккумулятора до 5 В.
DS1307 I2C RTC (часы реального времени).
ATmega328P-PU с загрузчиком Arduino UNO.
Оптопары PC817, которые принимают электрический сигнал от ATmega328 и действуют как электронный переключатель вместо механического переключателя на клавиатуре.

Шаг третий: схема и печатная плата
Все файлы проекта можно найти в репозитории проекта на github, включая:
Схематический дизайн
Макет печатной платы
Схематическое изображение PDF
PDF-файлы макета печатной платы для варианта изготовления самодельной печатной платы
Файлы PCB Gerber для заводского изготовления
Графические выходы
Ведомость материалов
Все скетчи Arduino, использованные в этом проекте

Шаг четвертый: микросхема IP5305
Микросхема IP5305 используется во многих устройства для зарядки литиевых батарей. В данном случае она будет использоваться для работы микросхемы ATmega328, всех добавленных компонентов, а также питания основной платы калькулятора, которая содержит микроконтроллер калькулятора, трансформатор и частотно-регулируемый привод.

Для индикации состояния батареи будет использоваться 1 светодиодный индикатор.
Ток зарядки ИС составляет 0,1 А. Значит, для устройства необходимо использовать батарею не менее 1000 мА.
В данном случае мастер использовал литий-ионный аккумулятор CGR18650 D Panasonic 2350 мА, извлеченный из старого аккумулятора ноутбука.

Шаг пятый: главный выключатель и резистор фиктивной нагрузки
Для включения и выключения часов был переделан главный выключатель калькулятора.
Автор отсоединил 2 провода главного переключателя от основной платы калькулятора и закоротил контактные площадки на плате.
Затем подключил переключатель двумя проводами к контактным площадкам на добавленной печатной плате (более подробно далее).
Резистор фиктивной нагрузки добавлен для поддержания минимального значения потребления тока на выходной шине 5 В, если ток, потребляемый добавленной схемой и схемой вычислителя вместе, ниже порога отключения микросхемы IP5305.

Шаг шестой: микросхема часов реального времени DS1307
Для времени и даты мастер использовал микросхему DS1307 I2C RTC.
В ней использовалась внешняя батарейка типа «таблетка», чтобы поддерживать вторичный источник питания в случае отключения первичного источника 5 В, и в качестве источника синхронизации используется внешний кварцевый генератор 32,768 кГц.
Для более точного показания можно использовать DS3231, в котором используется кварцевый генератор с внутренней температурной компенсацией.

Шаг седьмой: взаимодействие с клавиатурой
Это самый важный шаг. Он о том, как микроконтроллер ATmega328 отображает время и дату, полученные с чипа RTC, на дисплее калькулятора.
Кто знаком с тем, как, например, Arduino использует клавиатуру 4×4,тот знает, что клавиатура разделена на два набора контактов (контакты столбцов и контакты строк).

Arduino отправляет импульсы / сигналы на один из наборов контактов (столбцы или строки) и ждет, ответа, будут ли эти сигналы считаны / получены на другом наборе контактов. Если клавиша нажата, Ардуино считывает сигнал и понимает, что клавиша нажата. При этом каждая имеет уникальное положение (столбец, строка).

Именно так микроконтроллер калькулятора также сканирует свою клавиатуру. Но здесь нужно будет идентифицировать контакты столбцов и строк, и знать комбинацию (Столбец, Строка) следующих клавиш: 0,1,2,3,4,5,6, 7,8,9, десятичная точка, C (клавиша очистки).
Какой контакт и какая дорожка конкретно отвечает за какую клавишу, необходимо прозвонит на калькуляторе.

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

Допустим, задача отобразить время 11:05:32. Чип ATmega дает следующие команды:
Активируйте оптопару с ключом («C»), чтобы очистить дисплей, затем деактивируйте ее, чтобы отпустить ключ.
Активируйте оптопару с ключом («1»), затем дважды деактивируйте ее.
Активируйте оптопару с ключом («.») , чтобы изолировать цифры между часами и минутами, а затем деактивируйте ее.
Активируйте оптопару с ключом (‘0’), затем деактивируйте ее.
Активируйте оптопару с ключом («5»), затем деактивируйте ее.
Активируйте оптопару с ключом («0»), чтобы выделить промежуток между цифрами минут и секунд, а затем деактивируйте ее.
Активируйте оптопару с ключом («3»), затем отключите ее (мастер решил отображать секунды только в разряде 10, чтобы сократить время обновления дисплея).

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

Шаг восьмой: микроконтроллер ATmega328P-PU
И наконец, что не менее важно, микроконтроллер ATmega328P-PU.
Это минимальная конфигурация Arduino Uno, которая включает в себя конденсаторы, кварцевый генератор 16 МГц и подтягивающий резистор.
Он имеет кнопку ввода для переключения в режим отображения даты вместо режима отображения времени и подключения UART для программирования встроенной микросхемы с помощью преобразователя USB в UART или платы Arduino UNO.
Он также определяет, какие контакты ATmega328 подключены к какой цифровой оптроне.

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

На что следует обратить внимание при проектировании печатной платы:
Как она будет крепится к корпусу калькулятора.
Размер литий-ионной батареи и, следовательно, размер держателя батареи.
Размеры печатной платы и максимальная высота.
Изготовление: будет ли она сделана самостоятельно или заказана на производстве.
Мастер спроектировал свою печатную плату с помощью программного обеспечения Altium Designer. Размеры печатной платы составляют 80 * 89 мм. Для питания он решил использовать литий-ионный аккумулятор 18650.
Потребление тока схемой составляет 68 мА, поэтому выбранная батарея на 2350 мА может проработать от 24 до 34 часов в зависимости от эффективности IP5305, состояния батареи и фактической емкости.

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

Шаги по монтажу следующие:
Припаяйте секцию IP5305.
Убедитесь, что в схеме нет коротких замыканий.
Убедитесь, что аккумулятор заряжается и разряжается, а выходное напряжение составляет 5 В.
Извлеките аккумулятор, чтобы завершить пайку.
Припаяйте микросхему DS1307 RTC и держатель батарейки.
Убедитесь в отсутствии коротких замыканий на линиях питания RTC.
Припаяйте оптопары и убедитесь, что все они хорошо соединяются с дорожками печатной платы.
Припаяйте остальные части.
Добавьте батарейку типа «таблетка».
Добавьте литий-ионный аккумулятор.
Включите переключатель, чтобы подать на компоненты напряжение 5 В.
Убедитесь, что нет перегрузки по току и короткого замыкания.

Теперь можно собрать устройство и перейти к программированию.

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

Нужно будет выполнить следующие шаги:
Запрограммировать ATmega328P-PU с помощью фиктивного кода и посмотреть, можно ли его запрограммировать и работать так, как запланировано или нет.
Протестировать подключения кнопки режима даты.
Протестировать соединения DS1307 RTC.
Установить время на DS1307 RTC.
Проверить, обеспечивает ли микросхема DS1307 RTC правильные значения времени и даты после программирования или нет.
Протестировать каждую оптопару каждого ключа с помощью микросхемы ATmega328.
После выполнения всех этих тестов можно начать писать основной код часов.

Тестирование микроконтроллера ATmega328
Программирование чипа ATmega328 выполняется с помощью платы Arduino UNO:
Эскиз можно скачать ниже.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
Serial.println("HELLO WORLD");
delay(1000);
}

Проверка кнопки режима даты
Поскольку кнопка режима даты подключена к контакту 13 чипа ATmega328 (эквивалентному контакту 13 Arduino), мастер написал простой эскиз для печати на последовательном мониторе, если кнопка нажата или отпущена.
Обратите внимание, что он использует внутренний подтягивающий резистор чипа ATmega, и в этом случае кнопка активна низко (нажата = 0, отпущена = 1)

 Показать / Скрыть текстvoid setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(13, INPUT_PULLUP);
}

void loop() {
// put your main code here, to run repeatedly:
while(!digitalRead(13)){
Serial.println("PRESSED");
delay(200);
}
Serial.println("RELEASED");
delay(200);
}

Тестирование подключения I2C DS1307 RTC
Чтобы проверить, подключена ли микросхема DS1307 RTC к шине I2C и правильно ли она обменивается данными, можно сначала загрузить эскиз сканера I2C в библиотеку I2CScanner и проверить, отображается ли устройство в сканировании I2C по адресу 0x68.
Если сканер не показывает подключенное устройство по этому адресу, нужно проверить соединения I2C и проверить, правильно ли подключены подтягивающие резисторы линий SCL и SDA.

 Показать / Скрыть текст/***************************************************
Copyright (c) 2018 Luis Llamas
(www.luisllamas.es)
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License
****************************************************/

#include "I2CScanner.h"

I2CScanner scanner;

void setup()
{
Serial.begin(9600);
while (!Serial) {};

scanner.Init();
}

void loop()
{
scanner.Scan();
delay(5000);

Установка времени DS1307
Перед использованием чипа RTC необходимо установить фактическое время на чипе.
Убедитесь, что батарея подключена к плате, а линия Vbat имеет напряжение около 3 В. Эта батарея необходима пока плата не получает основное питание 5 В VCC.
Загрузите библиотеку DS1307RTC и импортируйте ее в среду разработки Arduino.
Загрузите библиотеку времени и импортируйте ее в среду разработки Arduino.
Загрузите эскиз заданного времени из библиотеки DS1307RTC.
Обратите внимание, что эскиз времени установки автоматически запрограммирует время RTC на время вашего компьютера, указанное компилятором, поэтому вам не нужно вручную устанавливать время.

 Показать / Скрыть текст//File -> Examples -> DS1307RTC -> ReadTest

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
bool parse=false;
bool config=false;

// get the date and time the compiler was run
if (getDate(__DATE__) && getTime(__TIME__)) {
parse = true;
// and configure the RTC with this info
if (RTC.write(tm)) {
config = true;
}
}

Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor
delay(200);
if (parse && config) {
Serial.print("DS1307 configured Time=");
Serial.print(__TIME__);
Serial.print(", Date=");
Serial.println(__DATE__);
} else if (parse) {
Serial.println("DS1307 Communication Error :-{");
Serial.println("Please check your circuitry");
} else {
Serial.print("Could not parse info from the compiler, Time="");
Serial.print(__TIME__);
Serial.print("", Date="");
Serial.print(__DATE__);
Serial.println(""");
}
}

void loop() {
}

bool getTime(const char *str)
{
int Hour, Min, Sec;

if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}

bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;

if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
После установки времени необходимо проверить работу микросхемы.
Выключите калькулятор (отключите питание от основной платы) примерно на 2 или 3 минуты, чтобы проверить, могут ли часы реального времени работать от батарейки.
Загрузите скетч ReadTest из библиотеки DS1307RTC и посмотрите, правильны ли время и дата, считанные с микросхемы RTC.
Если время неверное, смещено или не учитывается количество минут, в течение которых было отключено питание, проверьте подключение батарейки.

 Показать / Скрыть текст//File -> Examples -> DS1307RTC -> ReadTest

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for serial
delay(200);
Serial.println("DS1307RTC Read Test");
Serial.println("——————-");
}

void loop() {
tmElements_t tm;

if (RTC.read(tm)) {
Serial.print("Ok, Time = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Date (D/M/Y) = ");
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
} else {
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial.println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
delay(9000);
}
delay(1000);
}

void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}

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

 Показать / Скрыть текст#define D0 6
#define D1 5
#define D2 9
#define D3 8
#define D4 7
#define D5 A3
#define D6 A2
#define D7 4
#define D8 3
#define D9 2
#define DP A0
#define C A1

void display_digit(char digit);

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

pinMode(D0, OUTPUT); digitalWrite(D0, LOW);
pinMode(D1, OUTPUT); digitalWrite(D1, LOW);
pinMode(D2, OUTPUT); digitalWrite(D2, LOW);
pinMode(D3, OUTPUT); digitalWrite(D3, LOW);
pinMode(D4, OUTPUT); digitalWrite(D4, LOW);
pinMode(D5, OUTPUT); digitalWrite(D5, LOW);
pinMode(D6, OUTPUT); digitalWrite(D6, LOW);
pinMode(D7, OUTPUT); digitalWrite(D7, LOW);
pinMode(D8, OUTPUT); digitalWrite(D8, LOW);
pinMode(D9, OUTPUT); digitalWrite(D9, LOW);
pinMode(DP, OUTPUT); digitalWrite(DP, LOW);
pinMode(C, OUTPUT); digitalWrite(C, LOW);

display_digit('C');
delay(1000);
}

void loop() {
// put your main code here, to run repeatedly:
display_digit('1');
delay(2000);

display_digit('.');
delay(2000);

display_digit('2');
delay(2000);

display_digit('3');
delay(2000);

display_digit('4');
delay(2000);

display_digit('5');
delay(2000);

display_digit('6');
delay(2000);

display_digit('C');
delay(2000);

display_digit('7');
delay(2000);

display_digit('8');
delay(2000);

display_digit('9');
delay(2000);

display_digit('0');
delay(2000);

display_digit('C');
delay(2000);

}

void display_digit(char digit){
switch(digit){
case '0': digitalWrite(D0, HIGH); delay(20); digitalWrite(D0, LOW); delay(20); break;
case '1': digitalWrite(D1, HIGH); delay(20); digitalWrite(D1, LOW); delay(20); break;
case '2': digitalWrite(D2, HIGH); delay(20); digitalWrite(D2, LOW); delay(20); break;
case '3': digitalWrite(D3, HIGH); delay(20); digitalWrite(D3, LOW); delay(20); break;
case '4': digitalWrite(D4, HIGH); delay(20); digitalWrite(D4, LOW); delay(20); break;
case '5': digitalWrite(D5, HIGH); delay(20); digitalWrite(D5, LOW); delay(20); break;
case '6': digitalWrite(D6, HIGH); delay(20); digitalWrite(D6, LOW); delay(20); break;
case '7': digitalWrite(D7, HIGH); delay(20); digitalWrite(D7, LOW); delay(20); break;
case '8': digitalWrite(D8, HIGH); delay(20); digitalWrite(D8, LOW); delay(20); break;
case '9': digitalWrite(D9, HIGH); delay(20); digitalWrite(D9, LOW); delay(20); break;
case '.': digitalWrite(DP, HIGH); delay(20); digitalWrite(DP, LOW); delay(20); break;
case 'C': digitalWrite(C, HIGH); delay(20); digitalWrite(C, LOW); delay(20); break;
}
Serial.println(digit);
}
Он работает следующим образом:
Включите оптопару определенной цифры.
Подождите около 20 мс
Выключите оптопару.
Подождите около 20 мс.
Повторите предыдущие шаги, используя другие цифры.
Возможно, потребуется настроить значения задержки, чтобы получить максимальную частоту обновления дисплея калькулятора.

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

 Показать / Скрыть текст#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

//Pinouts as mapped from the schematic
#define D0 6
#define D1 5
#define D2 9
#define D3 8
#define D4 7
#define D5 A3
#define D6 A2
#define D7 4
#define D8 3
#define D9 2
#define DP A0
#define C A1

#define PushButtonPin 13

void display_number(const char *p); //The function that handles the displayed string and converts it to single charcaters to get displayed
void display_digit(char digit); //The final display output function

int hour_data = 0;
int minute_data = 0;
int second_data = 0;

int day_data = 0;
int month_data = 0;
int year_data = 0;

char time_data[7];
char date_data[7];

//Variables needed to make a 10 seconds delay for the display without using delay();
long start_count_millis = 0;
int maximum_millis_delay = 9700;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

pinMode(D0, OUTPUT); digitalWrite(D0, LOW);
pinMode(D1, OUTPUT); digitalWrite(D1, LOW);
pinMode(D2, OUTPUT); digitalWrite(D2, LOW);
pinMode(D3, OUTPUT); digitalWrite(D3, LOW);
pinMode(D4, OUTPUT); digitalWrite(D4, LOW);
pinMode(D5, OUTPUT); digitalWrite(D5, LOW);
pinMode(D6, OUTPUT); digitalWrite(D6, LOW);
pinMode(D7, OUTPUT); digitalWrite(D7, LOW);
pinMode(D8, OUTPUT); digitalWrite(D8, LOW);
pinMode(D9, OUTPUT); digitalWrite(D9, LOW);
pinMode(DP, OUTPUT); digitalWrite(DP, LOW);
pinMode(C, OUTPUT); digitalWrite(C, LOW);

pinMode(PushButtonPin, INPUT_PULLUP);

display_digit('C'); //Clear the display before the main function starts
delay(500);
}

void loop() {
// put your main code here, to run repeatedly:

// Store RTC data into variables and display them every 10 seconds
if ( (millis() — start_count_millis > maximum_millis_delay)||(millis()<=1500) ){
start_count_millis = millis();
tmElements_t tm;
if (RTC.read(tm)) {
hour_data = tm.Hour;
(hour_data > 12) ? (hour_data -= 12) : (hour_data = hour_data); //comment this line to display in 24H mode
minute_data = tm.Minute;
second_data = tm.Second/10; //display seconds in multiples of 10
day_data = tm.Day;
month_data = tm.Month;
year_data = tmYearToCalendar(tm.Year)-2000;

//Format all the time collected data into a char array named (time_data) then display this array on the VFD Display
sprintf(time_data,"%02d.%02d0%d",hour_data,minute_data,second_data);
Serial.println(time_data);
display_digit('C');
display_number(time_data);

//Format all the date collected data into a char array named (date_data) then display this array on the VFD Display when the date button is pressed
sprintf(date_data,"%02d.%02d%02d",day_data,month_data,tmYearToCalendar(tm.Year)-2000);
Serial.println(date_data);
}
}

if (!digitalRead(PushButtonPin)){ //If date display button is pressed
display_digit('C');
display_number(date_data);
delay(3000); //for the date data to stay on to read then return to display time data
display_number(time_data);
}

}

void display_number(const char *p){
while(*p!='')
{
display_digit(*p);
p++;
}
}

void display_digit(char digit){
switch(digit){
case '0': digitalWrite(D0, HIGH); delay(20); digitalWrite(D0, LOW); delay(20); break;
case '1': digitalWrite(D1, HIGH); delay(20); digitalWrite(D1, LOW); delay(20); break;
case '2': digitalWrite(D2, HIGH); delay(20); digitalWrite(D2, LOW); delay(20); break;
case '3': digitalWrite(D3, HIGH); delay(20); digitalWrite(D3, LOW); delay(20); break;
case '4': digitalWrite(D4, HIGH); delay(20); digitalWrite(D4, LOW); delay(20); break;
case '5': digitalWrite(D5, HIGH); delay(20); digitalWrite(D5, LOW); delay(20); break;
case '6': digitalWrite(D6, HIGH); delay(20); digitalWrite(D6, LOW); delay(20); break;
case '7': digitalWrite(D7, HIGH); delay(20); digitalWrite(D7, LOW); delay(20); break;
case '8': digitalWrite(D8, HIGH); delay(20); digitalWrite(D8, LOW); delay(20); break;
case '9': digitalWrite(D9, HIGH); delay(20); digitalWrite(D9, LOW); delay(20); break;
case '.': digitalWrite(DP, HIGH); delay(20); digitalWrite(DP, LOW); delay(20); break;
case 'C': digitalWrite(C, HIGH); delay(20); digitalWrite(C, LOW); delay(20); break;
default : digitalWrite(D0, HIGH); delay(20); digitalWrite(D0, LOW); delay(20); break;
}
Serial.println(digit);
}

Все готово.



Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть