Понадобился мне для одного проекта датчик уровня и температуры масла. Подумал: "возьму такой же как на Пассате, вроде неплохо показывает". Чтобы поиграться заказал на алике.
Прицепил к осциллографу — что-то показывает. Зажибись, думаю, щас запишу показания в разных точках, тарирую и будет и меня датчик. Бросаю в стакан с водой — показания не меняются. Довожу воду до кипения — на месте. Вытаскиваю из стакана, грею феном — фиг.
Короче, китайский датчик можно ставить ТОЛЬКО чтобы погасить ошибку. Он НИКОГДА не выдаст ошибку — по его мнению масло всегда в уровне. По сути это бутафория, внутри стоит простой генератор импульсов.
По итогу я купил новый датчик Hella, потом разбил поддон на тачке и поставил новый датчик в машину, а с машины датчик ушел на опыты.
Делюсь своими изысканиями.
Датчик измеряет температуру и уровень масла, передаёт и то и другое по одному проводу, изменяя ширину импульсов.
Сначала идёт что-то вроде синхроимпульса. Ширина немного плавает, в пределах 15-25мс, но какой-то зависимости от уровня или температуры я не заметил.
Следом передаётся температура, двумя равными импульсами (низкий уровень+высокий). Ширина этого импульса в кипящем чайнике у меня получилась около 66мс, в стакане со льдом — 39мс. Это примерно 0.27мс на градус.
Дальше идёт уровень. Тут зависимость обратно-пропорциональная — чем больше уровень, тем меньше ширина импульса. В полностью погруженном состоянии колеблется от 2 до 10мс примерно. В полностью извлеченном — болтается около 500мс, но бывает и 800мс. Причем непохоже, чтобы зависимость была линейная — при заполнении датчика на 75% ширина импульса обычно около 110мс.
Температура тоже не шибко линейная, но +- лапоть показывает. Считаю так: температура=(ширина импульса — 39) * 100 / 27
А для расчета уровня я приравниваю всё, что шире 560мс к 560, а всё, что короче 10мс к 10мс. И так линеаризую. Получается нифига не точно в абсолютных цифрах, но для моих нужд — за глаза. Мои нужды — это мониторинг уровня и температуры масла к поддоне воздушного компрессора высокого давления.
И ещё иногда датчик подглючивает и не генерирует вообще никакого импульса после температурного — то есть идёт синхро-температура-синхро. Обычно это происходит при полном погружении датчика, на осциллографи в даже иголки никакой не видно. Благо, это легко фильтруется.
Весь код приводить не буду, у меня там кроме этого датчика ещё вязанка разных датчиков обрабатывается, но там всё просто — прерывание по изменению уровня, и вот его обработчик:
void deal_with_oil_sensor(){
for(uint8_t i=0; i<3; i++){
oil_sensor_stack[i] = oil_sensor_stack[i+1];
}
time_us = micros();
oil_sensor_stack[3] = time_us — oil_sensor_last_micros;
oil_sensor_last_micros = time_us;
if(oil_sensor_stack[0] > 5000 && oil_sensor_stack[0] < 25000){ //syncro impulse is between 5 and 25ms
if(oil_sensor_stack[1] > 6000 && oil_sensor_stack[2] > 6000){ //temperature is above ~-50 Celsius
if(abs((long)oil_sensor_stack[1] — (long)oil_sensor_stack[2]) < 1000){ //temperature data difference is less than 3ms
last_oil_data_at = time;
//Will convert to t*127 to match DS18B20 data conversion.
//26 is the coeeficient beween ms and C. Calculated is 27, but 26 is closer to reality in low temp range. (66ms = 100C, 39ms = 0C)
sensors_data[12] = ((oil_sensor_stack[1]/10 + oil_sensor_stack[2]/10) — 3900) * 127 / 26;
sensors_data[13] = oil_sensor_stack[3]/1000; //divided by 1000 to deal with potential overflow. ms accuracy should be enough
}
}
}
}
Короче, уже несколько месяцев датчик с моей машины стоит в компрессоре, иправно показывает уровень и температуру.
И напоследок, для тех, кто читает только последнее предложение: не покупайте датчик G266 с Али!