Форум

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

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

В сети

Пользователей: 202
Из них просматривают:
Аналоги: 72. Даташиты: 84. Инструкции: 1. Новости: 8. Остальное: 1. Производители: 3. Профиль пользователя: 7. Теги: 4. Форум: 22.
Участников: 2
Гостей: 200

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

Партнёры


Партнёры

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

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

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

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

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

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

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

   http://www.arduino.cc/starterKit

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

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

// инициализировать библиотеку с номерами контактов интерфейса
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

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

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

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

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

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

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

  
// Распечатайте сообщение на ЖК-дисплее.
  
lcd.print("CnPOCu");
  
// установите курсор в столбец 0, строку 1
  // строка 1 - вторая строка, так как отсчет начинается с 0
  
lcd.setCursor(0, 1);
  
// печать во вторую строку
  
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(0, 0);
      
// напечатать текст
      
lcd.print("WAP rOBOPuT:");
      
// перемещение курсора на вторую строку
      
lcd.setCursor(0, 1);

      
// выбрать изречение для печати на основе значения в ответе
      
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; Просмотры: 516



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 20:08
Из: Днестровск
Сообщений: 2784
Не в сети
Пример песочных часов. Здесь используется датчик наклона или просто переключатель. Когда на часы подаётся питание, то начинается десятиминутный отсчёт, после чего загорается светодиод, затем через 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 = 2; x < 8; x++) {
    
pinMode(x, OUTPUT);
  }
  
// установить контакт переключателя наклона как вход
  
pinMode(switchPin, INPUT);
}

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

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

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

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

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

    
// сбросить переменную светодиода на первую
    
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; Просмотры: 474



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

LiquidCrystalRus disp(6, 7, 9, 10, 4, 5);
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(16, OUTPUT); 
pinMode(11, OUTPUT); 
pinMode(12, OUTPUT); 
pinMode(19, OUTPUT); 
pinMode(13, OUTPUT); 

disp.begin(20, 4);
pinMode(2, INPUT);
_SCT_2P=micros();
attachInterrupt( digitalPinToInterrupt (2), _SCT_2coutFunction, FALLING);
_dht1.setup(8);
_dht1LRT = millis();
_dht1Tti = millis(); 
}
void loop()
{if (
_isNeedClearDisp1) {disp.clear(); _isNeedClearDisp1= 0;}





//Плата:1
//Наименование:Метеостанция
//Комментарии:http://radio-hobby.org
if (!(0)) {
_dispTempLength1 = (String("METOCTAHuR v1.01")).length();
if (
_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp2oldLength = _dispTempLength1;
disp.setCursor(0, 0);
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(4, 1);
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(0, 1);
disp.print(String("t:"));
} else {
if (
_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
if(
_isTimer(_dht1Tti, 1000)) {
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(2, 2);
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(6, 2);
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(6, 2);
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(6, 2);
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(2, 1);
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(6, 1);
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(6, 1);
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(6, 1);
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 = 0 ; _gen2O= 0;}
 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(6, 1);
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(6, 1);
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 = 0 ; _gen1O= 0;}
 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(4, 2);
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(0, 2);
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(4, 3);
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(0, 3);
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 = 0 ; _gen5O= 0;}
 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 = 0 ; _gen4O= 0; } if (_gen4I &&  _gen4O)   _gen4O = !( _isTimer( _gen4P , 15000 ));
if (
_gen4O) { if (! _gen3I) { _gen3I = 1; _gen3O = 1; _gen3P = millis(); } } else { _gen3I = 0 ; _gen3O= 0;}
 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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(8, 3);
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(2, 3);
disp.print((( _floatToStringWitRaz(((3.00)*(_SCT_2))/(60),0))));
} else {
if (
_disp31oldLength > 0) {_isNeedClearDisp1 = 1; _disp31oldLength = 0;} 
}




}
String  _floatToStringWitRaz(float value, int raz)
{
 
  return 
String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned 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; Просмотры: 494



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 20:08
Из: Днестровск
Сообщений: 2784
Не в сети
Интересный пример плавного изменение цвета 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(Pin9, OUTPUT); // установка порта на выход
  
pinMode(Pin10, OUTPUT); // установка порта на выход
  
pinMode(Pin11, OUTPUT); // установка порта на выход
  
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(Pin10, 255 - pwm * 2); //Выводим синий цвет
    
analogWrite(Pin11, pwm * 2); //Выводим зеленый цвет
    
analogWrite(Pin9, 0); // меньше середины красный не выводим
   
}
  else
   {
    
analogWrite(Pin9, pwm * 2 - 255); //Выводим красный цвет
    
analogWrite(Pin11, 510 - pwm*2 ); //Выводим зеленый цвет
    
analogWrite(Pin10, 0); // дальше середины синий не выводим
  
}
 ;


  
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; Просмотры: 530



Re: Симуляция в Proteus
Технический Директор
Зарегистрирован:
08.02.2009 20:08
Из: Днестровск
Сообщений: 2784
Не в сети
Хорошо, когда дисплей уже имеет свой собственный контроллер и подключается к Ардуино, кроме питания, всего по двум проводам SCL и SDA, то есть по так называемой I2C-шине.
Такой вариант подключения дисплея на примере симуляция таймера отключения нагрузки. В автоматическом режиме: с интервалом от 1-го до 24-х часов с возможностью продления времени отключения когда это необходимо. На местном управлении: отключение только вручную.
Также есть возможность:
- сделать сброс набранного интервала времени, чтобы не "идти по кругу" от 1 до 24 часа;
- принудительное отключение, не дожидаясь срабатывания таймера;
- выбор режима работы: "автоматический" и "местное управление";
Информация на дисплее о состоянии коммутационного аппаратуры (в данном случае реле):
- Работа
- Введено в резерв
Дополнительно:
- Знак восклицания и предупреждающий звуковой сигнал за минуту до автоматического отключения.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool _FreeLog1_IArr[2];
bool _FreeLog1_Q1_StArr[] = {0, 0};
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(4, INPUT_PULLUP);
    
pinMode(7, INPUT_PULLUP);
    
pinMode(8, INPUT_PULLUP);
    
pinMode(2, OUTPUT);
    
digitalWrite(2, 0);
    
pinMode(13, OUTPUT);
    
digitalWrite(13, 0);
    
Wire.begin();
    
delay(10);
    
_lcd1.init();
    
_lcd1.backlight();
    
_bounseInputD7O =  digitalRead(7);
    
_bounseInputD4O =  digitalRead(4);
    
_bounseInputD8O =  digitalRead(8);
}
void loop()
{
    if (
_isNeedClearDisp1) 
    {
        
_lcd1.clear();
        
_isNeedClearDisp1= 0;
    }
    
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 = 0 ;
        
_gen2O= 0;
    }
    if (
_gen2I) 
    {
          if (
_isTimer (_gen2P , 250)) 
        {
             
_gen2P = millis();
            
_gen2O = ! _gen2O;
        }
    }
    if (
1) 
    {
        if (! 
_gen4I)
        {
            
_gen4I = 1;
            
_gen4O = 1;
            
_gen4P = millis();
        }
    }
     else 
    {
        
_gen4I = 0 ;
        
_gen4O= 0;
    }
     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(_tim1P, 1000)) _tim1O = 0;
            }
        }
    }
    if (
_tim1O) 
    {
        if (! 
_gen1I)
        {
            
_gen1I = 1;
            
_gen1O = 1;
            
_gen1P = millis();
        }
    }
     else 
    {
        
_gen1I = 0 ;
        
_gen1O= 0;
    }
     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(5, 0);
        
_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(2, 0);
        
_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(6, 0);
        
_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(3, 0);
        
_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(0, 0);
        
_lcd1.print(((_convertNumbeToTime((hour())))));
    }
     else 
    {
        if (
_disp1oldLength > 0) 
        {
            
_isNeedClearDisp1 = 1;
            
_disp1oldLength = 0;
        }
    }
    
_FreeLog1_IArr[0] = _trgr1;
    
_FreeLog1_IArr[1] = 0;
    
_FreeLog1_Q1 = _checkFreeLogicBlockOutput(_FreeLog1_IArr, 2, _FreeLog1_Q1_StArr, 2);
    if (
_FreeLog1_Q1) 
    {
        
_dispTempLength1 = ((String("BBegeHo B pe3epB"))).length();
        if (
_disp10oldLength > _dispTempLength1) 
        {
            
_isNeedClearDisp1 = 1;
        }
        
_disp10oldLength = _dispTempLength1;
        
_lcd1.setCursor(0, 0);
        
_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(10, 0);
        
_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(8, 0);
        
_lcd1.print((String("!")));
    }
     else 
    {
        if (
_disp11oldLength > 0) 
        {
            
_isNeedClearDisp1 = 1;
            
_disp11oldLength = 0;
        }
    }
    if(((
_trgr1) && (_trgr2)))
    {
        if((!
_pzs1OES))
        {
             
tone(3, 1000);
            
_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(3, 1);
        
_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(3, 1);
        
_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(0, 1);
        
_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(0, 0, 1, (day()), (month()), (month()));
            
_RTCST_Ost1 = 1;
        }
    }
    else
    {
         
_RTCST_Ost1 = 0;
    }
    
digitalWrite(13, 0);
}
bool _isTimer(unsigned long startTime, unsigned 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 inArraySize, bool stArray[], int stArraySize)
{
    
int inIndex = 0;
    
bool result = 1;
    for (
int i = 0; i < stArraySize; i = i + 1)
    {
        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(value, DEC);
    }
    return (
String("0") + String(value, DEC));
}

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


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

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



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


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



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



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

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



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



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

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

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

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


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


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

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



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

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

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



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


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

Разное

Интересно

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