Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

FM-радио для душевой кабины на базе Arduino

Компоненты и расходные материалы

Arduino Nano R3
× 1
FM-радиомодуль RDA Microelectronics RDA5807
× 1
NXP NOKIA 5110 LCD 3V-5V версия
× 1
Крошечный модуль RTC (DS1307 + 24c32 EEPROM)
× 1
PAM8403 - усилитель 2X3W класса D
× 1
Модуль понижающего преобразователя DC-DC Texas Instruments LM2596
× 1
Аккумуляторная батарея LIR2032 3,6 В
× 1
Резистор 100 Ом
× 1
Резистор 1 кОм
× 1
Резистор 10 кОм
× 6
Резистор 100 кОм
× 1
Infineon IRLZ44 power Mosfet
× 1
Динамики PEIYING PY1010C 60 Вт, 4 Ом.
× 1
Блок питания 12 В 3 А, найденный в ломе.
× 1
Конденсаторы емкостью 2200 мкФ, 25 В
× 2
Конденсатор 100 мкФ
× 1
Светодиодные лампы мощностью 3 Вт для замены существующих галогенных ламп G4 10 Вт
× 1

Об этом проекте

Несколько лет назад купил китайскую душевую кабину, в которой установили систему управления TR028 с радио. К сожалению, в один прекрасный день я обнаружил, что эта система полностью мертва. Никто не мог его отремонтировать, поэтому я купил другое, более дешевое радио для душа. Он умер примерно через год.

В моей семье раньше было радио в душевой кабине, поэтому я начал изучать, как эти радио делаются. Внутри системы TR028 я обнаружил странный модуль TEA5767. Некоторые поиски дали мне понять, что это небольшой дешевый FM-радиомодуль. В результатах поиска нашел еще один интересный модуль FM-радио - RDA5807. Он очень похож на TEA5767, но имеет функции RDS, регулировки громкости и усиления низких частот. Поэтому я решил использовать RDA5807 в моем новом проекте.

Я поискал в Интернете и нашел несколько проектов, в которых использовался модуль RDA5807:

  • Основной проект, вдохновивший меня на видение.
  • Вариант, в котором я нашел отличный знак силы сигнала и другую полезную информацию.
  • Другой вариант.
  • Отличная библиотека радиомодулей
  • Полезная информация.
  • Еще один

Можно было повторить один из этих проектов, но никто точно не соответствовал моему видению.

Мое видение было:

  • Устройство с сенсорным экраном для обеспечения водонепроницаемости. (Я использовал корпус с тачпадом от дохлого TR0289).
  • Радио
  • Предварительные настройки нескольких любимых радиостанций.
  • Регулятор громкости
  • Функция автоматического поиска радиостанций.
  • Возможность запоминать искомую радиостанцию ​​
  • Часы для отображения текущего времени.
  • Функция включения / выключения
  • Контроль света
  • Отображается некоторая второстепенная информация, например, температура внутри кабины, RDS.

На Aliexpress я купил RDA5807, Tiny RTC с 32kb EEPROM, PAM8403, NOKIA 5110 LCD, модули LM2596 менее чем за 10 евро и начал эксперименты.

Что в итоге у меня получилось:

  • FM-радио с 2-х рядным (!) RDS
  • 6 предустановок для любимых радиостанций
  • Автоматическая или ручная настройка.
  • Возможность сохранить любимую радиостанцию ​​в одну из 6 предустановок.
  • Регулировка громкости и усиления низких частот.
  • Управление освещением душевой кабины
  • Часы и календарь.
  • RSSI (индикатор мощности радиосигнала)
  • Индикатор стереорежима
  • Функция включения / выключения

Некоторые фотографии проекта

Для дисплея NOKIA 5110 я нашел хорошую библиотеку

Разобрался, как работает сенсорная панель TR028. На самом деле это клавиатура с 2 колонками на 7 рядов. Для работы я использовал эту библиотеку.

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

