Форум

Радиолюбительский форум.

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

В сети

Пользователей: 190
Из них просматривают:
Аналоги: 77. Видео: 4. Даташиты: 58. Инструкции: 7. Новости: 14. Остальное: 1. Производители: 3. Профиль пользователя: 5. Теги: 2. Форум: 18. Чат: 1.
Участников: 3
Гостей: 187

an , Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.

Просмотр этой темы: 

 1 анонимных пользователей
Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Забавный пример случайных предсказаний, по принципу "Хрустальный шар"! Игра состоит в том, что вы задаёте вопрос, затем нажимаете кнопку и дисплей выдаёт вам один из нескольких случайных ответов.
/*
Пример стартового комплекта Arduino
   Проект 11 - Хрустальный шар

   Этот эскиз написан для сопровождения проекта 11 в стартовом наборе Arduino.

   Требуемые детали:
   - резистор 220 Ом
   - резистор 10 кОм
   - потенциометр 10 кОм
   - ЖК-экран 16x2
   - переключатель наклона

   Создано 13 сентября 2012 г.
   Скотт Фицджеральд

   http://www.arduino.cc/starterKit

   Этот пример кода является частью общественного достояния.
*/

// подключаем библиотеку ЖК-дисплея:
#include <LiquidCrystal.h>

// инициализировать библиотеку с номерами контактов интерфейса
LiquidCrystal lcd(12115432);

// установить константу для контакта переключателя наклона
const int switchPin 6;

// переменная для хранения значения контакта переключателя
int switchState 0;

// переменная для хранения предыдущего значения контакта переключателя
int prevSwitchState 0;

// переменная для выбора ответа от хрустального шара
int reply;

void setup() {
  
// настроить количество столбцов и строк на ЖК-дисплее
  
lcd.begin(162);

  
// настроить контакт переключателя как вход
  
pinMode(switchPinINPUT);

  
// Распечатайте сообщение на ЖК-дисплее.
  
lcd.print("CnPOCu");
  
// установите курсор в столбец 0, строку 1
  // строка 1 - вторая строка, так как отсчет начинается с 0
  
lcd.setCursor(01);
  
// печать во вторую строку
  
lcd.print("XPyCTA^HbIu WAP!");
}

void loop() {
  
// проверить состояние переключателя
  
switchState digitalRead(switchPin);

  
// сравнить состояние переключателя с его предыдущим состоянием
  
if (switchState != prevSwitchState) {
    
// если состояние изменилось с ВЫСОКОЕ на НИЗКОЕ, вы знаете, 
    // что шар наклонился из одного направления в другое.
    
if (switchState == LOW) {
      
// выбрать случайный ответ
      
reply random(8);
      
// очистить экран перед печатью нового ответа
      
lcd.clear();
      
// установите курсор в столбец 0, строку 0
      
lcd.setCursor(00);
      
// напечатать текст
      
lcd.print("WAP rOBOPuT:");
      
// перемещение курсора на вторую строку
      
lcd.setCursor(01);

      
// выбрать изречение для печати на основе значения в ответе
      
switch (reply) {
        case 
0:
          
lcd.print("gA");
          break;

        case 
1:
          
lcd.print("BEPORTHO");
          break;

        case 
2:
          
lcd.print("6E3yC^OBHO");
          break;

        case 
3:
          
lcd.print("nPOrHO3 XOPOWuu");
          break;

        case 
4:
          
lcd.print("HEyBEPEHblu");
          break;

        case 
5:
          
lcd.print("CnPOCu EWE PA3");
          break;

        case 
6:
          
lcd.print("COMHuTEJlHblu");
          break;

        case 
7:
          
lcd.print("HET");
          break;
      }
    }
  }
  
// сохранить текущее состояние переключателя как последнее состояние
  
prevSwitchState switchState;
}

Прикреплённый файл:



gif  p11_CrystalBall.gif (23.72 KB)
290_609add0cc46f2.gif 910X739 px
zip p11_CrystalBall.zip Размер: 43.90 KB; Просмотры: 272



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Пример песочных часов. Здесь используется датчик наклона или просто переключатель. Когда на часы подаётся питание, то начинается десятиминутный отсчёт, после чего загорается светодиод, затем через 10 минут второй светодиод и так за час последовательно загорятся все шесть светодиодов. Если "перевернуть песочные часы", то есть поменять положение датчика наклона или переключатель на противоположное, светодиоды одновременно погаснут и отсчёт времени вновь повториться в той же последовательности.
Для реальных физических часов нужно строку в коде:
long interval 600// интервал, через который загорается следующий светодиод

Заменить на:
long interval 600000// интервал, через который загорается следующий светодиод

В архиве есть два файла hex: p08_DigitalHourglass(normal).ino.hex - для реальных часов, p08_DigitalHourglass.ino.hex - для ускоренной демонстрации в симуляторе Proteus, чтобы не ждать 10 минут пока загорится первый светодиод.
/*
  Пример стартового комплекта Arduino
   Проект 8 - Цифровые песочные часы

   Этот эскиз написан для сопровождения проекта 8 в стартовом наборе Arduino.

   Требуемые детали:
   - резистор 10 кОм
   - шесть резисторов 220 Ом
   - шесть светодиодов
   - переключатель наклона

   Создано 13 сентября 2012 г.
   Скотт Фицджеральд

  http://www.arduino.cc/starterKit

 Этот пример кода является частью общественного достояния.
*/

// присвоение константы для вывода переключателя
const int switchPin 8;

unsigned long previousTime 0// сохранить время последнего обновления светодиода
int switchState 0// текущее состояние переключателя
int prevSwitchState 0// предыдущее состояние переключателя
int led 2// переменная для ссылки на светодиоды

