но можно же сделать цифровой и замаскировать под ламповый, или УНЧ сделать ламповым, ВЧ части на однокристальном FM приемнике
Это будет зависеть от того смогу ли увеличить ресурс ИН-12Б скажем до 25 лет. Корпус должен соответствовать содержанию. Может в полнакала тлеть пока газоанализатор на нуле, или гасить ночью или днём по будням.
т.к. индикация динамическая то каждая лампа работает 1/4 времени индикации, в остальное время она "не горит"
Так никто не в курсе как по одному шагу сервой в секунду без delay() двигать?
У меня 180 шагов(градусов), на которые по секунде я от нуля хочу натянуть серву на пружине, а потом разрядить её в ноль, что бы стукнуть молоточком по колоколу. Секундное тиканье сервой нужно в последнюю минуту таймера. По скольку градусов 180, а в минуте 60 секунд можно организовать принцип "два шага вперёд один назад" за секунду.
#include <Servo.h> // Подключаем библиотеку
Servo motor; // Создаём инстанцию нашей сервомашинки
//Объявление глобальных переменных
//Сегменты табло через сдвиговый регистр 74HC595:
const int latchPin = 7; //to ST_CP
const int clockPin = 6; //to SH_CP
const int dataPin = 5; //to DS
//Выводы выбора разряда индикатора
const int digit1Pin = 9; //единицы
const int digit2Pin = 10; //десятки
const int digit3Pin = 11; //сотни
const int digit4Pin = 12; //тысячи
//звуковая индикация
//const int buzzerPin = 3;
int ring = 2;
//номеронабиратель
const int dialPin = 2;
//рычаг
const int switchPin = 8;
//термодатчик
//const int termoPin = ;
//varDisplayRefreshTime - время индикации символа в микросекундах
//чем больше тем ярче, при значительно больших значениях - проявиться мерцание
const unsigned int varDisplayRefreshTime = 5000;
//varDisplayNextTime - расчетное время очередной индикации
unsigned long varDisplayNextTime = 0;
//varDysplayPosition - отображаемый разряд
byte varDysplayPosition = 0;
//varMode - режим работы
//0 - температура
//1 - N/U
//2 - таймер
//3 - часы
//4 - N/U
byte varMode = 3;
//varModeOld - предыдущий режим работы
byte varModeOld = 3;
//varSetMode - ожидание установки таймера
byte varSetMode = 0;
//Десятки секунд
unsigned long varTenSec;
//последнее состояние десятков секунд
byte varTenSecLast;
//минута
byte varMinuteCounter = 0;
//arrDysplaySymbols[11] - массив знакосинтезирующий
const byte arrDysplaySymbols[11] =
{
252,
96,
218,
242,
102,
182,
190,
224,
254,
246,
0
};
//arrCounter[5] - массив показаний для различных режимов работы
long arrCounter[5];
//vardialPinState - состояние на входе dialPin
byte vardialPinState = 1;
//vardialPinLastState - последнее состояние на входе dialPin
byte vardialPinLastState = 1;
//vardialReadyDigitNext - готовность к вводу следующего разряда
byte vardialReadyDigitNext = 0;
//vardialPinPulseLock - имульс зафиксирован
byte vardialPinPulseLock = 0;
//vardialCount - текущее количество циклов опроса dialPin
word vardialCount = 0;
//vardialCountMin - минимальное количество циклов для защиты от дребезга контактов
const word vardialCountMin = 3;
//vardialCountDigitNext - минимальное количество циклов для перехода к следующему разряду
const word vardialCountDigitNext = 100;
//vardialCountEndOfSet - минимальное количество циклов для завершения ввода
const word vardialCountEndOfSet = 15000;
//vardialChangeTime
long vardialChangeTime = 0;
void setup()
{
//конфигурирование портов ввода/вывода
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(digit1Pin, OUTPUT);
pinMode(digit2Pin, OUTPUT);
pinMode(digit3Pin, OUTPUT);
pinMode(digit4Pin, OUTPUT);
//pinMode(buzzerPin, OUTPUT);
motor.attach(3); // Подключаем серву на 3 пин
pinMode(dialPin, INPUT_PULLUP);
pinMode(switchPin, INPUT_PULLUP);
//формирование на выводах начальных состояний
digitalWrite(digit1Pin, HIGH);
digitalWrite(digit2Pin, HIGH);
digitalWrite(digit3Pin, HIGH);
digitalWrite(digit4Pin, HIGH);
Serial.begin(9600); //отладка
//установка часов
do
{
Display();
dial(3);
if (arrCounter[3] == 0) varSetMode = 1;
} while (varSetMode == 1);
}
void loop()
{
varTenSec = millis()/10000;
varTenSec = varTenSec%10;
Display();
Clock();
thermo();
Display();
dial(2);
//checkDialer(); //отладка
//out2con(); //отладка
}
//dial(*) - подпрограмма номеронабирателя
//* - режим работы для которого осуществляется ввод
void dial(byte varModeDial)
{
vardialPinState = digitalRead(dialPin);
if (vardialPinState != vardialPinLastState)
{
vardialChangeTime = millis();
}
if (vardialPinState == 1)
{// вход врежим установки и подсчет импульсов
if (varSetMode == 0)
{// вход врежим установки
varSetMode = 1;
varMode = varModeDial;
vardialCount = 0;
arrCounter[varModeDial] = 0;
}
else
{// подсчет импульсов
if ((millis() - vardialChangeTime) > vardialCountMin && vardialPinPulseLock == 0)
{
if (vardialReadyDigitNext == 0 && varModeDial == 3)
{
arrCounter[varModeDial] *= 10;
}
arrCounter[varModeDial] ++;
word varCounterDigitZero = arrCounter[varModeDial]%10;
if (varCounterDigitZero == 0)
{
arrCounter[varModeDial] = arrCounter[varModeDial] - 10;
}
vardialPinPulseLock = 1;
vardialReadyDigitNext = 1;
}
}
}
else
{
if (varSetMode == 0)
{
return;
}
else
{// паузы и выход из режима установки
if ((millis() - vardialChangeTime) > vardialCountMin)
{
vardialPinPulseLock = 0;
}
if ((millis() - vardialChangeTime) > vardialCountEndOfSet)
{// выход из режима установки
varSetMode = 0;
}
else if ((millis() - vardialChangeTime) > vardialCountDigitNext && vardialReadyDigitNext == 1)
{// паузы
if (varModeDial == 2)
{
arrCounter[varModeDial] *= 10;
}
//выполнить усечение arrCounter[varModeDial] до трех разрядов
arrCounter[varModeDial] = arrCounter[varModeDial]%10000;
vardialReadyDigitNext = 0;
}
}
}
vardialPinLastState = vardialPinState;
}
//thermo() - подпрограмма измерения температуры
void thermo()
{
if (varSetMode == 1)
{
return;
}
//контроль снятия с рычага
if (digitalRead(switchPin) == LOW)
{
if (varMode != 0)
{
varModeOld = varMode;
varMode = 0;
}
//подпрограммы измерения температуры
}
else
{
if (varMode == 0)
{
varMode = varModeOld;
}
}
}
//Clock() - подпрограмма часов
void Clock()
{
if (varTenSecLast != varTenSec)
{
varTenSecLast = varTenSec;
varMinuteCounter ++;
if (varMinuteCounter == 6)
{
varMinuteCounter = 0;
arrCounter[3] ++;
if (arrCounter[3]/10%10 == 6)
{
arrCounter[3] += 40;
}
if (arrCounter[3] >= 2400)
{
arrCounter[3] = 0;
}
}
if (arrCounter[2] != 0)
{
if (varSetMode == 0)
{
Timer();
}
}
else
{
if (varMode == 2)
{
varMode = 3;
}
}
}
}
//Timer() - подпрограмма таймера
void Timer()
{
arrCounter[2] --;
if (arrCounter[2]%10 >= 6)
{
arrCounter[2] = arrCounter[2] - 4;
}
if (arrCounter[2] < 60)
{
if (ring < 176)
{
ring = ring + 2; //ставим на 2 градуса больше
Serial.println (ring);
motor.write(ring);
}
if (ring < 180)
{
ring = ring - 1; //ставим на 1 градус меньше
Serial.println (ring);
motor.write(ring);
}
}
if (arrCounter[2] == 1) //тут звеним в звнок
{
Serial.println (0);
motor.write(0);
}
if (arrCounter[2] == 0) //выключаем
{
// varMode = 3;
Serial.println (1);
motor.write(1);
// motor.write(0); //серва гудит в нулевом положении
}
}
//beepOn() - подпрограмма звуковой индикации
//void beepOn()
//{
// analogWrite(buzzerPin, 127);
//}
//beepOff() - подпрограмма звуковой индикации
//void beepOff()
//{
// analogWrite(buzzerPin, 0);
//}
//Display() - подпрограмма индикации
void Display()
{
int digitPinOff;
int digitPinOn;
int DisplayDigital;
// if (varDisplayNextTime <= micros() && varDisplayNextTime > micros() - varDisplayRefreshTime)
if (varDisplayNextTime <= micros())
{
varDisplayNextTime += varDisplayRefreshTime;
varDysplayPosition = varDysplayPosition + 1;
if (varDysplayPosition > 4)
{
varDysplayPosition = 1;
}
switch (varDysplayPosition)
{
case 1:
DisplayDigital = arrCounter[varMode]%10;
DisplayDigital = arrDysplaySymbols[DisplayDigital];
digitPinOff = digit4Pin;
digitPinOn = digit1Pin;
break;
case 2:
if (arrCounter[varMode] > 9 || varMode == 3)
{
DisplayDigital = arrCounter[varMode]/10%10;
DisplayDigital = arrDysplaySymbols[DisplayDigital];
}
else
{
DisplayDigital = arrDysplaySymbols[11];
}
digitPinOff = digit1Pin;
digitPinOn = digit2Pin;
break;
case 3:
if (arrCounter[varMode] > 99 || varMode == 3)
{
DisplayDigital = arrCounter[varMode]/100%10;
DisplayDigital = arrDysplaySymbols[DisplayDigital];
}
else
{
DisplayDigital = arrDysplaySymbols[11];
}
digitPinOff = digit2Pin;
digitPinOn = digit3Pin;
break;
case 4:
if (arrCounter[varMode] > 999)
{
DisplayDigital = arrCounter[varMode]/1000%10;
DisplayDigital = arrDysplaySymbols[DisplayDigital];
}
else
{
DisplayDigital = arrDysplaySymbols[11];
}
digitPinOff = digit3Pin;
digitPinOn = digit4Pin;
break;
}
if (varMode == varDysplayPosition)
{
unsigned long varPointBlinkTime = millis()/500;
varPointBlinkTime = varPointBlinkTime%10;
varPointBlinkTime = varPointBlinkTime & B00000001;
if (varPointBlinkTime == 1 || varSetMode == 1)
{
DisplayDigital = DisplayDigital ^ B00000001;
}
}
digitalWrite(digitPinOff, HIGH);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, DisplayDigital);
digitalWrite(latchPin, HIGH);
digitalWrite(digitPinOn, LOW);
}
}
//отладка
void checkDialer()
{
if (digitalRead(dialPin) == LOW)
{
arrCounter[1] ++;
arrCounter[4] = 0;
}
else
{
arrCounter[1] = 0;
arrCounter[4] ++;
}
Serial.print (arrCounter[1]);
Serial.print ("\t");
Serial.println (arrCounter[4]);
}
//отладка
void out2con()
{
Serial.print ("Mode=");
Serial.print (varMode);
Serial.print ("\tt=");
Serial.print (arrCounter[0]);
Serial.print ("\tTimer=");
Serial.print (arrCounter[2]);
Serial.print ("\tClock=");
Serial.print (arrCounter[3]);
Serial.print ("\tSetMode=");
Serial.print (varSetMode);
Serial.print ("\tdialCount=");
Serial.print (vardialCount);
Serial.print ("\tdialPinLS=");
Serial.print (vardialPinLastState);
Serial.print ("\tdialPinS=");
Serial.print (vardialPinState);
Serial.print ("\t");
Serial.println ();
}
А зачем так долго и вдумчиво взводить пружину? - там же есть "засечьки" (if (arrCounter[2] == ...) за десять секунд взводишь пружину сформировав на ШИМ выходе нужные импульсы, а при "0" сбрасываешь пружину
Вспомнилась армейская Р-150 с этими индикаторами новенькая пахнущая еще свежим текстолитом, когда я на боевом дежурстве был.
Ну и дрянь эти иникаторы. Рядок длинный был в первый месяц новенькие сгорело 3 штуки. Я сразу отказался от этой дряни, потому как старушка Р-154 не забрали еще.
Глупость. Дрянь. Мальчик выкининь каку.
Портянки толком не высушишь. Хлеб оставшийся после обеда на боевом дежурстве в сухари не высушишь. Принимала она не скажу что лучше Р-154-ой или Р-250-ой. Выполеннена была в виде неподьемного шкафа от пола на высоту 2 метра. Если вдруг передислоцироваться надо будет переде стингером под ней тебя и похоронят. Там где в выборе частоты каждая цифра важна, меня задолбала срывать пломбу и перетыкивать эти лампы чтобы правильно выствалять. А за сутки дежурства частоту могли 4 раза поменять.
Со всей ответсвенностью заявляю Авно. Проверено на войне.
Ну и дрянь эти иникаторы. Со всей ответсвенностью заявляю Авно. Проверено на войне.
Для армии в СССР много чего ненужного делали. Одна Дуга к примеру чего стоит.
А индикаторы такие применялись в счетных машинах того же времени, что и Р-ка.
Вполне сносно работали. Причём я видел их же позднее сильно б/у, и могу сказать что проблемы возникали в частичном прогаре разрядов и знаков которые светят чаще. Были даже какие то методики восстановления разрядом существенно большего наприяжения. Но Вы правы, что их применение практичность прибора снизит.
Я думаю попробовать их имитировать. Взять к примеру не красный индикатор, а желтый и добавить подходящий светофильтр. А яркостью я упралять уже научился. Может получиться почти тлеющий теплый свет. Ну разве что без гламурного голубого фона в стеклянной лампе.
Визуальная индикация оказалась сложной, но решаемой задачей. Чего не скажешь о звуковом оповещении.
На первый взгляд все просто - два колокола, молоток на эл.магнитном приводе от порта ардуины.
Вариантов было рассмотрено много и на серве, и соленоид, и штатный телефонный (звенит громче и приятней):
По сему вопрос к уважаемому сообществу: как объяснить ардуине что на 3 цифровом выходе нужно при до достижении таймером указанного значения произвести серию импульсов напряжением 12 вольт. Планирую питать схему 12 вольтовым напряжением. Соответственно заменив плату ArduinoUno на контроллер с требуемой обвязкой (сдвиговик, крен, и тп) можно будет электрически что то добавить для усиления импульсов звонка.
//Timer() - подпрограмма таймера
void Timer()
{
arrCounter[2] --;
if (arrCounter[2]%10 >= 6)
{
//Таймер считает десятками секунд
arrCounter[2] = arrCounter[2] - 4;
}
if (arrCounter[2] =< 1)
{
//тут звеним в звнок
}
}
но можно же сделать цифровой и замаскировать под ламповый, или УНЧ сделать ламповым, ВЧ части на однокристальном FM приемнике
Это будет зависеть от того смогу ли увеличить ресурс ИН-12Б скажем до 25 лет. Корпус должен соответствовать содержанию. Может в полнакала тлеть пока газоанализатор на нуле, или гасить ночью или днём по будням.
т.к. индикация динамическая то каждая лампа работает 1/4 времени индикации, в остальное время она "не горит"
уже делают вроде того))
http://radio-hobby.org/modules/newbb/viewtopic.php?topic_id=611&forum=11
комменты улыбнули ;)
т.к. индикация динамическая то каждая лампа работает 1/4 времени индикации, в остальное время она "не горит"
20 000 часов лучше чем 5 000, но хуже чем искомые 200 000. Хочу внукам завещать.
Кстати, видел такой датчик? http://www.chipdip.ru/product/sn18b20/
т.к. индикация динамическая то каждая лампа работает 1/4 времени индикации, в остальное время она "не горит"
20 000 часов лучше чем 5 000, но хуже чем искомые 200 000. Хочу внукам завещать.
приложи коробку ламп на замену - не включать же раз в году, например, на новый год
Кстати, видел такой датчик? http://www.chipdip.ru/product/sn18b20/
я видел
http://ru.aliexpress.com/item/5pcs-Lot-Waterproof-DS18B20-Digital-Temper...
Кстати, видел такой датчик? http://www.chipdip.ru/product/sn18b20/
я видел
http://ru.aliexpress.com/item/5pcs-Lot-Waterproof-DS18B20-Digital-Temper...
ну типо того... заточи и тыкай в пищу
ну типо того... заточи и тыкай в пищу
нафига?
тамже функция измерения температуры по ТЗ заложена
А вот я стесняюсь спросить- а что это разработчики на Arduino вдруг взялись использовать газоразрядные индикаторы?
Громоздкая штука, 200В на анод, управлять через 155ИД1, сказать, что очень красиво-ну, сложно.
В чем прелесть-то? Всякие ВЛИ, по-мокму, красивее будут, служат дольше, работать проще, (относительно, -27В тоже где-то надо взять).
А вот я стесняюсь спросить- В чем прелесть-то? Всякие ВЛИ красивее...
Всякие ВЛИ 18GT19HT уже предлагались.
Они скорее напоминают 1980е, а мне нужно 1880е
ну типо того... заточи и тыкай в пищу
Думал использовать от мультиметра.
Затачивать не надо, их есть у меня, да и прост как пробка.
Вот только его относительная компенсация весьма спорна.
А ты хочешь чтоб выглядело именно как телефон?
А ты хочешь чтоб выглядело именно как телефон?
да.
или настенный вариант:
Так никто не в курсе как по одному шагу сервой в секунду без delay() двигать?
У меня 180 шагов(градусов), на которые по секунде я от нуля хочу натянуть серву на пружине, а потом разрядить её в ноль, что бы стукнуть молоточком по колоколу. Секундное тиканье сервой нужно в последнюю минуту таймера. По скольку градусов 180, а в минуте 60 секунд можно организовать принцип "два шага вперёд один назад" за секунду.
#include <Servo.h> // Подключаем библиотеку Servo motor; // Создаём инстанцию нашей сервомашинки //Объявление глобальных переменных //Сегменты табло через сдвиговый регистр 74HC595: const int latchPin = 7; //to ST_CP const int clockPin = 6; //to SH_CP const int dataPin = 5; //to DS //Выводы выбора разряда индикатора const int digit1Pin = 9; //единицы const int digit2Pin = 10; //десятки const int digit3Pin = 11; //сотни const int digit4Pin = 12; //тысячи //звуковая индикация //const int buzzerPin = 3; int ring = 2; //номеронабиратель const int dialPin = 2; //рычаг const int switchPin = 8; //термодатчик //const int termoPin = ; //varDisplayRefreshTime - время индикации символа в микросекундах //чем больше тем ярче, при значительно больших значениях - проявиться мерцание const unsigned int varDisplayRefreshTime = 5000; //varDisplayNextTime - расчетное время очередной индикации unsigned long varDisplayNextTime = 0; //varDysplayPosition - отображаемый разряд byte varDysplayPosition = 0; //varMode - режим работы //0 - температура //1 - N/U //2 - таймер //3 - часы //4 - N/U byte varMode = 3; //varModeOld - предыдущий режим работы byte varModeOld = 3; //varSetMode - ожидание установки таймера byte varSetMode = 0; //Десятки секунд unsigned long varTenSec; //последнее состояние десятков секунд byte varTenSecLast; //минута byte varMinuteCounter = 0; //arrDysplaySymbols[11] - массив знакосинтезирующий const byte arrDysplaySymbols[11] = { 252, 96, 218, 242, 102, 182, 190, 224, 254, 246, 0 }; //arrCounter[5] - массив показаний для различных режимов работы long arrCounter[5]; //vardialPinState - состояние на входе dialPin byte vardialPinState = 1; //vardialPinLastState - последнее состояние на входе dialPin byte vardialPinLastState = 1; //vardialReadyDigitNext - готовность к вводу следующего разряда byte vardialReadyDigitNext = 0; //vardialPinPulseLock - имульс зафиксирован byte vardialPinPulseLock = 0; //vardialCount - текущее количество циклов опроса dialPin word vardialCount = 0; //vardialCountMin - минимальное количество циклов для защиты от дребезга контактов const word vardialCountMin = 3; //vardialCountDigitNext - минимальное количество циклов для перехода к следующему разряду const word vardialCountDigitNext = 100; //vardialCountEndOfSet - минимальное количество циклов для завершения ввода const word vardialCountEndOfSet = 15000; //vardialChangeTime long vardialChangeTime = 0; void setup() { //конфигурирование портов ввода/вывода pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(digit1Pin, OUTPUT); pinMode(digit2Pin, OUTPUT); pinMode(digit3Pin, OUTPUT); pinMode(digit4Pin, OUTPUT); //pinMode(buzzerPin, OUTPUT); motor.attach(3); // Подключаем серву на 3 пин pinMode(dialPin, INPUT_PULLUP); pinMode(switchPin, INPUT_PULLUP); //формирование на выводах начальных состояний digitalWrite(digit1Pin, HIGH); digitalWrite(digit2Pin, HIGH); digitalWrite(digit3Pin, HIGH); digitalWrite(digit4Pin, HIGH); Serial.begin(9600); //отладка //установка часов do { Display(); dial(3); if (arrCounter[3] == 0) varSetMode = 1; } while (varSetMode == 1); } void loop() { varTenSec = millis()/10000; varTenSec = varTenSec%10; Display(); Clock(); thermo(); Display(); dial(2); //checkDialer(); //отладка //out2con(); //отладка } //dial(*) - подпрограмма номеронабирателя //* - режим работы для которого осуществляется ввод void dial(byte varModeDial) { vardialPinState = digitalRead(dialPin); if (vardialPinState != vardialPinLastState) { vardialChangeTime = millis(); } if (vardialPinState == 1) {// вход врежим установки и подсчет импульсов if (varSetMode == 0) {// вход врежим установки varSetMode = 1; varMode = varModeDial; vardialCount = 0; arrCounter[varModeDial] = 0; } else {// подсчет импульсов if ((millis() - vardialChangeTime) > vardialCountMin && vardialPinPulseLock == 0) { if (vardialReadyDigitNext == 0 && varModeDial == 3) { arrCounter[varModeDial] *= 10; } arrCounter[varModeDial] ++; word varCounterDigitZero = arrCounter[varModeDial]%10; if (varCounterDigitZero == 0) { arrCounter[varModeDial] = arrCounter[varModeDial] - 10; } vardialPinPulseLock = 1; vardialReadyDigitNext = 1; } } } else { if (varSetMode == 0) { return; } else {// паузы и выход из режима установки if ((millis() - vardialChangeTime) > vardialCountMin) { vardialPinPulseLock = 0; } if ((millis() - vardialChangeTime) > vardialCountEndOfSet) {// выход из режима установки varSetMode = 0; } else if ((millis() - vardialChangeTime) > vardialCountDigitNext && vardialReadyDigitNext == 1) {// паузы if (varModeDial == 2) { arrCounter[varModeDial] *= 10; } //выполнить усечение arrCounter[varModeDial] до трех разрядов arrCounter[varModeDial] = arrCounter[varModeDial]%10000; vardialReadyDigitNext = 0; } } } vardialPinLastState = vardialPinState; } //thermo() - подпрограмма измерения температуры void thermo() { if (varSetMode == 1) { return; } //контроль снятия с рычага if (digitalRead(switchPin) == LOW) { if (varMode != 0) { varModeOld = varMode; varMode = 0; } //подпрограммы измерения температуры } else { if (varMode == 0) { varMode = varModeOld; } } } //Clock() - подпрограмма часов void Clock() { if (varTenSecLast != varTenSec) { varTenSecLast = varTenSec; varMinuteCounter ++; if (varMinuteCounter == 6) { varMinuteCounter = 0; arrCounter[3] ++; if (arrCounter[3]/10%10 == 6) { arrCounter[3] += 40; } if (arrCounter[3] >= 2400) { arrCounter[3] = 0; } } if (arrCounter[2] != 0) { if (varSetMode == 0) { Timer(); } } else { if (varMode == 2) { varMode = 3; } } } } //Timer() - подпрограмма таймера void Timer() { arrCounter[2] --; if (arrCounter[2]%10 >= 6) { arrCounter[2] = arrCounter[2] - 4; } if (arrCounter[2] < 60) { if (ring < 176) { ring = ring + 2; //ставим на 2 градуса больше Serial.println (ring); motor.write(ring); } if (ring < 180) { ring = ring - 1; //ставим на 1 градус меньше Serial.println (ring); motor.write(ring); } } if (arrCounter[2] == 1) //тут звеним в звнок { Serial.println (0); motor.write(0); } if (arrCounter[2] == 0) //выключаем { // varMode = 3; Serial.println (1); motor.write(1); // motor.write(0); //серва гудит в нулевом положении } } //beepOn() - подпрограмма звуковой индикации //void beepOn() //{ // analogWrite(buzzerPin, 127); //} //beepOff() - подпрограмма звуковой индикации //void beepOff() //{ // analogWrite(buzzerPin, 0); //} //Display() - подпрограмма индикации void Display() { int digitPinOff; int digitPinOn; int DisplayDigital; // if (varDisplayNextTime <= micros() && varDisplayNextTime > micros() - varDisplayRefreshTime) if (varDisplayNextTime <= micros()) { varDisplayNextTime += varDisplayRefreshTime; varDysplayPosition = varDysplayPosition + 1; if (varDysplayPosition > 4) { varDysplayPosition = 1; } switch (varDysplayPosition) { case 1: DisplayDigital = arrCounter[varMode]%10; DisplayDigital = arrDysplaySymbols[DisplayDigital]; digitPinOff = digit4Pin; digitPinOn = digit1Pin; break; case 2: if (arrCounter[varMode] > 9 || varMode == 3) { DisplayDigital = arrCounter[varMode]/10%10; DisplayDigital = arrDysplaySymbols[DisplayDigital]; } else { DisplayDigital = arrDysplaySymbols[11]; } digitPinOff = digit1Pin; digitPinOn = digit2Pin; break; case 3: if (arrCounter[varMode] > 99 || varMode == 3) { DisplayDigital = arrCounter[varMode]/100%10; DisplayDigital = arrDysplaySymbols[DisplayDigital]; } else { DisplayDigital = arrDysplaySymbols[11]; } digitPinOff = digit2Pin; digitPinOn = digit3Pin; break; case 4: if (arrCounter[varMode] > 999) { DisplayDigital = arrCounter[varMode]/1000%10; DisplayDigital = arrDysplaySymbols[DisplayDigital]; } else { DisplayDigital = arrDysplaySymbols[11]; } digitPinOff = digit3Pin; digitPinOn = digit4Pin; break; } if (varMode == varDysplayPosition) { unsigned long varPointBlinkTime = millis()/500; varPointBlinkTime = varPointBlinkTime%10; varPointBlinkTime = varPointBlinkTime & B00000001; if (varPointBlinkTime == 1 || varSetMode == 1) { DisplayDigital = DisplayDigital ^ B00000001; } } digitalWrite(digitPinOff, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, DisplayDigital); digitalWrite(latchPin, HIGH); digitalWrite(digitPinOn, LOW); } } //отладка void checkDialer() { if (digitalRead(dialPin) == LOW) { arrCounter[1] ++; arrCounter[4] = 0; } else { arrCounter[1] = 0; arrCounter[4] ++; } Serial.print (arrCounter[1]); Serial.print ("\t"); Serial.println (arrCounter[4]); } //отладка void out2con() { Serial.print ("Mode="); Serial.print (varMode); Serial.print ("\tt="); Serial.print (arrCounter[0]); Serial.print ("\tTimer="); Serial.print (arrCounter[2]); Serial.print ("\tClock="); Serial.print (arrCounter[3]); Serial.print ("\tSetMode="); Serial.print (varSetMode); Serial.print ("\tdialCount="); Serial.print (vardialCount); Serial.print ("\tdialPinLS="); Serial.print (vardialPinLastState); Serial.print ("\tdialPinS="); Serial.print (vardialPinState); Serial.print ("\t"); Serial.println (); }А зачем так долго и вдумчиво взводить пружину? - там же есть "засечьки" (if (arrCounter[2] == ...) за десять секунд взводишь пружину сформировав на ШИМ выходе нужные импульсы, а при "0" сбрасываешь пружину
Вспомнилась армейская Р-150 с этими индикаторами новенькая пахнущая еще свежим текстолитом, когда я на боевом дежурстве был.
Ну и дрянь эти иникаторы. Рядок длинный был в первый месяц новенькие сгорело 3 штуки. Я сразу отказался от этой дряни, потому как старушка Р-154 не забрали еще.
Глупость. Дрянь. Мальчик выкининь каку.
Портянки толком не высушишь. Хлеб оставшийся после обеда на боевом дежурстве в сухари не высушишь. Принимала она не скажу что лучше Р-154-ой или Р-250-ой. Выполеннена была в виде неподьемного шкафа от пола на высоту 2 метра. Если вдруг передислоцироваться надо будет переде стингером под ней тебя и похоронят. Там где в выборе частоты каждая цифра важна, меня задолбала срывать пломбу и перетыкивать эти лампы чтобы правильно выствалять. А за сутки дежурства частоту могли 4 раза поменять.
Со всей ответсвенностью заявляю Авно. Проверено на войне.
Ну и дрянь эти иникаторы. Со всей ответсвенностью заявляю Авно. Проверено на войне.
Для армии в СССР много чего ненужного делали. Одна Дуга к примеру чего стоит.
А индикаторы такие применялись в счетных машинах того же времени, что и Р-ка.
Вполне сносно работали. Причём я видел их же позднее сильно б/у, и могу сказать что проблемы возникали в частичном прогаре разрядов и знаков которые светят чаще. Были даже какие то методики восстановления разрядом существенно большего наприяжения. Но Вы правы, что их применение практичность прибора снизит.
Я думаю попробовать их имитировать. Взять к примеру не красный индикатор, а желтый и добавить подходящий светофильтр. А яркостью я упралять уже научился. Может получиться почти тлеющий теплый свет. Ну разве что без гламурного голубого фона в стеклянной лампе.
Визуальная индикация оказалась сложной, но решаемой задачей. Чего не скажешь о звуковом оповещении.
На первый взгляд все просто - два колокола, молоток на эл.магнитном приводе от порта ардуины.
Вариантов было рассмотрено много и на серве, и соленоид, и штатный телефонный (звенит громче и приятней):
По сему вопрос к уважаемому сообществу: как объяснить ардуине что на 3 цифровом выходе нужно при до достижении таймером указанного значения произвести серию импульсов напряжением 12 вольт. Планирую питать схему 12 вольтовым напряжением. Соответственно заменив плату ArduinoUno на контроллер с требуемой обвязкой (сдвиговик, крен, и тп) можно будет электрически что то добавить для усиления импульсов звонка.
//Timer() - подпрограмма таймера void Timer() { arrCounter[2] --; if (arrCounter[2]%10 >= 6) { //Таймер считает десятками секунд arrCounter[2] = arrCounter[2] - 4; } if (arrCounter[2] =< 1) { //тут звеним в звнок } }