Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 08.12.2020
Сообщений: 13

Переделать скейтч

14.12.2025, 06:44. Показов 293. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть скейтч, который включает лампочки (предназначается для котла).
Скейтч при первом запуске запускает сначала лампочку "ТЭН", затем ждёт, а по увеличению давления открывает лампочку "подача".
Так вот, нужно, чтобы он не ждал по давлению, а запустил таймер, и по окончании таймера включил подачу, ну и, продолжил все остальное также. Буду очень благодарен.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
#include <Arduino.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // для Протеуса адрес должен быть 0x20, для платы Ардуино - 0x3F или 0x27 
 
// интервал давления для поддержания нагревателем 
#define P_LOW     800   // включать ТЭН при нижней границе давления 
#define P_HIGH    830   // выключать ТЭН при верхней границе 
#define P_PODACHA 770   // давление открытия клапана подачи 
#define P_SPUSK   500   // спуск давления 
#define P_VPUSK   500   // спуск вакуума 
#define P_VACUM   700   // порог давления в режиме вакума для включения таймера вакумирования 
 
#define TIMER1_DELAY_SEC  30  // задержка таймера 1 (продувка)
#define TIMER2_DELAY_SEC  30  // задержка таймера 2 (стерилизация)
#define TIMER4_DELAY_SEC  20  // задержка таймера 4 (вакуум)
 
bool timer1_start_flag = false; // флаг запуска таймера 1
bool timer2_start_flag = false; // флаг запуска таймера 2
bool timer3_start_flag = false; // флаг запуска таймера 3
bool timer4_start_flag = false; // флаг запуска таймера 4
bool timer5_start_flag = false; // флаг запуска таймера 5
bool timer6_start_flag = false; // флаг запуска таймера 6
int tmrCnt = 0; // счетчик таймера 
 