// 600000 = 10 минут в миллисекундах
long interval 600// интервал, через который загорается следующий светодиод

void setup() {
  
// установка контактов светодиодов как выходы
  
for (int x 28x++) {
    
pinMode(xOUTPUT);
  }
  
// установить контакт переключателя наклона как вход
  
pinMode(switchPinINPUT);
}

void loop() {
  
// сохранить время с момента запуска Arduino в переменной
  
unsigned long currentTime millis();

  
// сравнить текущее время с предыдущим включением светодиода, 
  // если оно больше, чем ваш интервал, запустить оператор if
  
if (currentTime previousTime interval) {
    
// сохранить текущее время как последний раз, когда вы меняли светодиод
    
previousTime currentTime;
    
// Включить светодиод
    
digitalWrite(ledHIGH);
    
// увеличить значение переменной светодиода на 10 минут, 
    // следующий светодиод загорится
    
led++;

    if (
led == 7) {
      
// прошёл час
    
}
  }

  
// прочитать значение переключателя
  
switchState digitalRead(switchPin);

  
// если переключатель изменился
  
if (switchState != prevSwitchState) {
    
// выключить все светодиоды
    
for (int x 28x++) {
      
digitalWrite(xLOW);
    }

    
// сбросить переменную светодиода на первую
    
led 2;

    
//сбросить таймер
    
previousTime currentTime;
  }
  
// установить предыдущее состояние переключателя в текущее состояние
  
prevSwitchState switchState;
}

Прикреплённый файл:



gif  p08_DigitalHourglass.gif (24.67 KB)
290_609af9dda40aa.gif 1105X638 px
zip p08_DigitalHourglass.zip Размер: 44.30 KB; Просмотры: 247



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Это симуляция работы метеостанции, которая описана в теме на форуме.
Скорость ветра отображается спустя минуту, за то время, которое необходимо вычислить программе исходя из разрозненных поступающих данных. Реакция дисплея и светодиодов на температуру и влажность происходит без задержки. Скорость ветра можно менять согласно таблице, что рядом с генератором импульсов (в реальности датчик Холла).
#include <LiquidCrystalRus.h>
#include "DHT_NEW.h"
DHT _dht1;

LiquidCrystalRus disp(6791045);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;