Как это работает:

  • Радио не включается после подключения питания. Это предотвращает воспроизведение радио, если Powerline нестабилен или было потеряно питание. Чтобы включить радио в первый раз, вам необходимо подключить питание и через несколько секунд нажать кнопку включения. Радио будет воспроизводить последнюю прослушиваемую радиостанцию ​​с уровнем громкости 03. Режим работы - регулятор ГРОМКОСТИ. Чтобы выключить радио, просто нажмите кнопку включения. Устройство выключит ЖК-дисплей, подсветку ЖК-дисплея, усилитель и светодиодную / галогеновую лампу.
  • Для поиска радиостанции вы можете выбрать автоматический или ручной режим настройки, нажав кнопку «Mod». При нажатии кнопок «<» или «>» радио будет искать радиостанцию ​​с уменьшением или увеличением частоты. Чтобы сохранить найденную радиостанцию, нажмите кнопку «Mem», и у вас будет 4 секунды, чтобы выбрать одну из шести предустановок, в которую вы хотите сохранить.
  • Чтобы увидеть текущую дату, нажмите кнопку I (информация). Дата будет отображаться 4 секунды. Эту часть кода можно оптимизировать, поскольку она использует функцию delay ().
  • Чтобы настроить часы, нажмите и удерживайте кнопку D не менее 2 секунд, когда вы услышите сигналы окончания часа (сигналы времени) или увидите последние секунды часа на некоторых точных часах. Отпустите кнопку D, чтобы установить чч.00.00. Если ваши часы опаздывают с 15 до 1 минуты, минуты и секунды будут установлены на 00, а часы будут увеличены на 1, а если ваши часы торопятся с 1 до 15 минут, только минуты и секунды будут установлены на 00 после процедуры настройки. .

Что бы я изменил:

  • Резонатор на модуле RTC для большей точности, но функция настройки часов позволяет решить эту проблему.
  • ЖК-экран 5110 - больше и ярче. Это может быть цветной ЖК-дисплей размером 1, 8 или 2,0 дюйма, потому что иногда трудно прочитать информацию на ЖК-дисплее NOKIA 5110, используемом в проекте.
  • Усилитель PAM8403 и PAM8610 с выходной мощностью 2x15 Вт или TDA7297 с такими же характеристиками.

Заключение:

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

Я не программист, поэтому код можно оптимизировать лучше. Мой опыт программирования на C / C ++ составляет около года, самостоятельное обучение. Это мой первый полезный проект на платформе Arduino и первый проект, которым я делюсь в хабе. Пожалуйста, поймите и простите меня за возможные ошибки и мой плохой английский.

Если у вас есть вопросы, не стесняйтесь их задавать в комментариях или личке.

Обновление 1. Незначительные обновления оборудования и программного обеспечения.

Аппаратно - на линии 12В установлен предохранитель на 2А. Просто из соображений безопасности.

Программное обеспечение - добавлена ​​строка 586 menu = 1; Это восстанавливает режим до ГРОМКОСТИ после нажатия клавиши питания.

Обновление 2:

К сожалению, ЖК-дисплей в моем радио вот-вот умрет.

Итак, я ищу дешевую альтернативу ЖК-дисплею NOKIA 5110. Я не буду устанавливать новый ЖК-дисплей 5110, потому что он маленький и его трудно читать. Думаю, я поэкспериментирую с 1,8-дюймовым TFT-дисплеем. Плюсы - он больше, ярче, имеет лучшее разрешение. Плохие - я уверен, что 1,8-дюймовый TFT-экран будет потреблять больше ресурсов, что имеет решающее значение.

Ваши советы по замене ЖК-дисплеев приветствуются.

Код

  • Эскиз проекта
  • Символы силы сигнала
