Форум

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

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

В сети

Пользователей: 108
Из них просматривают:
Аналоги: 35. Видео: 1. Даташиты: 18. Инструкции: 8. Новости: 1. Остальное: 8. Программы: 1. Производители: 1. Профиль пользователя: 16. Советы: 2. Теги: 2. Форум: 15.
Участников: 2
Гостей: 106

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

Партнёры


Партнёры

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

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

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

 1 анонимных пользователей
Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2521
Не в сети
Забавный пример случайных предсказаний, по принципу "Хрустальный шар"! Игра состоит в том, что вы задаёте вопрос, затем нажимаете кнопку и дисплей выдаёт вам один из нескольких случайных ответов.
/*
Пример стартового комплекта 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; Просмотры: 346



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2521
Не в сети
Пример песочных часов. Здесь используется датчик наклона или просто переключатель. Когда на часы подаётся питание, то начинается десятиминутный отсчёт, после чего загорается светодиод, затем через 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; Просмотры: 325



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2521
Не в сети
Это симуляция работы метеостанции, которая описана в теме на форуме.
Скорость ветра отображается спустя минуту, за то время, которое необходимо вычислить программе исходя из разрозненных поступающих данных. Реакция дисплея и светодиодов на температуру и влажность происходит без задержки. Скорость ветра можно менять согласно таблице, что рядом с генератором импульсов (в реальности датчик Холла).
#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; Просмотры: 340



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2521
Не в сети
Интересный пример плавного изменение цвета 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; Просмотры: 326



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 21:08
Из: Днестровск
Сообщений: 2521
Не в сети
Хорошо, когда дисплей уже имеет свой собственный контроллер и подключается к Ардуино, кроме питания, всего по двум проводам 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; Просмотры: 334

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



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


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



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



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
Из: Днестровск
Сообщений: 2521
Не в сети
Очень здорово! На обычных релюшках, ни транзисторов, ни тем более микросхем, всё просто и надёжно, как топор, что называется "по-нашему"! А я вот ещё в Ардуине его воплотил, тоже прикольно получилось. На "ответе" загорается соответствующий цвет светодиода (красный либо зелёный) и звуковой сигнал, а нажатие кнопок дублируется синим светодиодом. Текст на экране меняется в зависимости от опроса, нет ни каких наложений и сокращений предложений. Правда из-за не полных знаний работы всех блоков в 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
Из: Днестровск
Сообщений: 2521
Не в сети
Немного анимации к предыдущим схемам (по одному варианту из пяти возможных):
Открыть изображение в новом окне

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



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

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

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



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


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

Разное

Интересно

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