int _disp23oldLength 0;
int _disp6oldLength 0;
int _disp8oldLength 0;
int _disp15oldLength 0;
unsigned long _SCT_2 0UL;
unsigned long _SCT_2IC 0UL;
unsigned long _SCT_2P 0UL;
int _disp18oldLength 0;
int _disp21oldLength 0;
unsigned long _dht1LRT 0UL;
unsigned long _dht1Tti 0UL;
int _disp30oldLength 0;
int _disp20oldLength 0;
int _disp24oldLength 0;
int _BytesToWord_3_Out 0;
bool _gen5I 0;
bool _gen5O 0;
unsigned long _gen5P 0UL;
bool _gen4I 0;
bool _gen4O 0;
unsigned long _gen4P 0UL;
int _disp22oldLength 0;
int _disp2oldLength 0;
int _disp27oldLength 0;
int _disp5oldLength 0;
int _disp10oldLength 0;
int _disp25oldLength 0;
int _disp3oldLength 0;
int _disp1oldLength 0;
int _disp29oldLength 0;
int _disp32oldLength 0;
int _BytesToWord_1_Out 0;
bool _gen2I 0;
bool _gen2O 0;
unsigned long _gen2P 0UL;
int _disp28oldLength 0;
int _disp4oldLength 0;
int _disp7oldLength 0;
int _disp9oldLength 0;
int _disp12oldLength 0;
int _disp17oldLength 0;
bool _gen1I 0;
bool _gen1O 0;
unsigned long _gen1P 0UL;
int _disp11oldLength 0;
int _disp14oldLength 0;
int _disp26oldLength 0;
int _disp31oldLength 0;
bool _gen3I 0;
bool _gen3O 0;
unsigned long _gen3P 0UL;
int _disp13oldLength 0;
int _disp19oldLength 0;
void setup()
{
pinMode(16OUTPUT); 
pinMode(11OUTPUT); 
pinMode(12OUTPUT); 
pinMode(19OUTPUT); 
pinMode(13OUTPUT); 

disp.begin(204);
pinMode(2INPUT);
_SCT_2P=micros();
attachInterruptdigitalPinToInterrupt (2), _SCT_2coutFunctionFALLING);
_dht1.setup(8);
_dht1LRT millis();
_dht1Tti millis(); 
}
void loop()
{if (
_isNeedClearDisp1) {disp.clear(); _isNeedClearDisp10;}





//Плата:1
//Наименование:Метеостанция
//Комментарии:http://radio-hobby.org
if (!(0)) {
_dispTempLength1 = (String("METOCTAHuR v1.01")).length();
if (
_disp2oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp2oldLength _dispTempLength1;
disp.setCursor(00);
disp.print(String("METOCTAHuR v1.01"));
} else {
if (
_disp2oldLength 0) {_isNeedClearDisp1 1_disp2oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = (String("C")).length();
if (
_disp26oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp26oldLength _dispTempLength1;
disp.setCursor(41);
disp.print(String("C"));
} else {
if (
_disp26oldLength 0) {_isNeedClearDisp1 1_disp26oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = (String("t:")).length();
if (
_disp1oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp1oldLength _dispTempLength1;
disp.setCursor(01);
disp.print(String("t:"));
} else {
if (
_disp1oldLength 0) {_isNeedClearDisp1 1_disp1oldLength 0;} 
}
if(
_isTimer(_dht1Tti1000)) {
if(
_isTimer(_dht1LRT,( _dht1.getMinimumSamplingPeriod()))) {
_dht1.readSensor();
_dht1LRT millis(); 
_dht1Tti millis(); 
}
}
if (!(
0)) {
_dispTempLength1 = ((( _floatToStringWitRaz(_dht1.humidity,0)))).length();
if (
_disp17oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp17oldLength _dispTempLength1;
disp.setCursor(22);
disp.print((( _floatToStringWitRaz(_dht1.humidity,0))));
} else {
if (
_disp17oldLength 0) {_isNeedClearDisp1 1_disp17oldLength 0;} 
}
_BytesToWord_3_Out word(0_dht1.humidity);
if ((
_BytesToWord_3_Out) >= (70)) {
_dispTempLength1 = (String("B^A*HO")).length();
if (
_disp7oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp7oldLength _dispTempLength1;
disp.setCursor(62);
disp.print(String("B^A*HO"));
} else {
if (
_disp7oldLength 0) {_isNeedClearDisp1 1_disp7oldLength 0;} 
}
if (( ((
_BytesToWord_3_Out) >= (40)) && ((_BytesToWord_3_Out) < (70)) )) {
_dispTempLength1 = (String("HOPMA")).length();
if (
_disp6oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp6oldLength _dispTempLength1;
disp.setCursor(62);
disp.print(String("HOPMA"));
} else {
if (
_disp6oldLength 0) {_isNeedClearDisp1 1_disp6oldLength 0;} 
}
if ((
_BytesToWord_3_Out) < (40)) {
_dispTempLength1 = (String("CyXO")).length();
if (
_disp5oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp5oldLength _dispTempLength1;
disp.setCursor(62);
disp.print(String("CyXO"));
} else {
if (
_disp5oldLength 0) {_isNeedClearDisp1 1_disp5oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = ((( _floatToStringWitRaz(_dht1.temperature,0)))).length();
if (
_disp3oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp3oldLength _dispTempLength1;
disp.setCursor(21);
disp.print((( _floatToStringWitRaz(_dht1.temperature,0))));
} else {
if (
_disp3oldLength 0) {_isNeedClearDisp1 1_disp3oldLength 0;} 
}
_BytesToWord_1_Out word(0_dht1.temperature);
digitalWrite(19, ( ((_BytesToWord_1_Out) >= (20)) && ((_BytesToWord_1_Out) < (25)) ));
if (( ((
_BytesToWord_1_Out) >= (20)) && ((_BytesToWord_1_Out) < (25)) )) {
_dispTempLength1 = (String("TEn^O")).length();
if (
_disp12oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp12oldLength _dispTempLength1;
disp.setCursor(61);
disp.print(String("TEn^O"));
} else {
if (
_disp12oldLength 0) {_isNeedClearDisp1 1_disp12oldLength 0;} 
}
digitalWrite(12, ( ((_BytesToWord_1_Out) >= (15)) && ((_BytesToWord_1_Out) < (20)) ));
if (( ((
_BytesToWord_1_Out) >= (15)) && ((_BytesToWord_1_Out) < (20)) )) {
_dispTempLength1 = (String("KOMqOPTHO")).length();
if (
_disp11oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp11oldLength _dispTempLength1;
disp.setCursor(61);
disp.print(String("KOMqOPTHO"));
} else {
if (
_disp11oldLength 0) {_isNeedClearDisp1 1_disp11oldLength 0;} 
}
if ((
_BytesToWord_1_Out) >= (25)) {
_dispTempLength1 = (String("*APKO")).length();
if (
_disp10oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp10oldLength _dispTempLength1;
disp.setCursor(61);
disp.print(String("*APKO"));
} else {
if (
_disp10oldLength 0) {_isNeedClearDisp1 1_disp10oldLength 0;} 
}
if ((
_BytesToWord_1_Out) >= (25)) { if (! _gen2I) { _gen2I 1_gen2O 1_gen2P millis(); } } else { _gen2I _gen2O0;}
 if (
_gen2I) {  if ( _isTimer _gen2P 500 )) { _gen2P millis(); _gen2O = ! _gen2O;}}
digitalWrite(19_gen2O);
digitalWrite(11, ( ((_BytesToWord_1_Out) >= (10)) && ((_BytesToWord_1_Out) < (15)) ));
if (( ((
_BytesToWord_1_Out) >= (10)) && ((_BytesToWord_1_Out) < (15)) )) {
_dispTempLength1 = (String("nPOX^AgHO")).length();
if (
_disp9oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp9oldLength _dispTempLength1;
disp.setCursor(61);
disp.print(String("nPOX^AgHO"));
} else {
if (
_disp9oldLength 0) {_isNeedClearDisp1 1_disp9oldLength 0;} 
}
if ((
_BytesToWord_1_Out) < (10)) {
_dispTempLength1 = (String("XO^OgHO")).length();
if (
_disp8oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp8oldLength _dispTempLength1;
disp.setCursor(61);
disp.print(String("XO^OgHO"));
} else {
if (
_disp8oldLength 0) {_isNeedClearDisp1 1_disp8oldLength 0;} 
}
if ((
_BytesToWord_1_Out) < (10)) { if (! _gen1I) { _gen1I 1_gen1O 1_gen1P millis(); } } else { _gen1I _gen1O0;}
 if (
_gen1I) {  if ( _isTimer _gen1P 500 )) { _gen1P millis(); _gen1O = ! _gen1O;}}
digitalWrite(11_gen1O);
if (!(
0)) {
_dispTempLength1 = (String("%")).length();
if (
_disp23oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp23oldLength _dispTempLength1;
disp.setCursor(42);
disp.print(String("%"));
} else {
if (
_disp23oldLength 0) {_isNeedClearDisp1 1_disp23oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = (String("h:")).length();
if (
_disp4oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp4oldLength _dispTempLength1;
disp.setCursor(02);
disp.print(String("h:"));
} else {
if (
_disp4oldLength 0) {_isNeedClearDisp1 1_disp4oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = (String("M/c")).length();
if (
_disp15oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp15oldLength _dispTempLength1;
disp.setCursor(43);
disp.print(String("M/c"));
} else {
if (
_disp15oldLength 0) {_isNeedClearDisp1 1_disp15oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = (String("v:")).length();
if (
_disp32oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp32oldLength _dispTempLength1;
disp.setCursor(03);
disp.print(String("v:"));
} else {
if (
_disp32oldLength 0) {_isNeedClearDisp1 1_disp32oldLength 0;} 
}
if((( 
micros()-_SCT_2P) >60000000)||(( micros()-_SCT_2P) <0)){_SCT_2 _SCT_2IC;_SCT_2IC=0;_SCT_2P micros();}
if ((((
3.00)*(_SCT_2))/(60)) > (10.7)) { if (! _gen5I) { _gen5I 1_gen5O 1_gen5P millis(); } } else { _gen5I _gen5O0;}
 if (
_gen5I) {  if ( _isTimer _gen5P 250 )) { _gen5P millis(); _gen5O = ! _gen5O;}}
digitalWrite(13_gen5O);
if ((((
3.00)*(_SCT_2))/(60)) > (24.00)) {if (! _gen4I){_gen4I 1_gen4O 1_gen4P millis();}} else { _gen4I _gen4O0; } if (_gen4I &&  _gen4O)   _gen4O = !( _isTimer_gen4P 15000 ));
if (
_gen4O) { if (! _gen3I) { _gen3I 1_gen3O 1_gen3P millis(); } } else { _gen3I _gen3O0;}
 if (
_gen3I) {  if ( _isTimer _gen3P 250 )) { _gen3P millis(); _gen3O = ! _gen3O;}}
digitalWrite(16_gen3O);
if ((((
3.00)*(_SCT_2))/(60)) > (32.6)) {
_dispTempLength1 = (String("yPArAH")).length();
if (
_disp30oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp30oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("yPArAH"));
} else {
if (
_disp30oldLength 0) {_isNeedClearDisp1 1_disp30oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (28.4)) && ((((3.00)*(_SCT_2))/(60)) <= (32.6)) )) {
_dispTempLength1 = (String("6yPR")).length();
if (
_disp29oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp29oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("6yPR"));
} else {
if (
_disp29oldLength 0) {_isNeedClearDisp1 1_disp29oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (24.4)) && ((((3.00)*(_SCT_2))/(60)) <= (28.4)) )) {
_dispTempLength1 = (String("WKBA^")).length();
if (
_disp28oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp28oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("WKBA^"));
} else {
if (
_disp28oldLength 0) {_isNeedClearDisp1 1_disp28oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (20.7)) && ((((3.00)*(_SCT_2))/(60)) <= (24.4)) )) {
_dispTempLength1 = (String("WTOPM")).length();
if (
_disp27oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp27oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("WTOPM"));
} else {
if (
_disp27oldLength 0) {_isNeedClearDisp1 1_disp27oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (17.1)) && ((((3.00)*(_SCT_2))/(60)) <= (20.7)) )) {
_dispTempLength1 = (String("CEPguTblu")).length();
if (
_disp25oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp25oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("CEPguTblu"));
} else {
if (
_disp25oldLength 0) {_isNeedClearDisp1 1_disp25oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (13.8)) && ((((3.00)*(_SCT_2))/(60)) <= (17.1)) )) {
_dispTempLength1 = (String("KPEnKuu")).length();
if (
_disp24oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp24oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("KPEnKuu"));
} else {
if (
_disp24oldLength 0) {_isNeedClearDisp1 1_disp24oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (10.7)) && ((((3.00)*(_SCT_2))/(60)) <= (13.8)) )) {
_dispTempLength1 = (String("Cu^Hblu")).length();
if (
_disp22oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp22oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("Cu^Hblu"));
} else {
if (
_disp22oldLength 0) {_isNeedClearDisp1 1_disp22oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (7.9)) && ((((3.00)*(_SCT_2))/(60)) <= (10.7)) )) {
_dispTempLength1 = (String("CBE*uu")).length();
if (
_disp21oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp21oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("CBE*uu"));
} else {
if (
_disp21oldLength 0) {_isNeedClearDisp1 1_disp21oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (5.4)) && ((((3.00)*(_SCT_2))/(60)) <= (7.9)) )) {
_dispTempLength1 = (String("yMEPEHHblu")).length();
if (
_disp20oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp20oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("yMEPEHHblu"));
} else {
if (
_disp20oldLength 0) {_isNeedClearDisp1 1_disp20oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (3.3)) && ((((3.00)*(_SCT_2))/(60)) <= (5.4)) )) {
_dispTempLength1 = (String("C^A6blu")).length();
if (
_disp19oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp19oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("C^A6blu"));
} else {
if (
_disp19oldLength 0) {_isNeedClearDisp1 1_disp19oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (1.5)) && ((((3.00)*(_SCT_2))/(60)) <= (3.3)) )) {
_dispTempLength1 = (String("^ErKuu")).length();
if (
_disp18oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp18oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("^ErKuu"));
} else {
if (
_disp18oldLength 0) {_isNeedClearDisp1 1_disp18oldLength 0;} 
}
if (( ((((
3.00)*(_SCT_2))/(60)) > (0.2)) && ((((3.00)*(_SCT_2))/(60)) <= (1.5)) )) {
_dispTempLength1 = (String("TuXuu")).length();
if (
_disp14oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp14oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("TuXuu"));
} else {
if (
_disp14oldLength 0) {_isNeedClearDisp1 1_disp14oldLength 0;} 
}
if ((((
3.00)*(_SCT_2))/(60)) <= (0.2)) {
_dispTempLength1 = (String("WTu^b")).length();
if (
_disp13oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp13oldLength _dispTempLength1;
disp.setCursor(83);
disp.print(String("WTu^b"));
} else {
if (
_disp13oldLength 0) {_isNeedClearDisp1 1_disp13oldLength 0;} 
}
if (!(
0)) {
_dispTempLength1 = ((( _floatToStringWitRaz(((3.00)*(_SCT_2))/(60),0)))).length();
if (
_disp31oldLength _dispTempLength1) {_isNeedClearDisp1 1;} 
_disp31oldLength _dispTempLength1;
disp.setCursor(23);
disp.print((( _floatToStringWitRaz(((3.00)*(_SCT_2))/(60),0))));
} else {
if (
_disp31oldLength 0) {_isNeedClearDisp1 1_disp31oldLength 0;} 
}




}
String  _floatToStringWitRaz(float valueint raz)
{
 
  return 
String(value,raz);
}
bool _isTimer(unsigned long startTimeunsigned long period )
  {
  
unsigned long currentTime;
currentTime millis();
if (
currentTime>= startTime) {return (currentTime>=(startTime period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
 
void  _SCT_2coutFunction()
_SCT_2IC++;
}

Прикреплённый файл:



gif  Meteostancija.gif (46.85 KB)
290_609bea8e3ff3c.gif 1512X1082 px
zip Meteostancija.zip Размер: 84.43 KB; Просмотры: 260



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Интересный пример плавного изменение цвета RGB светодиода в зависимости от состояния некоего датчика, подключенного к аналоговому входу 3 написал МАСТЕР в своей статье. Попробуем его повторить в симуляторе. В итоге цвета прекрасно смешиваются.
// Плавное изменение цвета RGB ленты в зависимосчти от некоего датчика,
// подключенного к аналоговому входу 3
// Цвет переходит с синего к красному, через зеленый цвет,
// Промежуточные цвета смешиваются.
// В зависимости от датчика, начальное и конечное напряжение,
// а точнее, цифровой код напряжения можно указать в переменных

int Pin9 9// красный
int Pin10 10// синий
int Pin11 11// зеленый
int Pin3 3// потенциометр подключен к входу 3
int val 0// переменная для хранения значения
int valbeg 200// начальное значение параметра (0-1023) обычно ближе к нулю
int valend 800// конечное значение параметра (0-1023)ближе к краю
// valbeg должен быть заведомо меньше valend
int pwm 0// переменная для хранения значения шим
float konst = (valend valbeg) / 256.0// Подсчитываем коэффициент
// Данный коэффициент нужен для того, чтоб вписать диапазон в 0-255 для ШИМ

void setup()
{
  
pinMode(Pin9OUTPUT); // установка порта на выход
  
pinMode(Pin10OUTPUT); // установка порта на выход
  
pinMode(Pin11OUTPUT); // установка порта на выход
  
Serial.begin(9600); // открыть последовательный порт
}

void loop()
{
  
val analogRead(Pin3); // считываем значение с порта 3,
  
pwm = (val valbeg) / konst// Полученные данные должны вписаться в 0-255 для вывода

  
if (pwm 0) { pwm 0; }; // если данные меньше, то 0
  
if (pwm 255) { pwm 255; }; // если данные больше, то 255
  // Даже если параметры вышли за пределы, они обрежутся, и будет один из крайних цветов

  
if (pwm 128)
   {
    
analogWrite(Pin10255 pwm 2); //Выводим синий цвет
    
analogWrite(Pin11pwm 2); //Выводим зеленый цвет
    
analogWrite(Pin90); // меньше середины красный не выводим
   
}
  else
   {
    
analogWrite(Pin9pwm 255); //Выводим красный цвет
    
analogWrite(Pin11510 pwm*); //Выводим зеленый цвет
    
analogWrite(Pin100); // дальше середины синий не выводим
  
}
 ;


  
Serial.print(val);
  
Serial.print(" - ");
  
Serial.print(pwm);
  
Serial.print(" - ");
  
Serial.print(konst);
  
Serial.println();
  
delay(100);
}

Прикреплённый файл:



gif  Upravlenie_RGB_LED.gif (16.98 KB)
290_609c4b9f496cf.gif 789X556 px
zip Upravlenie_RGB_LED.zip Размер: 42.75 KB; Просмотры: 257



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Хорошо, когда дисплей уже имеет свой собственный контроллер и подключается к Ардуино, кроме питания, всего по двум проводам SCL и SDA, то есть по так называемой I2C-шине.
Такой вариант подключения дисплея на примере симуляция таймера отключения нагрузки. В автоматическом режиме: с интервалом от 1-го до 24-х часов с возможностью продления времени отключения когда это необходимо. На местном управлении: отключение только вручную.
Также есть возможность:
- сделать сброс набранного интервала времени, чтобы не "идти по кругу" от 1 до 24 часа;
- принудительное отключение, не дожидаясь срабатывания таймера;
- выбор режима работы: "автоматический" и "местное управление";
Информация на дисплее о состоянии коммутационного аппаратуры (в данном случае реле):
- Работа
- Введено в резерв
Дополнительно:
- Знак восклицания и предупреждающий звуковой сигнал за минуту до автоматического отключения.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
LiquidCrystal_I2C _lcd1(0x27162);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool _FreeLog1_IArr[2];
bool _FreeLog1_Q1_StArr[] = {00};
int _gtv6 0;
int _disp10oldLength 0;
int _disp8oldLength 0;
int _disp9oldLength 0;
bool _RTCST_Ost1 0;
int _disp7oldLength 0;
bool _bounseInputD8S 0;
bool _bounseInputD8O 0;
unsigned long _bounseInputD8P 0UL;
int _disp5oldLength 0;
int _disp3oldLength 0;
int _disp6oldLength 0;
int _disp2oldLength 0;
int _disp4oldLength 0;
bool _bounseInputD7S 0;
bool _bounseInputD7O 0;
unsigned long _bounseInputD7P 0UL;
int _disp1oldLength 0;
bool _trgr2 0;
int _disp11oldLength 0;
bool _gen4I 0;
bool _gen4O 0;
unsigned long _gen4P 0UL;
bool _gen1I 0;
bool _gen1O 0;
unsigned long _gen1P 0UL;
bool _bounseInputD4S 0;
bool _bounseInputD4O 0;
unsigned long _bounseInputD4P 0UL;
bool _tim1I 0;
bool _tim1O 0;
unsigned long _tim1P 0UL;
bool _gen2I 0;
bool _gen2O 0;
unsigned long _gen2P 0UL;
bool _RTCAlO2 0;
bool _pzs1OES 0;
bool _count1I 0;
int _count1_Value 0;
bool _trgr1 0;
bool _RTCAlO1 0;
bool _trgr3 0;
bool _FreeLog1_Q1 0;
void setup()
{
    
pinMode(4INPUT_PULLUP);
    
pinMode(7INPUT_PULLUP);
    
pinMode(8INPUT_PULLUP);
    
pinMode(2OUTPUT);
    
digitalWrite(20);
    
pinMode(13OUTPUT);
    
digitalWrite(130);
    
Wire.begin();
    
delay(10);
    
_lcd1.init();
    
_lcd1.backlight();
    
_bounseInputD7O =  digitalRead(7);
    
_bounseInputD4O =  digitalRead(4);
    
_bounseInputD8O =  digitalRead(8);
}
void loop()
{
    if (
_isNeedClearDisp1
    {
        
_lcd1.clear();
        
_isNeedClearDisp10;
    }
    
bool  _bounceInputTmpD7 =  (digitalRead (7));
    if (
_bounseInputD7S)
    {
        if (
millis() >= (_bounseInputD7P 40))
        {
            
_bounseInputD7O_bounceInputTmpD7;
            
_bounseInputD7S=0;
        }
    }
    else
    {
        if (
_bounceInputTmpD7 != _bounseInputD7O)
        {
            
_bounseInputD7S=1;
            
_bounseInputD7P millis();
        }
    }
    
bool  _bounceInputTmpD4 =  (digitalRead (4));
    if (
_bounseInputD4S)
    {
        if (
millis() >= (_bounseInputD4P 40))
        {
            
_bounseInputD4O_bounceInputTmpD4;
            
_bounseInputD4S=0;
        }
    }
    else
    {
        if (
_bounceInputTmpD4 != _bounseInputD4O)
        {
            
_bounseInputD4S=1;
            
_bounseInputD4P millis();
        }
    }
    
bool  _bounceInputTmpD8 =  (digitalRead (8));
    if (
_bounseInputD8S)
    {
        if (
millis() >= (_bounseInputD8P 40))
        {
            
_bounseInputD8O_bounceInputTmpD8;
            
_bounseInputD8S=0;
        }
    }
    else
    {
        if (
_bounceInputTmpD8 != _bounseInputD8O)
        {
            
_bounseInputD8S=1;
            
_bounseInputD8P millis();
        }
    }
    
//Плата:1
//Наименование:Таймер отключения аппаратуры на Arduino UNO
    
if (!(_bounseInputD8O)) 
    {
         if (! 
_gen2I
        {
            
_gen2I 1;
            
_gen2O 1;
            
_gen2P millis();
        }
    }
     else 
    {
        
_gen2I ;
        
_gen2O0;
    }
    if (
_gen2I
    {
          if (
_isTimer (_gen2P 250)) 
        {
             
_gen2P millis();
            
_gen2O = ! _gen2O;
        }
    }
    if (
1
    {
        if (! 
_gen4I)
        {
            
_gen4I 1;
            
_gen4O 1;
            
_gen4P millis();
        }
    }
     else 
    {
        
_gen4I ;
        
_gen4O0;
    }
     if (
_gen4I &&  _gen4O)   _gen4O = !(_isTimer(_gen4P 100));
    if(
1
    {
        
_tim1O 1;
        
_tim1I 1;
    }
     else 
    {
         if(
_tim1I
        {
            
_tim1I 0;
            
_tim1P millis();
        }
         else 
        {
             if (
_tim1O
            {
                if (
_isTimer(_tim1P1000)) _tim1O 0;
            }
        }
    }
    if (
_tim1O
    {
        if (! 
_gen1I)
        {
            
_gen1I 1;
            
_gen1O 1;
            
_gen1P millis();
        }
    }
     else 
    {
        
_gen1I ;
        
_gen1O0;
    }
     if (
_gen1I &&  _gen1O)   _gen1O = !(_isTimer(_gen1P 1000));
    if (((!(
_bounseInputD7O)) || (_gen1O)))
    {
        
_count1_Value 0;
    }
     else 
    {
        if (((
_gen2O) || (_gen4O)))
        {
            if (! 
_count1I
            {
                
_count1I 1;
                
_count1_Value _count1_Value 1;
            }
        }
         else 
        {
            
_count1I 0;
        }
    }
    if(
_count1_Value >= 25
    {
        
_count1_Value 1;
    }
    if (
1)
    {
        
_RTCAlO2 1;
        if (
hour() != ((_count1_Value)-(1))) 
        {
             
_RTCAlO2 0;
        }
        if (
minute() != ((_gtv6)+(59))) 
        {
             
_RTCAlO2 0;
        }
        if (
second() != 0
        {
             
_RTCAlO2 0;
        }
    }
     else 
    {
        
_RTCAlO2 0;
    }
    if(!(
_bounseInputD4O)) _trgr2 0;
    if(
_RTCAlO2_trgr2 1;
    if (
1)
    {
        
_RTCAlO1 1;
        if (
hour() != (_count1_Value)) 
        {
             
_RTCAlO1 0;
        }
        if (
minute() != (_gtv6)) 
        {
             
_RTCAlO1 0;
        }
        if (
second() != 0
        {
             
_RTCAlO1 0;
        }
    }
     else 
    {
        
_RTCAlO1 0;
    }
    if(((
_RTCAlO1) || (((!(_bounseInputD7O)) || (_gen1O))))) _trgr1 0;
    if(!(
_bounseInputD4O)) _trgr1 1;
    if (
_trgr1
    {
        
_dispTempLength1 = (String(":")).length();
        if (
_disp5oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp5oldLength _dispTempLength1;
        
_lcd1.setCursor(50);
        
_lcd1.print(String(":"));
    }
     else 
    {
        if (
_disp5oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp5oldLength 0;
        }
    }
    if (
_trgr1
    {
        
_dispTempLength1 = (String(":")).length();
        if (
_disp2oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp2oldLength _dispTempLength1;
        
_lcd1.setCursor(20);
        
_lcd1.print(String(":"));
    }
     else 
    {
        if (
_disp2oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp2oldLength 0;
        }
    }
    
digitalWrite(2_trgr1);
    if (
_trgr1
    {
        
_dispTempLength1 = (((_convertNumbeToTime((second()))))).length();
        if (
_disp4oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp4oldLength _dispTempLength1;
        
_lcd1.setCursor(60);
        
_lcd1.print(((_convertNumbeToTime((second())))));
    }
     else 
    {
        if (
_disp4oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp4oldLength 0;
        }
    }
    if (
_trgr1
    {
        
_dispTempLength1 = (((_convertNumbeToTime((minute()))))).length();
        if (
_disp3oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp3oldLength _dispTempLength1;
        
_lcd1.setCursor(30);
        
_lcd1.print(((_convertNumbeToTime((minute())))));
    }
     else 
    {
        if (
_disp3oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp3oldLength 0;
        }
    }
    if (
_trgr1
    {
        
_dispTempLength1 = (((_convertNumbeToTime((hour()))))).length();
        if (
_disp1oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp1oldLength _dispTempLength1;
        
_lcd1.setCursor(00);
        
_lcd1.print(((_convertNumbeToTime((hour())))));
    }
     else 
    {
        if (
_disp1oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp1oldLength 0;
        }
    }
    
_FreeLog1_IArr[0] = _trgr1;
    
_FreeLog1_IArr[1] = 0;
    
_FreeLog1_Q1 _checkFreeLogicBlockOutput(_FreeLog1_IArr2_FreeLog1_Q1_StArr2);
    if (
_FreeLog1_Q1
    {
        
_dispTempLength1 = ((String("BBegeHo B pe3epB"))).length();
        if (
_disp10oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp10oldLength _dispTempLength1;
        
_lcd1.setCursor(00);
        
_lcd1.print((String("BBegeHo B pe3epB")));
    }
     else 
    {
        if (
_disp10oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp10oldLength 0;
        }
    }
    if (
_trgr1
    {
        
_dispTempLength1 = ((String("PA6OTA"))).length();
        if (
_disp9oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp9oldLength _dispTempLength1;
        
_lcd1.setCursor(100);
        
_lcd1.print((String("PA6OTA")));
    }
     else 
    {
        if (
_disp9oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp9oldLength 0;
        }
    }
    if (((
_trgr1) && (_trgr2))) 
    {
        
_dispTempLength1 = ((String("!"))).length();
        if (
_disp11oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp11oldLength _dispTempLength1;
        
_lcd1.setCursor(80);
        
_lcd1.print((String("!")));
    }
     else 
    {
        if (
_disp11oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp11oldLength 0;
        }
    }
    if(((
_trgr1) && (_trgr2)))
    {
        if((!
_pzs1OES))
        {
             
tone(31000);
            
_pzs1OES =1;
        }
    }
     else 
    {
        if(
_pzs1OES)
        {
            
noTone(3);
            
_pzs1OES =0;
        }
    }
    if ((
_count1_Value) > (0)) 
    {
        
_dispTempLength1 = ((String("aBmoMam.pe*uM"))).length();
        if (
_disp8oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp8oldLength _dispTempLength1;
        
_lcd1.setCursor(31);
        
_lcd1.print((String("aBmoMam.pe*uM")));
    }
     else 
    {
        if (
_disp8oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp8oldLength 0;
        }
    }
    if ((
_count1_Value) == (0)) 
    {
        
_dispTempLength1 = ((String("MecmHoe ynpaB"))).length();
        if (
_disp7oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp7oldLength _dispTempLength1;
        
_lcd1.setCursor(31);
        
_lcd1.print((String("MecmHoe ynpaB")));
    }
     else 
    {
        if (
_disp7oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp7oldLength 0;
        }
    }
    if (
1
    {
        
_dispTempLength1 = (((_convertNumbeToTime(_count1_Value)))).length();
        if (
_disp6oldLength _dispTempLength1
        {
            
_isNeedClearDisp1 1;
        }
        
_disp6oldLength _dispTempLength1;
        
_lcd1.setCursor(01);
        
_lcd1.print(((_convertNumbeToTime(_count1_Value))));
    }
     else 
    {
        if (
_disp6oldLength 0
        {
            
_isNeedClearDisp1 1;
            
_disp6oldLength 0;
        }
    }
    if(
1_trgr3 0;
    if(
_bounseInputD4O_trgr3 1;
    if (
_trgr3)
    {
        if (!(
_RTCST_Ost1))
        {
            
setTime(001, (day()), (month()), (month()));
            
_RTCST_Ost1 1;
        }
    }
    else
    {
         
_RTCST_Ost1 0;
    }
    
digitalWrite(130);
}
bool _isTimer(unsigned long startTimeunsigned long period)
{
    
unsigned long currentTime;
    
currentTime millis();
    if (
currentTime>= startTime
    {
        return (
currentTime>=(startTime period));
    }
     else 
    {
        return (
currentTime >=(4294967295-startTime+period));
    }
}
bool _checkFreeLogicBlockOutput(bool inArray[], int inArraySizebool stArray[], int stArraySize)
{
    
int inIndex 0;
    
bool result 1;
    for (
int i 0stArraySize1)
    {
        if (!(
inArray[inIndex] == stArray[i])) 
        {
             
result 0;
        }
        
inIndex ++;
        if (
inIndex == inArraySize)
        {
            if (
result
            {
                 return 
1;
            }
             else 
            {
                
result 1;
            }
            
inIndex 0;
        }
    }
    return 
0;
}
String _convertNumbeToTime(long value)
{
    if (
value 9
    {
        return 
String(valueDEC);
    }
    return (
String("0") + String(valueDEC));
}

Прикреплённый файл:


zip mauMep.zip Размер: 51.54 KB; Просмотры: 262

gif  mauMep_.gif (43.31 KB)
290_609fea2c5e68c.gif 1522X976 px



Решатель любой проблемы
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Недавно grom произнёс в одной теме такую фразу: Цитата:за что ему спасибо, так как она послужила поводом интересному занятию - начать создавать игру на логических элементах. Тем более, что в Proteus это можно сделать предварительно. В итоге получилось создать так называемый «РЕШАТЕЛЬ» любой проблемы, всего на пяти советских микросхемах К155ТМ2 (зарубежный аналог 7474).
Всё просто: вы нажимаете соответствующие кнопки «ДА» или «НЕТ», а «РЕШАТЕЛЬ» будет задавать вам наводящие вопросы (зажигать светодиоды) и в конце выдаст вердикт по вашей проблеме, тем самым как бы «научит» решать любые проблемы. Перед каждым новым опросом нажимайте кнопку "СБРОС", чтобы "РЕШАТЕЛЬ" не ввёл вас в заблуждение.


Прикреплённый файл:



gif  решатель проблем 2.gif (77.00 KB)
290_60cbc6255689a.gif 2848X1365 px
zip Решатель проблем.zip Размер: 21.24 KB; Просмотры: 265



Re: Симуляция в Proteus
Модератор
Зарегистрирован:
26.01.2010 23:26
Из: Тирасполь
Сообщений: 3926
Не в сети
Как тебе такое Илон Маск Космонавт?
Открыть изображение в новом окне

Прикреплённый файл:



jpg  2021-06-20_17-01-40.jpg (310.07 KB)
3118_60cf4b4393671.jpg 1731X829 px



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Очень здорово! На обычных релюшках, ни транзисторов, ни тем более микросхем, всё просто и надёжно, как топор, что называется "по-нашему"! А я вот ещё в Ардуине его воплотил, тоже прикольно получилось. На "ответе" загорается соответствующий цвет светодиода (красный либо зелёный) и звуковой сигнал, а нажатие кнопок дублируется синим светодиодом. Текст на экране меняется в зависимости от опроса, нет ни каких наложений и сокращений предложений. Правда из-за не полных знаний работы всех блоков в FLProg, делал только на счётчиках и логических элементах, а ведь думаю можно было бы и мультиплексор, и EEPROM здесь "прикрутить", и сократить тем самым схему до минимума.
Открыть изображение в новом окне

Открыть изображение в новом окне

Сделан по этой блок-схеме:
Открыть изображение в новом окне

В предыдущей схеме на К155ТМ2 есть одна пропущенная ветка вопроса, в следующей схеме это исправлено:
Открыть изображение в новом окне


Отредактировано пользователем Kosmonavt 20.06.2021 18:28:59
Отредактировано пользователем Kosmonavt 20.06.2021 18:33:12


Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Немного анимации к предыдущим схемам (по одному варианту из пяти возможных):
Открыть изображение в новом окне

Открыть изображение в новом окне



Игрушка Светофор
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2441
Не в сети
Простой и не очень умный светофор:
Открыть изображение в новом окне

Собран в FLProg на встроенных в микроконтроллер часах, виртуальных компараторах, парочке генераторов и логике.
Открыть изображение в новом окне

Есть видео работы схемы: смотреть



Поиск по форуму


Расширенный поиск

Разное

Интересно

При первом включении после ремонта (для двухтактных УНЧ):
1. в разрыв "+" и "_" резисторы около 100 Ом для ограничения тока в случае не полного устранения неисправности.