Энкодер китайский, глючит довольно неплохо (вместо + иногда - или проскакивают несколько значений).dth, 31 Мая 17, 20:28Вот видео
Alex Morozov вроде поборол энкодер.
С 4-й минуты смотреть про него.
Поэтому вставить проверку наличия ключа - весьма полезно. Ну типаOldBean, а как это применить на практике? Можно поподробней, на примере?
if id in Ts: делаем что-тоOldBean, 05 Дек. 17, 03:04
Можно поподробней, на примере?ZagAl, 05 Дек. 17, 20:07Можно.
конкретный_ключ in имя_словаря
#coding:utf-8 # Это позволяет использовать русские буквы в этом тексте
# Присвоим переменным значения заводских ID температурных датчиков
hid = 0x8000001ee27b # ID датчика температуры куба
cid = 0x8000001ef6e6 # ID датчика температуры колонны
did = 0x000006273720 # ID датчика температуры дефлегматора
wid = 0x8000000419af # ID датчика температуры выходящей воды
# Вспомогательный массив (точнее - кортеж), чтобы обращаться к датчикам
# по индексу 0, 1, 2 и т.д., а не по их заводскому ID
tids = (hid, cid, did, wid)
# Допустим измерены какие-то температуры. Здесь мы забьем данные в словарь "ручками",
# но в реальном скрипте это делает метод sens.DS18B20.Ts() класса DS18B20 в модуле sens
Ts = {hid : 95.37, cid : 78.723, did : 78.13, wid : 33.21} # Получили вот такой словарь
# В качестве примера использования этого словаря - выдадим все температуры
# на терминал в виде одной строки. Сформируем эту строку.
s = "Температуры: " # Это будет начало строки
for id in tids: # Пробегаем в цикле по всем ID датчиков
if id in Ts: # Если датчик с таким ID есть в словаре, то выведем его температуру
s += "% 7.2f" % (Ts[id])
else: # А если такого датчика нет - ставим прочерк
s += " --- "
print s # Теперь выведем получившуюся строку на терминал
# Теперь предположим, что датчик (например, на колонне - cid) отвалился в процессе
# работы. После измерения температуры нам выдадут такой словарь (уже без cid!):
Ts = {hid : 95.42, did : 78.12, wid : 33.20}
# Посмотрим что напечатается
s = "Температуры: "
for id in tids: # Пробегаем по всем ID датчиков
if id in Ts: # Если датчик с таким ID есть в словаре пишем T
s += "% 7.2f" % (Ts[id])
else: # Такого датчика нет - ставим прочерк
s += " --- "
print s
# А вот если не проверять наличие ключа в словаре и попытаться выдать температуры
# так, как написано ниже, то интерпретатор ругнется и выдаст исключение.
# Проверяем:
s = "Температуры: "
for id in tids: # Пробегаем по всем ID датчиков невзирая...
s += "% 7.2f" % (Ts[id])
print s
python 01.py
Температуры: 95.37 78.72 78.13 33.21
Температуры: 95.42 --- 78.12 33.20
Traceback (most recent call last):
File "01.py", line 44, in <module>
s += "% 7.2f" % (Ts[id])
KeyError: 140737490384614
"""Добавим для выдачи текущие значения температур с датчиков"""
Ts = sens.DS18B20.Ts() # Сначала их измерим
for id in tids: # Теперь добавим в строки для выдачи
if id in Ts: # Если датчик с таким ID есть в словаре, то выведем его температуру
if id == cid: # Подкрасим температуру в колонне для консоли
ss += "\x1b[32m% 7.2f\x1b[0m" % (Ts[id])
elif id == did: # Подкрасим температуру в дефлегматоре для консоли
ss += "\x1b[33m% 7.2f\x1b[0m" % (Ts[id])
else: ss += "% 7.2f" % (Ts[id])
s += "% 7.3f" % (Ts[id])
else: ss += " --- " # А если такого датчика нет - ставим прочерк.
s += " --- "
"""Выводим информацию о разности температур в колонне и дефлегматоре"""
...
if step_number == 1:
T1col = Ts[cid]
...
...
if id in Ts: # Если датчик с таким ID есть в словаре, то выведем его температуру
...
else:
print '\nТемпературный датчик с ID = ' + str(id) + ' неисправен. Завершение работы.'
... Здесь все выключить (ТЭН, отбор - на 0 и т.п.) ...
sys.exit(1)
...
прекратить процесс и выдать сообщение операторуOldBean, 07 Дек. 17, 03:01ИМХО лучше сперва выдать сообщение, а прекратить процесс по таймауту через Икс времени -- оператор может успеть пофиксить проблему с датчиком без остановки процесса, отсутствие датчика в течение нескольких минут некритично. Сорры за оффтоп.
sha256sum 2017-11-29-raspbian-stretch.zip
df -h
df -h
/dev/sdb1
/dev/sdb2
sudo umount /dev/sdb1
sudo umount /dev/sdb2
sudo dd bs=4M if=2017-11-29-raspbian-stretch.img of=/dev/sdb conv=fsync
Plugin {
type=xkb
Config {
...
}
}
Plugin {
type=xkb
Config {
Model=pc105
LayoutsList=us,ru
VariantsList=,
ToggleOpt=grp:lctrl_lshift_toggle
KeepSysLayouts=0
FlagSize=1
DisplayType=0
}
}
sudo raspi-config
sudo apt-get update
sudo apt-get upgrade
sudo leafpad /etc/lightdm/lightdm.conf
[SeatDefaults]
xserver-command=X -s 0 -dpms
В планах: 1) Повысить надежность обмена малинки с контроллерами по I2C. В простейшем случае - за счет дублирования посылок и последующим "голосованием" полученных данных. А там посмотрим. Может и этого хватитOldBean, 02 Дек. 17, 09:37Я конечно не спец в протоколах, но может быть использовать часть идеи, заложенной в сверх надежных обменах данных автомобильных шин CAN? К примеру:
sudo apt-get update
sudo apt-get install arduino
sudo apt-get install gcc-avr avr-libc avrdude
mkdir -p wrk/test_01
avr-gcc -mmcu=attiny85 -Os -o %e.o %e.c && avr-objcopy -O ihex %e.o %e.hex
avrdude -c usbasp -p t85 -U flash:w:%e.hex
#define F_CPU 1000000UL // Заводские установки тактовой частоты - 1 МГц
// Это опредение нужно для корректной работы
// функции _delay_ms()
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRB |= 0b00001000; // Пин 3 - на вывод
while(1) { // Бесконечный цикл
PORTB |= 0b00001000; // Пин 3 - на верхний уровень
_delay_ms(1000); // Задержка 1 сек
PORTB &= 0b11110111; // Пин 3 - вниз
_delay_ms(1000); // Опять задержка 1 сек
}
return 0;
}
Сделал всё строго пошагово...gol_avto, 11 Дек. 17, 10:51Значит не все строго сделали, т.к. запускается совсем другой компилятор - gcc, а не кросс-компилятор gcc-avr. См. Ваш же скриншот во вложении. Проверьте настройки Geany (пункт 12.3.4.). У Вас все как на моей картинке в этом пункте?
avr-gcc -mmcu=attiny85 -Os -o main.o main.c
avr-objcopy -O ihex main.o main.hex
avrdude -c usbasp -p t85 -U flash:w:main.hex
софорумчане, колитесь, кто-где брал фольгу нержавеющую для модернизации клапанаgindos, 11 Дек. 17, 12:27ух... даже и не знаю как подсказать.
я тут с GPIO мудрю...BogAD, я не сторонник тотальной автоматизации. Я сторонник ненавязчивой автоматизации. Т.е. - когда автоматизируются только те функции, ручное выполнение которых либо затруднительно, либо сильно раздражает, либо приводит к ухудшению качества продукта. Поэтому я скорее поставлю 10-литровую бутылку на прием тела, чем буду лепить какой-нибудь датчик уровня к 3-литровой банке, интерфейс к нему и соответствующий софт.
Может на базе температурного сервера замутить?
Аж 8 линий логического ввода можно запилить. А надо ли столько?
Кроме трех датчиков, датчика протечки, аварийное давление в кубе и уровня в приемной посуде, ни чего в голову не приходит.
А если это так, то и Тиньки достаточно.BogAD, 11 Дек. 17, 14:08