Эскиз проекта Arduino
 /////////////////////////////////////////////// //////////////////// Проект FM-радио на базе Arduino //// Arduino NANO, RDA5807M, RTC, EEPROM, LCD5110, термистор //////// ////////////////////////////////////////////////// ///////// # include  //http://www.rinkydinkelectronics.com/library.php?id=48#include  // https:// github. com / cyberp / AT24Cx # include  // IDE Arduino включена # include  // http://www.mathertel.de/Arduino/RadioLibrary.aspx#include  // http://www.mathertel.de/Arduino/RadioLibrary.aspx#include  //https://github.com/adafruit/RTClib#include  // http:// www. mathertel.de/Arduino/RadioLibrary.aspx#include  //http://playground.arduino.cc/Code/Keypad#define MAXmenu 4 # define ledPin 13 # define blPin 7 // определите тарелки на кнопки клавиатуры char keys [7] [2] ={{'L', 'P'}, // LED, POWER {'I', 'D'}, // INFO, DISPLAY {'1', '2 '}, // предустановки {' 3 ',' 4 '}, // от 1 {' 5 ',' 6 '}, // до 6 {' M ',' m '}, // M ODE, MEM {'<', '>'} // вниз, вверх}; byte rowPins [7] ={11, 12, 10, 17, 9, 16, 8}; // подключаемся к выводам строки keypadbyte colPins [2] ={15, 14}; // подключаемся к выводам столбцов клавиатуры // Keypad =Keypad (makeKeymap (keys), rowPins, colPins, ROWS, COLS); Keypad keypad =Keypad (makeKeymap (keys), rowPins, colPins, 7, 2); логический бас =0, dspl =0, memdisplay =0, mempress =0, adj =0; логическое ledPin_state, power_state; int menu; int volume, volumeOld =5; int frequency, frequencyOld; int txtl =0, temparray =0; int samples [5]; unsigned int status [6]; unsigned long timeprevious =0, timeprev =0; // объект EEPROM AT24CX mem; RTC_DS1307 rtc; // (clk, din, dc, ce, rst) LCD5110 lcd (6, 5, 4, 2, 3); // Создаем экземпляр радио чипа RDA5807RDA5807M radio; /// получаем анализатор RDS RDSParser rds; extern unsigned char SmallFont []; extern uint8_t signal5 []; extern uint8_t signal4 []; extern uint8_t signal3 []; extern uint8_t signal2 []; extern uint8_t signal1 []; // -------------------------- НАСТРОЙКА ---- ------------------------------ // void setup () {analogReference (EXTERNAL); Serial.begin (9600); Wire.begin (); // Инициализируем радио. Radio.init (); radio.debugEnable (); // инициализируем экран lcd.InitLCD (); lcd.clrScr (); //lcd.setContrast(45); // корректируем, если значение по умолчанию не подходит lcd.setFont (SmallFont); lcd.enableSleep (); // режим ожидания power_state =0; // не «включать» устройство (режим ожидания) при подключенном питании // инициализировать клавиатуру keypad.addStatedEventListener (keypadEvent); // Добавляем прослушиватель событий для этой клавиатуры keypad.setHoldTime (1500); pinMode (ledPin, ВЫХОД); // Устанавливает цифровой вывод как выходной. pinMode (blPin, ВЫХОД); // Устанавливает цифровой вывод как выходной. digitalWrite (ledPin, LOW); // Выключаем светодиод. digitalWrite (blPin, LOW); // Выключаем BL (режим ожидания) ledPin_state =digitalRead (ledPin); // Сохраняем начальное состояние светодиода. ВЫСОКИЙ, когда горит светодиод. // раскомментируйте, если необходимо настроить rtc / * if (! rtc.isrunning ()) {Serial.println ("RTC НЕ работает!"); // следующая строка устанавливает RTC на дату и время компиляции этого скетча rtc.adjust (DateTime (F (__ DATE__), F (__ TIME__))); // Эта строка устанавливает RTC с явной датой и временем, например, чтобы установить // 21 января 2014 года в 3 часа ночи, вы должны позвонить://rtc.adjust(DateTime(2018, 3, 13, 22, 33, 0) ); } * / // считываем значение последней частоты frequency =mem.readInt (201); объем =2; // уровень громкости в стартовом меню =1; // при запуске показывает режим VOLUMME if (volume <0) volume =0; если (объем> 15) объем =15; если (частота <0) частота =0; если (частота> 210) частота =210; WriteReg (0x02, 0xC00d); // записываем 0xC00d в Reg.2 (мягкий сброс, включение, RDS,) // bbz canal (частота); // настраиваем информационную цепочку для данных RDS. radio.attachReceiveRDS (RDS_process); rds.attachServicenNameCallback (DisplayServiceName); //rds.attachTimeCallback(DisplayTime); // для будущего использования. очень неточно при слабом сигнале RDS. rds.attachTextCallback (DisplayText);} // ----------------------- конец установки -------------- ---------------------- //// ------------------------ --LOOP ---------------------------------------- // void loop () { если (частота! =frequencyOld) {frequencyOld =частота; mem.writeInt (201, частота); канал (частота); } if (volume! =volumeOld) {volumeOld =volume; WriteReg (5, 0x84D0 | объем); } // читаем клавиатуру char key =keypad.getKey (); // проверка данных RDS radio.checkRDS (); // считывает датчик температуры каждые 0,6 сек 5 раз и вычисляет среднее значение поплавка; беззнаковый long timenow =millis (); если ((длинное без знака) (timenow - timeprevious)> 600) {timeprevious =timenow; образцы [temparray] =analogRead (A7); temparray ++; } if (temparray ==5) {// вычисление среднего из показаний average =0; для (int я =0; я <5; я ++) {среднее + =образцы [я]; } printTemp (в среднем); временный массив =0; } // Тайм-аут 4 секунды для отображения MEM и ввод беззнакового long dabar =millis (); если (mempress ==1) {timeprev =dabar; memdisplay =1; mempress =0; } if (memdisplay ==1) {if ((длинное без знака) (dabar - timeprev) <4000) {memdisplay =1; } еще {memdisplay =0; }} / * Инструкции по настройке времени:1. Запустите последовательный монитор 2. Установите 9600 boud 3. Нажмите Enter, чтобы активировать последовательное чтение 4. Напишите hXX, где XX - текущее показание часов на каком-то сервере времени, и нажмите Enter, чтобы настроить часы RTC. Последовательный монитор должен написать «Hours XX» 5. Напишите mXX, где XX - текущие считанные минуты на каком-то сервере времени, и нажмите Enter, чтобы настроить минуты RTC. Последовательный монитор должен написать «Minutes XX» 6. Запишите sXX, где XX - текущее значение секунд, показанное на каком-то сервере времени, и нажмите Enter, чтобы настроить секунды RTC. На серийном мониторе должно быть написано «Секунды XX» 7. Настроить можно только часы. Т.е. когда было изменено летнее время. 8. Вы можете отрегулировать только секунды, если вам нужно только скорректировать время. 9. Если необходимо отрегулировать RTC с нуля (год, месяц, день и т. Д.), Раскомментируйте строки отчета о корректировке RTC и загрузите эскиз. * / DateTime now =rtc.now (); если (Serial.available ()> 0) {char t =Serial.read (); переключатель (t) {case ('h'):{unsigned int hours =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), часы, now.minute (), now.second ())); Serial.println (F («Часы»)); Serial.println (часы); ломать; } case ('m'):{беззнаковое int mins =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour (), mins, now.second ())); Serial.println (F («Минуты»)); Serial.println (мин); ломать; } case ('s'):{unsigned int sec =Serial.parseInt (); rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour (), now.minute (), sec)); Serial.println (F («Секунды»)); Serial.println (сек); ломать; }}} // выводим различную информацию на ЖКИ printSignalStrength (); printLines (); printTime (); printFreq (); printStereo (); printMode (); printMenu (); Дата печати(); lcd.update ();} // ------------------------ Конец цикла -------------- ---------------------- // void printSignalStrength () // от 0000 до 1111 (0-63) {unsigned int sig; Readstatus (); sig =статус [1] / 1000; если ((sig> =0) &&(sig <=12)) {lcd.drawBitmap (1, 1, signal1, 17, 6); } если ((sig> =13) &&(sig <=24)) {lcd.drawBitmap (1, 1, signal2, 17, 6); } если ((сиг> =25) &&(сиг <=36)) {lcd.drawBitmap (1, 1, signal3, 17, 6); } если ((сиг> =37) &&(сиг <=48)) {lcd.drawBitmap (1, 1, signal4, 17, 6); } если (sig> =49) {lcd.drawBitmap (1, 1, signal5, 17, 6); }} void printLines () {lcd.drawLine (0, 9, 84, 9); lcd.drawLine (0, 39, 84, 39);} void printTemp (float average) // можно оптимизировать :) {average / =5; средний =1023 / средний - 1; средний =51700 / средний; float steinhart; steinhart =средний / 50000; // (R / Ro) steinhart =log (steinhart); // ln (R / Ro) steinhart / =3950; // 1 / B * ln (R / Ro) steinhart + =1.0 / (25 + 273.15); // + (1 / To) steinhart =1.0 / steinhart; // инвертировать steinhart - =273.15; // преобразование по Цельсию int tmp =round (steinhart); lcd.printNumI (tmp, 60, 1, 2); lcd.print (F ("~ C"), 72, 1);} /// Обновите текст ServiceName на ЖК-дисплее в режиме RDS. избегайте DisplayServiceName (char * name) {lcd.print (name, 18, 22);} void DisplayText (char * text) {// прокручиваем вторую строку RDS lcd.print (text, txtl, 30); txtl =txtl - 66; если (txtl ==-396) txtl =0;} void printTime () {DateTime now =rtc.now (); lcd.printNumI (now.hour (), 24, 1, 2, '0'); lcd.print (":", 36, 1); lcd.printNumI (now.minute (), 42, 1, 2, '0');} void printDate () {if (dspl ==1) {// проверяет, была ли нажата клавиша дисплея ClearRDS (); DateTime now =rtc.now (); lcd.printNumI (now.year (), 12, 22, 4); lcd.print (".", 36, 22); lcd.printNumI (now.month (), 42, 22, 2, '0'); lcd.print (".", 54, 22); lcd.printNumI (now.day (), 60, 22, 2, '0'); int dw =now.dayOfTheWeek (); переключатель (dw) {case 0:lcd.print (F ("Sekmadienis"), CENTER, 30); // воскресный макрос F () для сохранения SDRAM break; корпус 1:lcd.print (F («Пирмадиенис»), ЦЕНТР, 30); // понедельник и т.д ... break; корпус 2:lcd.print (F («Антрадиенис»), ЦЕНТР, 30); ломать; корпус 3:lcd.print (F ("Treciadienis"), ЦЕНТР, 30); ломать; корпус 4:lcd.print (Ф ("Кетвиртадиенис"), ЦЕНТР, 30); ломать; корпус 5:lcd.print (F ("Penktadienis"), ЦЕНТР, 30); ломать; корпус 6:lcd.print (F ("Sestadienis"), ЦЕНТР, 30); ломать; } lcd.update (); задержка (4000); // не оптимально ClearRDS (); dspl =0; }} void printMode () {lcd.print (F ("MODE"), 0, 41);} void printMenu () {if (menu ==1) {lcd.print (F ("VOLUME"), 30, 41); если (объем <0) {lcd.print (F ("XX"), 72, 41); } else lcd.printNumI (volume + 1, 72, 41, 2, '0'); } if (menu ==2) {lcd.print (F ("АВТОМАТИЧЕСКАЯ НАСТРОЙКА"), 30, 41); } if (menu ==3) {lcd.print (F ("MAN.-TUNE"), 30, 41); } if (menu ==4) {lcd.print (F ("БАС"), 30, 41); если (бас ==0) {lcd.print (F ("ВЫКЛ"), 66, 41); } else lcd.print (F ("ВКЛ"), 66, 41); }} void printFreq () // отображает текущую частоту {int frHundr, frDec; беззнаковый int fr; fr =870 + частота; frHundr =fr / 10; frDec =fr% 10; lcd.printNumI (frHundr, 30, 12, 3); lcd.print (F ("."), 48, 12); lcd.printNumI (frDec, 54, 12, 1); lcd.print (F ("MHz"), 66, 12);} void printStereo () {if (memdisplay ==1) {// если была нажата клавиша MEM lcd.print (F ("MEM>"), 0 , 12); } // Обнаружение стерео else if ((status [0] &0x0400) ==0) lcd.print (F ("()"), 0, 12); // означает МОНО else lcd.print (F ("(ST)"), 0, 12); // означает СТЕРЕО} поиск пустых (byte direc) // автоматический поиск {byte i; // ищем вверх или вниз if (! direc) WriteReg (0x02, 0xC30d); иначе WriteReg (0x02, 0xC10d); для (я =0; я <10; я ++) {задержка (200); Readstatus (); если (статус [0] &0x4000) {частота =статус [0] &0x03ff; ломать; }}} void canal (int canal) // прямая частота {byte numberH, numberL; numberH =канал>> 2; numberL =((канал &3) <<6 | 0x10); Wire.beginTransmission (0x11); Wire.write (0x03); Wire.write (числоH); // записываем частоту в биты 15:6, устанавливаем бит настройки Wire.write (numberL); Wire.endTransmission ();} // RDA5807_adrs =0x10; // Чип RDA с адресом I2C для последовательного доступа Readstatus () {Wire.requestFrom (0x10, 12); для (int я =0; я <6; я ++) {статус [я] =256 * Wire.read () + Wire.read (); } Wire.endTransmission ();} // RDA5807_adrr =0x11; // Чип RDA с I2C-адресом для произвольного доступа к записи WriteReg (byte reg, unsigned int valor) {Wire.beginTransmission (0x11); Wire.write (рег); Wire.write (доблесть>> 8); Wire.write (доблесть &0xFF); Wire.endTransmission (); // delay (50);} void RDS_process (uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData (block1, block2, block3, block4);} void ClearRDS () {lcd.print ("", 0, 22); lcd.print ("", 0, 30);} // Заботимся о некоторых особых событиях. избегайте keypadEvent (KeypadEvent key, KeyState kpadState) {switch (kpadState) {/ * Другой способ изменить время:1. Нажмите и удерживайте нажмите D и удерживайте не менее 2 секунд, когда вы услышите сигналы времени окончания часа или увидите последние часовые секунды на некоторых точных часах. 2. Отпустите кнопку D, чтобы настроить чч.00.00. 3. После корректировки, если ваши часы опоздали с 15 до 1 минуты, минуты и секунды будут 00, а часы будут увеличены на 1. 4. Если ваши часы торопятся с 1 до 15 минут, только минуты и секунды будут 00. . * / case HOLD:if (key =='D' &&power_state ==1) {adj =1; } ломать; case ВЫПУЩЕН:if (key =='D' &&adj ==1) {DateTime now =rtc.now (); if (now.minute ()> =45 &&now.minute () <=59) {rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour () + 1, 0, 0)); } if (now.minute ()> =1 &&now.minute () <=15) {rtc.adjust (DateTime (now.year (), now.month (), now.day (), now.hour ( ), 0, 0)); } adj =0; } ломать; case НАЖАТИЕ:if (key =='M' &&power_state ==1) {memdisplay =0; меню ++; если (меню> MAXmenu) menu =1; } если (ключ =='>' &&power_state ==1) {memdisplay =0; переключатель (меню) {случай 1:if (volume <0) {if (bass ==0) {WriteReg (0x02, 0xD00D); объем =0; } если (бас ==1) {WriteReg (0x02, 0xC00D); объем =0; }} else volume ++; если (объем> 15) объем =15; ломать; случай 2:поиск (0); ClearRDS (); ломать; случай 3:частота ++; если (частота> 210) частота =210; // верхний предел частоты ClearRDS (); ломать; случай 4:если (бас ==0) {бас =1; WriteReg (0x02, 0xD00D); } ломать; }} если (ключ =='<' &&power_state ==1) {memdisplay =0; переключатель (меню) {case 1:volume--; если (объем <0) {WriteReg (0x02, 0x800D); // объем =0; } ломать; случай 2:поиск (1); ClearRDS (); ломать; случай 3:частота--; если (частота <0) частота =0; ClearRDS (); ломать; случай 4:if (bass ==1) {bass =0; WriteReg (0x02, 0xC00D); } ломать; }} // светодиод горит / гаснет if (key =='L' &&power_state ==1) {digitalWrite (ledPin,! DigitalRead (ledPin)); ledPin_state =digitalRead (ledPin); // Запомните состояние светодиода, горит он или нет. } // включает или выключает "питание" (режим ожидания) if (key =='P') {digitalWrite (blPin,! digitalRead (blPin)); power_state =digitalRead (blPin); если (power_state ==0) {lcd.enableSleep (); digitalWrite (ledPin, LOW); } еще lcd.disableSleep (); объем =2; menu =1; } if (key =='1' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (110); ClearRDS (); ломать; случай 1:mem.writeInt (110, частота); memdisplay =0; ломать; }} if (key =='2' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (120); ClearRDS (); ломать; случай 1:mem.writeInt (120, частота); memdisplay =0; ломать; }} if (key =='3' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (130); ClearRDS (); ломать; случай 1:mem.writeInt (130, частота); memdisplay =0; ломать; }} if (key =='4' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (140); ClearRDS (); ломать; случай 1:mem.writeInt (140, частота); memdisplay =0; ломать; }} if (key =='5' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (150); ClearRDS (); ломать; случай 1:mem.writeInt (150, частота); memdisplay =0; ломать; }} if (key =='6' &&power_state ==1) {переключатель (memdisplay) {case 0:frequency =mem.readInt (160); ClearRDS (); ломать; случай 1:mem.writeInt (160, частота); memdisplay =0; ломать; }} if (key =='m' &&power_state ==1) {mempress =1; } еще {mempress =0; } если (ключ =='I' &&power_state ==1) {dspl =1; } ломать; }} 
Символы силы сигнала C / C ++
 #if defined (__ AVR__) #include  #define imagedatatype const uint8_t # elif defined (__ PIC32MX__) #define PROGMEM #define imagedatatype const unsigned char # elif defined (__ armaged__) #EMdefine PROG const unsigned char # endifimagedatatype signal5 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0x10, 0xFC, 0xC0, 16xFC) ,}; imagedatatype signal4 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0x0, пикселей, 0x0C0 (пикселей) }; imagedatatype signal3 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xF8, 0xC0, 0xC0, 0x0C0 (пикселей), 0x0C0 (пикселей); imagedatatype signal2 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0C0 (// пикселей) imagedatatype signal1 [] PROGMEM ={0xC1, 0xC2, 0xC4, 0xFF, 0xC4, 0xC2, 0xC1, 0xC0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, // 0x0010 (16) пикселей0xC0,}; 

Схема


Производственный процесс

  1. Радио
  2. Интегральная схема
  3. Генератор волн JX
  4. MotionSense
  5. PuzzleBox
  6. Регулятор душа
  7. Беспроводной ИК-сканер температуры
  8. Танк WalaBeer
  9. Лаборатория микроконтроллеров
  10. MOSMusic