Задачи для начинающих
Выкладывайте свои ответы - обсудим.
А если не будут обсуждать, а будут смеятся над ответом, или пойдут ироничные или саркастические шутки?
Смотря какой террариум. Если он большой, то я предпологаю что в террариуме должно находится несколько датчиков температуры, а так-же несколько подогревательных элементов, допустим по бокам, и посередине. Ведь в квартире иногда бывают 2 или 3 обогревателя, но в константу MAX_COUNT_SENSORS можно просто установить значение 1, тогда будет от одного датчика проверяться. И если это проект для ардуино, то датчики будут возвращать скорей всего числа с плавоющей точкой, что-то вроде около нуля, а range в Python отказывается иметь дело с float, берёт только целые числа. Причём датчики ардуино, будут давать погрешность, калибровка датчиков (термометров) это тот ещё геморрой. А MicroPython какой-нибудь урезаный, там нет прям таких крутых библиотек как в нормальном Python 3.x
Требуется вначале построить Flussdiagram, а потом уже прогу на питоне.
Ох, а мне вот проще наоборот.
"Делай ..." и "Если ... То... Иначе..."
А мне больше нравится использовать ...in range...
if avg_temp in range(MIN, MED): ... elif avg_temp in range(MED, MAX): ... elif avg_temp > MAX: ... else: ...
Начну с кода, а завтра попробую Flussdiagram нарисовать.
import random import sys #Константы-------------- MIN_TEMP = 0 #Минимальная температура MED_TEMP = 5 #Средняя температура MAX_TEMP = 10 #Максимальная температура STEP = 1 #Шаг MAX_COUNT_SENSORS = 5 #Максимальное количество сенсоров #Функци----------------- #Поиск среднего значения def avg(items): return sum(items) / len(items) #Делаем теплее def make_warm(i, idx): #Инкрементация массива idx индекса i, на один шаг, с шагом STEP i[idx] += STEP #Делаем холоднее def make_cold(i, idx): #Декрементация массива idx индекс i, на один шаг, с шагом STEP i[idx] -= STEP #Остужаем всё def make_cold_all(i): #Декрементация всех элеметнов массива i, с шагом STEP for x in i: i[i.index(x)] -= STEP #Сброс def restart_all(mv, i): #Устанавливаем для каждого элемента массива i, значение mv for x in i: i[i.index(x)] = mv #Начало----------------- #Инициализация переменных temp = [] # Массив со значением от датчиков index = 0 # Индекс avg_temp = 0 # Средняя температура cmd = '' # Команда, Y-дальше мониторить/A-выключить подогрев/N-выход times = 0 # Сколько раз убавлять температуру #Инициализация #temp = [1, 3, 4, 5, 10] #Главная программа------ try: #Рандомно генерируем температуру for i in range(MAX_COUNT_SENSORS): temp.append(random.randint(MIN_TEMP, MAX_TEMP)) while True: #Получаем среднее значение avg_temp = avg(temp) if avg_temp != None: avg_temp = round(avg(temp)) #Выдаём все значения температуры for i in temp: print(i) #Перенос на новую строку print('') #Среднее значение print(avg_temp) #Если среднее значение находится между минимальной и средней температуры, то: if avg_temp in range(MIN_TEMP, MED_TEMP): #Холодно print('Холодно, включаю подогреватель') #Получаем индекс массива минимальной температуры index = temp.index(min(temp)) #Подогреваем make_warm(temp, index) #Если среднее значение находится между средней и максимальной температуры, то elif avg_temp in range(MED_TEMP, MAX_TEMP): print('Нормальная температура, отключаю подогреватель') #Понижаем температуру make_cold_all(temp) #Если температура выше максимальной температуры, то elif avg_temp >= MAX_TEMP: print('Жарко, отключаю подогреватель') #Понижаем температуру index = temp.index(max(temp)) make_cold(temp, index) #Иначе ошибка else: print('Ошибка, датчики температуры сбрасываются на минимальную температуру') #Сбрасывем температуру, до минимального значения restart_all(MIN_TEMP, temp) #Спрашиваем, что делать дальше, Y-дальше, A-выключить подогрев, N-нет cmd = input('Дальше (Y-да/A-выключить подогрев/N-нет)?').upper() #Если нажали на клавишу N, то завершаем программу if cmd == 'N': break #Если нажали на клавишу A, то отключаем подогрев elif cmd == 'A': try: #Пытаемся выключить на n-раз times = int(input('На сколько выключить?')) except Exception as err: print('Ошибка ', err) else: #остужаем n-раз for _ in range(0, times): make_cold_all(temp) except Exception as err: print('Ошибка ', err)
В данной ситуации, т.е. в этом алгоритме выше MED_TEMP не поднимается, поэтому в данном алгоритме, т.е. строка elif avg_temp in range(MED, MAX): бесполезна.