так что разбег шагов надо делать 15-17С.
логика простая:
1. >= 90 зуммер +красный цвет.
2. >= 85 красный.
3. >= 60 (желтый или какой другой)
4. <= 40 синий.
Ну я вот про это и говорю. А кто-то посмотрит на ваше сообщение и также сделает, не зная что у вас металлический корпус чайника, и у него, на пластмассовом корпусе, разница достигнет 30 градусов или даже больше.Karl2233 писал(а):датчик будет плотно прилегать к корпусу, вчера мерял - при кипении на корпусе (он в моём металлический) на корпусе 85-90.
так что вот.
Блять, вы на какой степени рекурсии остановитесь ,а ?Karl2233 писал(а):а DS точнее чем диод....
15-20 это коррекция а не точность измерений.bad2cat писал(а):Блять, вы на какой степени рекурсии остановитесь ,а ?Karl2233 писал(а):а DS точнее чем диод....![]()
Это две схемы - с несравнимой сложностью.
И как это "DS точнее чем диод" - вы о чём это вообще?
про 15-20 градусов разницы с водой забыли?Это точнее?
Карл, какая "коррекция"? Это погрешность измерения.Karl2233 писал(а):15-20 это коррекция а не точность измерений.
Код: Выделить всё
with
AVR,
AVR.MCU,
AVR.Wait,
Interfaces,
One_Wire;
use AVR, AVR.MCU,Interfaces;
procedure Main is
RED_pin: constant := 0;
GREEN_pin: constant := 2;
BLUE_pin: constant := 1;
BEEP_pin: constant := 3;
black_pin: constant := 7;
RED: boolean renames PORTB_Bits(RED_pin);
GREEN: boolean renames PORTB_Bits(GREEN_pin);
BLUE: boolean renames PORTB_Bits(BLUE_pin);
BEEP: boolean renames PORTB_Bits(BEEP_pin);
low_byte, high_byte, t: Unsigned_8 := 0;
procedure Wait_ms is
new AVR.Wait.Generic_Busy_Wait_Milliseconds(Crystal_hertz => 1_200_000);
state: Bit_Number := 7;
procedure switch_color(e: Bit_Number) is
begin
if e=state then return; end if;
for i in 0..255 loop
for j in 1..255 loop
PORTB_Bits(state) := (j>i);
PORTB_Bits(e) := (j<=i);
end loop;
end loop;
state := e;
red := red_pin = state;
blue := blue_pin = state;
green := green_pin = state;
end switch_color;
begin
RED := low;
GREEN := low;
BLUE := low;
BEEP := low;
DDRB_Bits := (0..3 => DD_Output, others => DD_Input);
BEEP := true;
wait_ms(700);
BEEP := false;
wait_ms(700);
BEEP := true;
wait_ms(700);
BEEP := false;
loop
if One_wire.Reset then
One_Wire.Send_command(16#CC#);
One_Wire.Send_command(16#44#);
end if;
case t is
when 1..30 => switch_color(blue_pin); beep := false;
when 31..70 => switch_color(green_pin); beep := false;
--when 51..70 => red := true; green := true; blue := false; beep := false;
when 71..95 => switch_color(red_pin); beep := false;
when 96..110 => if state=RED_pin then switch_color(black_pin); else switch_color(red_pin); end if; PINB_Bits(BEEP_pin) := true;
when others => red := true; green := true; blue := true; beep := true; Wait_ms(800);
end case;
if One_wire.Reset then
One_Wire.Send_command(16#CC#);
One_Wire.Send_command(16#BE#);
low_byte := One_wire.Get;
high_byte := One_wire.Get;
end if;
high_byte := shift_left(high_byte,4) and 2#0111_0000#;
low_byte := shift_right(low_byte,4) and 2#0000_1111#;
t := high_byte or low_byte;
--case t is
-- when 1..30 => red := false; green := false; blue := true; beep := false;
-- when 31..50 => red := false; green := true; blue := false; beep := false;
-- when 51..70 => red := true; green := true; blue := false; beep := false;
-- when 71..95 => red := true; green := false; blue := false; beep := false;
-- when 96..110 => PINB_Bits(RED_pin) := true; green := false; blue := false; PINB_Bits(BEEP_pin) := true;
-- when others => red := true; green := true; blue := true; beep := true;
--end case;
end loop;
end Main;
В Челябинске (240 метров над морем)Nizam писал(а):76-95 Красный
96-110 Пульсирующий красный с пищалкой
чё троллишь что-ли, по третьему кругу рекурсии?Karl2233 писал(а):если кипит при 100, то на корпусе 85.
если вода в чайнике 60, то на корпусе 45.
это именно коррекция.
а вот погрешность выглядит так:
кипит при 100, а где-то 80 или 90.
так что коррекция это константа, зависящая от теплопередачи корпуса.
а погрешность - это отклонение зависящее от многих причин.
Андрей СШ писал(а):Сделал плавное переключение цветов. В процессе пока отвалился жёлтый.
1-30 - синий
31-70 - зелёный
70-95 - красный
96-110 - пульсирующий (не мигающий) красный с пищалкой.
Добавил писк при включении чайника.
Плавное изменение цвета с температурой не получается. ШИМ-программный, OneWire тоже и оба с высоким приоритетом. Проц поделить не получается.
С жёлтым тоже фигня. Поскольку он имитируется двумя светодиодами, то его яркость соответственно выше чем у чистых цветов. Надо шимить на 50% красный и зелёный постоянно, а это невозможно из-за конфликта с OneWire.
Теоретически можно конечно красный и зелёный повесить на аппаратный ШИМ, но это не позволяет получить другие промежуточные цвета. Кроме прочего аппаратный ШИМ имеет небольшой баг в виде коротких вспышек при переходе через 0.
--------------------------------Спойлер
Код: Выделить всё
with AVR, AVR.MCU, AVR.Wait, Interfaces, One_Wire; use AVR, AVR.MCU,Interfaces; procedure Main is RED_pin: constant := 0; GREEN_pin: constant := 2; BLUE_pin: constant := 1; BEEP_pin: constant := 3; black_pin: constant := 7; RED: boolean renames PORTB_Bits(RED_pin); GREEN: boolean renames PORTB_Bits(GREEN_pin); BLUE: boolean renames PORTB_Bits(BLUE_pin); BEEP: boolean renames PORTB_Bits(BEEP_pin); low_byte, high_byte, t: Unsigned_8 := 0; procedure Wait_ms is new AVR.Wait.Generic_Busy_Wait_Milliseconds(Crystal_hertz => 1_200_000); state: Bit_Number := 7; procedure switch_color(e: Bit_Number) is begin if e=state then return; end if; for i in 0..255 loop for j in 1..255 loop PORTB_Bits(state) := (j>i); PORTB_Bits(e) := (j<=i); end loop; end loop; state := e; red := red_pin = state; blue := blue_pin = state; green := green_pin = state; end switch_color; begin RED := low; GREEN := low; BLUE := low; BEEP := low; DDRB_Bits := (0..3 => DD_Output, others => DD_Input); BEEP := true; wait_ms(700); BEEP := false; wait_ms(700); BEEP := true; wait_ms(700); BEEP := false; loop if One_wire.Reset then One_Wire.Send_command(16#CC#); One_Wire.Send_command(16#44#); end if; case t is when 1..30 => switch_color(blue_pin); beep := false; when 31..70 => switch_color(green_pin); beep := false; --when 51..70 => red := true; green := true; blue := false; beep := false; when 71..95 => switch_color(red_pin); beep := false; when 96..110 => if state=RED_pin then switch_color(black_pin); else switch_color(red_pin); end if; PINB_Bits(BEEP_pin) := true; when others => red := true; green := true; blue := true; beep := true; Wait_ms(800); end case; if One_wire.Reset then One_Wire.Send_command(16#CC#); One_Wire.Send_command(16#BE#); low_byte := One_wire.Get; high_byte := One_wire.Get; end if; high_byte := shift_left(high_byte,4) and 2#0111_0000#; low_byte := shift_right(low_byte,4) and 2#0000_1111#; t := high_byte or low_byte; --case t is -- when 1..30 => red := false; green := false; blue := true; beep := false; -- when 31..50 => red := false; green := true; blue := false; beep := false; -- when 51..70 => red := true; green := true; blue := false; beep := false; -- when 71..95 => red := true; green := false; blue := false; beep := false; -- when 96..110 => PINB_Bits(RED_pin) := true; green := false; blue := false; PINB_Bits(BEEP_pin) := true; -- when others => red := true; green := true; blue := true; beep := true; --end case; end loop; end Main;
Прошивка не прилепилась
Вторая прошивка для измерения температуры:
красные мигания - десятки градусов
синие - единицы
Код: Выделить всё
with
AVR,
AVR.MCU,
AVR.Wait,
Interfaces,
One_Wire;
use AVR, AVR.MCU,Interfaces;
procedure Main is
RED_pin: constant := 0;
GREEN_pin: constant := 2;
BLUE_pin: constant := 1;
BEEP_pin: constant := 3;
black_pin: constant := 7;
RED: boolean renames PORTB_Bits(RED_pin);
GREEN: boolean renames PORTB_Bits(GREEN_pin);
BLUE: boolean renames PORTB_Bits(BLUE_pin);
BEEP: boolean renames PORTB_Bits(BEEP_pin);
low_byte, high_byte, t: Unsigned_8 := 0;
procedure Wait_ms is
new AVR.Wait.Generic_Busy_Wait_Milliseconds(Crystal_hertz => 1_200_000);
state: Bit_Number := 7;
procedure switch_color(e: Bit_Number) is
begin
if e=state then return; end if;
for i in 0..255 loop
for j in 1..255 loop
PORTB_Bits(state) := (j>i);
PORTB_Bits(e) := (j<=i);
end loop;
end loop;
state := e;
red := red_pin = state;
blue := blue_pin = state;
green := green_pin = state;
end switch_color;
begin
RED := low;
GREEN := low;
BLUE := low;
BEEP := low;
DDRB_Bits := (0..3 => DD_Output, others => DD_Input);
BEEP := true;
wait_ms(700);
BEEP := false;
wait_ms(700);
BEEP := true;
wait_ms(700);
BEEP := false;
loop
if One_wire.Reset then
One_Wire.Send_command(16#CC#);
One_Wire.Send_command(16#44#);
end if;
case t is
when 1..50 => switch_color(blue_pin); beep := false;
when 51..80 => switch_color(green_pin); beep := false;
when 81..95 => switch_color(red_pin); beep := false;
when 96..110 => if state=RED_pin then switch_color(black_pin); else switch_color(red_pin); end if; PINB_Bits(BEEP_pin) := true;
when others => red := true; green := true; blue := true; beep := true; Wait_ms(800);
end case;
if One_wire.Reset then
One_Wire.Send_command(16#CC#);
One_Wire.Send_command(16#BE#);
low_byte := One_wire.Get;
high_byte := One_wire.Get;
end if;
high_byte := shift_left(high_byte,4) and 2#0111_0000#;
low_byte := shift_right(low_byte,4) and 2#0000_1111#;
t := high_byte or low_byte;
end loop;
end Main;
Залил все в норме.. Вот только начинает кипеть выключается .Пульсирующая красная опаздывает.. Надо бы ее порог изменитьАндрей СШ писал(а):Да это из-за того, что при включении температура неизвестна срабатывает аварийная сигнализация.
Исправил.