#define VCC 4.95    // !!!ОБЯЗАТЕЛЬНО!!! задать точное значение питания 
// Pt1000 коэффициенты 
#define A 0.0039083
#define B -0.0000005775
#define R0 1000
 
 
//*********************************************************************
// вычисление напряжения Ut(в Вольтах) на датчике температуры по прочитанному значению ADC (АЦП) 
double ADC_to_Ut (int adc_val){
 
    return VCC / 1024 * adc_val;
}
//*********************************************************************
// вычисление сопротивления Rt датчика температуры по напряжению Ut на нем 
double Ut_to_Rt (double ut){
 
    return ut * 1000 / (VCC - ut);
}
//*********************************************************************
// вычисление температуры t(в Целсиях) по сопротивлению датчика Rt 
int Rt_to_t (double rt){
 
    double d = A * A - 4 * B * (1 - rt / 1000);
    return (-A + sqrt(d)) / (2 * B);
}
//*********************************************************************
// поддержка температуры между заданными t1 и t2, (current - текущее значение) 
void set_pressure (int p1, int p2, int current){
 
    if (current < p1){ // включаем ТЭН, поднимаем температуру 
        PORTB |= (1<<1);    // тэн 
        //PORTC &= ~(1<<2);
        //PORTC &= ~(1<<3);
        //PORTB &= ~(1<<2);
    }
    else if (current >= p2){ // выключаем ТЭН 
        PORTB &= ~(1<<1);
    }
}
//*********************************************************************
// управление клапаном подачи пара 
void set_podacha (bool f){
 
    if (f){
        PORTC |= (1<<2);  // вкл. пар в камеру 
    }
    else {
        PORTC &= ~(1<<2); // выкл. пар в камеру 
    }
}
//*********************************************************************
// управление продувкой 
void set_produvka (bool f){
 
    if (f){
        PORTC |= (1<<3);  // вкл продувка 
    }
    else {
        PORTC &= ~(1<<3); // выкл продувка 
    }
}
//*********************************************************************
// управление вакуумом 
void set_vakum (bool f){
 
    if (f){
        PORTB |= (1<<2);  // вкл вакуум 
    }
    else {
        PORTB &= ~(1<<2); // выкл вакуум 
    }
}
//*********************************************************************
// управление впуском после вакуума 
void set_vpusk (bool f){
 
    if (f){
        PORTB|= (1<<0);   // вкл впуск 
    }
    else {
        PORTB &= ~(1<<0); // выкл впуск 
    }
}
//*********************************************************************
void setup (){
 
    DDRC |= (1<<DDC2) | (1<<DDC3);              // светодиоды: PC2-PODACHA, PC3-PRODUV 
    DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2);  // светодиод PB0-VPUSK, PB1-TEN, PB2-VAKUM 
    
    DDRC &= ~((1<<DDC1) | (1<<DDC0));           // аналоговые входы PC1/ADC1 и PC0/ADC0 
    ADCSRA |= (1<<ADEN);                        // разрешаем работу АЦП 
    ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);  // частота дискретизации 125 кГц 
 
    ADMUX |= (1<<REFS0);    // внешний источник 5 В 
    ADMUX &= ~(1<<REFS1);   // 
    ADMUX &= ~(1<<ADLAR);   // правостороннее выравнивание 
    ADMUX &= ~(1<<MUX3) | (1<<MUX2)| (1<<MUX1); // очистить биты выбора канала 
    ADMUX |= (1<<MUX0);     // задействуем ADC1 
    ADCSRA |= (1<<ADSC);    // запускаем АЦП 
    
  // Инициализация дисплея I2C 1602 
  lcd.init();                 // инициализация дисплея 
  lcd.backlight();            // включить подсветку дисплея 
    
    // Вывод HELLO и очистка 
  lcd.setCursor(5,2);
  lcd.print("Hello");
  lcd.setCursor(5,1);
  lcd.print("1602");
 
    delay(2000);
  lcd.clear();
}
//*********************************************************************
void loop (){
char t_adc[5];
 
  lcd.clear();
  
  // вычисляем температуру в одну строку от считанного ADC 
  int t =   Rt_to_t(Ut_to_Rt(ADC_to_Ut(ADC)));
  // конвертируем числовое значение t температуры в строку для вывода на LCD 
  itoa(t, t_adc, 10);
  lcd.print(t_adc);
  lcd.setCursor(0, 1);
 
  // переключаем канал на АЦП0 для датчика давления 
  ADCSRA &= ~(1<<ADEN);   // stop АЦП 
  ADMUX &= 0xF0;          // выбрать АЦП0 
  ADCSRA |= (1<<ADEN);    // разрешаем работу АЦП 
  ADCSRA |= (1<<ADSC);    // запускаем АЦП 
  delay(1);               // пропускаем первые несколько конверсий 
  
  int pressure = ADC;     // Cчитываем ADC 0 канал - давление 
  itoa(pressure, t_adc, 10);
  lcd.print(t_adc);
 
  if (!timer1_start_flag){ // если таймер 1 не запущен 
    set_pressure(P_LOW, P_HIGH, pressure);        // авторегулировка давленияв заданном интервале 
    if (pressure >= P_PODACHA) set_podacha(true); // подача пара 
    if (pressure >= P_HIGH){
      set_produvka(true);
      timer1_start_flag = true; // запуск таймера 1 
    }
  }
  else if (!timer2_start_flag){ // если таймер 1 запущен, а таймер 2 еще нет 
    set_pressure(P_LOW, P_HIGH, pressure);  // авторегулировка давленияв заданном интервале 
    if (tmrCnt >= TIMER1_DELAY_SEC){ // таймер 1 истек 
      set_produvka(false);
      timer2_start_flag = true; // запуск таймера 2 
      tmrCnt = 0;
    }
    else {
      tmrCnt++;
      itoa(tmrCnt, t_adc, 10);  // отображаем таймер на дисплей в секундах 
      lcd.print(" Produv ");
      lcd.print(t_adc);
    }
  }
  
  if (timer2_start_flag && (!timer3_start_flag)){ // если таймер 2 запущен, а таймер 3 еще нет 
    set_pressure(P_LOW, P_HIGH, pressure);  // авторегулировка давленияв заданном интервале 
    if (tmrCnt >= TIMER2_DELAY_SEC){
      PORTB &= ~(1<<1);   // выкл ТЭН 
      set_podacha(false); // выкл клапан подачи пара 
      set_produvka(true); // открыть продувку 
      tmrCnt = 0;
      timer3_start_flag = true;
    }
    else {
      itoa(tmrCnt, t_adc, 10);  // отображаем таймер на дисплей в секундах 
      lcd.print(" Steril ");
      lcd.print(t_adc);
      tmrCnt++;
    }
  }
  
  if (timer3_start_flag && (!timer4_start_flag)){ // если таймер 3 запущен, а таймер 4 еще нет (на самом деле это не совсем таймер, а ожидание выравнивания давления) 
    if (pressure > P_SPUSK){
      lcd.print(" Spusk ");
    }
    else {
      set_produvka(false);  // выкл. продувку 
      set_vakum(true);      // вкл. вакуум 
      tmrCnt = 0;
      timer4_start_flag = true;
    }
  }
  
  if (timer4_start_flag && (!timer5_start_flag)){ // если таймер 4 запущен, а таймер 5 еще нет 
    if (tmrCnt >= TIMER4_DELAY_SEC){
      set_vakum(false);
      set_vpusk(true);
      tmrCnt = 0;
      timer5_start_flag = true;
    }
    else if (pressure > P_VACUM){
      itoa(tmrCnt, t_adc, 10);  // отображаем таймер на дисплей в секундах 
      lcd.print(" Vacum ");
      lcd.print(t_adc);
      tmrCnt++;
    }
  }
  
  if (timer5_start_flag){ // если последний таймер 5 запущен (на самом деле это не совсем таймер, а ожидание выравнивания давления) 
    if (pressure > P_VPUSK){
      lcd.print(" Vpusk ");
    }
    else {
      set_vpusk(false);
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print("Okoncheno");
      delay(250);
      while(1);
    }
  }
 
  // переключаем канал  на АЦП1 
  ADCSRA &= ~(1<<ADEN);   // stop АЦП 
  ADMUX &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1));
  ADMUX |= (1<<MUX0);     // задействуем ADC1 
  ADCSRA |= (1<<ADEN);    // разрешаем работу АЦП 
  ADCSRA |= (1<<ADSC);    // запускаем АЦП 
  delay(970);             // задержка на каждой итерации, чтобы с учетом остального кода была одна секунда на каждый круг, тогда один тик таймера это одна секунда 
}
//*********************************************************************
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.12.2025, 06:44
Ответы с готовыми решениями:

Скейтч для расчета дней
добрый день, подскажите где мне помогут с таким вопросом: скетч для вычисления количества дней...

Переделка налобного фонарика к 12 вольтам
В связи с тем что в электронике слаб, помогите собрать схемку, чтобы запитать налобный фонарик...

Информационный стенд. Нужно переделать чужой код
Это стенд для обучения медиков по кровообращению. В общем есть 2 режима: обучение и контроль, в...

3
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
14.12.2025, 10:28
А схему можно привести?

Добавлено через 26 минут
И как там 6 таймеров реализовано на 1 переменной? Переменная постоянно инкрементируется, а временные интервалы разностями считаются? - Так, или как-то по-другому?
1
0 / 0 / 0
Регистрация: 08.12.2020
Сообщений: 13
14.12.2025, 13:52  [ТС]
да конечно
то что эти таймеры на одной переменной (наверное подробности не знаю)
да там 6 таймеров 3 из них работают отчитывают время
3 таймера это не таймеры просто запускаются для ожидания выравнивания давления
Миниатюры
Переделать скейтч  
0
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
14.12.2025, 14:28
Удалите 167 и 170 строки, тогда не будет ждать превышения давления. А про подачу
Цитата Сообщение от pulot Посмотреть сообщение
set_podacha(true);
- здесь она включается. Если надо, чтобы она здесь не включалась(а включалась позже, то эту строку тоже надо удалить.
Цитата Сообщение от pulot Посмотреть сообщение
set_podacha(false);
- здесь подача выключается. Закончил работу Таймер2 и начинает работу Таймер3. Если в этом месте нужно включить подачу, то в этой строке нужно написать true в скобках.
Если после Таймера1 нужно включить подачу, то эту строку переместите сразу после 174 строки.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.12.2025, 14:28
Помогаю со студенческими работами здесь

Переделка БП LC-200C в регулируемый
Драсте, есть данный блок питания - решил переделать в регулируемый, изучил материал по этому...

Переделать управление вертолетом
Здравствуйте. Есть у меня китайсткый вертолёт РУ и китайскый машинка РУ. Мне надо с машинки забрать...

Переделка портативного фонаря в зарядку для мобильника
На днях купил фонарь, в нем датчик движения с паузой примерно в минуту, 8 smd светодиодов,...

Питание колонок от USB переделать на сетевое
Имеются две небольшие колонки питающиеся через USB порт, а звук идет через штекер 3.5. То есть от...

Переделка скрипта LCD HD44780 под другие порты. (atmega8 - atmega328)
Помогите пожалуйста, переделать скрипт LCD HD44780. Подключаю как на рис.1. Но, это не очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru