Реклама ⓘ
Главная » Автоматика в быту
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Метеостанция своими руками

Метеостанция

Метеостанция построена на Picaxe микроконтроллере от Revolution Education Ltd и состоит из двух основных частей: наружный блок, который посылает свои данные каждые 2 секунды, используя передатчик на частоте 433МГц. И внутренний блок, который отображает полученные данные на 20 х 4 ЖК-дисплее, а также атмосферное давление, которое измеряется локально во внутреннем блоке.

Структурная схема метеостанции

Я пытался сохранить дизайн максимально простым и в то же время функциональным. Связь устройства с компьютером осуществляется через COM-порт. В настоящее время на компьютере непрерывно строятся графики из полученных значений, а также идет отображение значений на обычных индикаторах. Графики и показания датчиков доступны на встроенном веб-сервере, все данные сохранятся и т.о. можно посмотреть данные за любой промежуток времени.

График станции

Постройка метеостанции заняло несколько месяцев, от разработки до завершения, и в целом я очень доволен результатом. Я особенно рад, что мне удалось построить все с нуля при помощи обычных инструментов. Меня она полностью устраивает, но совершенству предела нет, и особенно это касается графического интерфейса. Я не предпринял никаких попыток коммерциализации метеостанции, но если вы думаете о создании метеостанции для себя, то это хороший выбор.

Уличные датчики

Датчики используются для измерения температуры, влажности, осадков, направления и скорости ветра. Датчики представляют собой сочетание механических и электронных устройств.

Датчик температуры и относительной влажности воздуха

Измерение температуры, пожалуй, проще всего. Для это используется датчик DS18B20. Для измерения влажности был использован HIH-3610, выдающий напряжение 0.8 - 3.9В при влажности 0% до 100%

Подключение DS18B20 и HIH-3610

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

DS18B20 и HIH-3610 на плате

Упрощенный код для каждого из датчиков приведен ниже. Более точный код, который считывает значения с точностью до одной десятой, показан на сайте Питера Андерсона. Его код используется в окончательном варианте метеостанции.

Датчик температуры обеспечивает точность ± 0.5 °C. Датчик влажности обеспечивает точность до ± 2%, так что это не очень важно, сколько знаков доступно после запятой!

Пример участка из программного обеспечения, работающего на ПК.

Температура

   main:
	  readtemp B.6, b1 		; read value into b1
	  if b1 > 127 then neg 		; test for negative
	  sertxd (#b1, cr, lf) 		; transmit value to PE terminal
	  pause 5000
	  goto main

   neg:
	  b1 = b1 - 128 		; adjust neg value
	  sertxt ("-") 			; transmit negative symbol
	  sertxt (#b1, cr, lf)		; transmit value to PE terminal
	  pause 5000
      goto main

Влажность

   main:
	  readadc B.7,b1 		; read humidity value
	  b1 = b1 - 41 * 100 / 157 	; change to %RH
 	  sertxd (#b1, "%", cr, lf)
	  pause 5000 			; wait 5 seconds
	  goto main 

Расчет показаний датчика влажности

Расчеты взяты из документации датчика Honeywell HIH-3610. На графике показывана стандартная зависимость  при 0 °C.

График HIH-3610

Напряжение с датчика измеряется на входе АЦП (B.7) микроконтроллера Picaxe 18M2. В коде, показанном выше, значение, которое представлено в виде числа от 0 до 255 (т.е. 256 значений), хранится в переменной b1.

Наша схема питается от 5В, так что каждый шаг АЦП равен:
5/256 = 0.0195 В.

На графике видно начально значение АЦП 0.8 В:
0.8 / 0.0195 = 41

Взяв значения из графика, наклон графика (с учетом смещения) примерно:
Напряжение выхода / % относительной влажности или
(2.65 - 0.8) / 60 = 0.0308 В в% RH
(В документации 0.0306)

Рассчитаем кол-во шагов АЦП на 1% влажности:
(В на % RH) / (шаг АЦП)
0.0308 / 0.0195 = 1.57

% RH = значение с АЦП - смещение АЦП / (шаги АЦП в % RH), или
% RH = значение с АЦП - 41 / 1.57

Итоговая формула расчет для микроконтроллера будет выглядеть: % RH = значение с АЦП - 41 * 100/157

Защитный корпус

Изготовление корпуса

Начните с разрезания каждой панели на две части. Планки на одной части будут крепко прикреплены с двух сторон, а на второй части только с одной стороны. Не выбрасывайте эти части - они используются.

Изготовление корпуса

К целым частям прикрепите два деревянных бруска  20мм х 20мм сверху и с низу, и прикрутите к ним другие части.

Изготовление корпуса

Обрежьте одну из частей с одной целой стороной по размеру и приклейте ее к внутренней стороне одной из сторон. Убедитесь, что планки приклеены так, что образуют вместе "^" форму. Сделайте так со всеми сторонами.

Изготовление корпуса

Измеритель скорости и направления ветра

Механическая часть

Датчики скорости и направления ветра представляют собой сочетание механических и электронных компонентов. Механическая часть идентична для обеих датчиков.

Конструкция датчика ветра

12мм вставка из фанеры (marine ply) находится между трубой из ПВХ и диском из нержавеющей стали в верхнем конце трубы. Подшипник приклеен к диску из нержавеющей стали и удерживается нержавеющей пластиной.

Конструкция датчика ветра

Как только все будет полностью собрано и настроено, открытые места герметизируются герметиком для водонепроницаемости.

Лопасти

Остальные три отверстия на фотографии предназначены для лопастей.  Лопасти длиной 80 мм дают радиус поворота 95мм. Чашки 50 мм в диаметре. Для них я использовал обрезанные флаконы от одеколона, которые имеют почти сферическую форму. Я не уверен в их надёжности, поэтому сделал их легкозаменяемыми.

Электронная часть

Схема и плата

Электроника для датчика скорости ветра состоит только из транзисторного ключа, фотодиода и двух резисторов. Они монтируются на небольшой круглой ПП  диаметром 32мм. Они установлены в трубе свободно, чтобы влага в случае её попадания стекала вниз не задевая электронику.

Анемометр

Калибровка анемометра

Анемометр - один из трех датчиков, который необходимо откалибровать (два других – счетчик осадков и датчик атмосферного давления)

Фотодиод обеспечивает два импульса за один оборот. В простой «последовательной» системе, к которой я стремился (все датчик опрашиваются поочередно), должен быть компромисс между длиной времени, затрачиваемого на опрос каждого датчика (в данном случае, подсчет импульсов) и отзывчивость системы в целом. В идеале, на полный цикла опроса всех датчиков должно уйти не более 2-3 секунд.

Калибровка анемометра

На фото выше проверка датчика при помощью мотора с регулируемыми оборотами.

 	  ; LCD-specific commands shown in blue
	
          hsersetup B9600_4, %10000 			 ; Use LCD Pin 1, no hserin 
  	  hserout 0, (13) : pause 100           	 ; Initialize LCD
 	  hserout 0, (13) : pause 100
 	  hserout 0, (13) : pause 100
 	  pause 500
 	  hserout 0, ("ac1", 13)  			 ; Clear display
 	  pause 50                				
 	  hserout 0, ("acc", 13) 
  	  hserout 0, ("ac81", 13, "adcount:  ", 13)	 ; Print the headings
 	  pause 10
  	  hserout 0, ("ac95", 13, "adpulsin: ", 13)	 ; Print the headings
  	  pause 10

	do
 	  count C.2, 1000, w0				 ; Count the pulses (two per rev)

  	  w1 = 0
 	  for b8 = 1 to 2 				 ; Measure pulse length twice
   	    pulsin C.2, 1, w2				 ; per rev and...
  	    w1 = w1 + w2
 	  next
  	  w1 = w1 / 2					 ; ...calculate average
  
 	  hserout 0, ("ac89", 13, "ad ", #w0, "   ", 13) ;Print the count value
 	  hserout 0, ("ac9d", 13, "ad ", #w1, "   ", 13) ;Print the pulse-length value
 	  pause 100
  
	loop

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

Если бы мы имели 100% КПД и лопасти вертелись-бы со скоростью ветра, то:
Радиус ротора  = 3.75"
Диаметр ротора = 7.5" = 0.625 фута
Длина окружности ротора = 1.9642 фута

1 фут/мин = 0.0113636 м/ч,
1.9642 фут/мин = 1 об = 0.02232 м/ч
1 м/ч = 1 / 0.02232 об

1 м/ч  = 44.8 об
? м/ч  = об / 44.8
= (об/мин * 60) / 44.8

Поскольку за поворот выходит два импульса
? м/ч = (импульсов в секунду * 30) / 44.8
= (импульсов в секунду) / 448

Датчик направления ветра - механическая часть

В датчике направления ветра, вместо алюминиевой пластины используется магнит, а вместо оптоэлектронного узла - специальная микросхема AS5040 (магнитный энкодер).

AS5040

На фото ниже показан 5мм магнит, установленный на торце центрального винта. Выравнивание магнита относительно микросхемы очень важно. Магнит должен быть точно по центру на высоте около 1мм над микросхемой. Как только все будет точно выровнено, датчик будет работать правильно.

Магнит

Датчик направления ветра - электронная часть

Существуют различные схемы для измерения направления ветра. В основном они состоят либо из 8 герконов расположенных под углом 45 градусов с интервалом вращающегося магнита или потенциометра который может полностью проворачиваться.


Оба метода имеют свои преимущества и недостатки. Основным преимуществом является то, что они оба просты в реализации. Недостатком является то, что они подлежат износу - особенно потенциометры. Альтернативой использованию герконов будет использовать датчика Холла для решения механического износа, но они по-прежнему ограничиваются 8 различными позициями ... В идеале, я хотел бы попробовать что-то другое и в конечном счете решил о AS5040 - поворотном магнитном датчике IC. Хотя это устройство для поверхностного монтажа (которого я стараюсь избегать), оно имеет ряд преимуществ, которые делают ее использование привлекательным!

Он имеет несколько различных форматов вывода, два из которых наиболее подходит для нашей цели. Наилучшая точность достигается с помощью SSI интерфейса. AS5040 выдает импульсы длиной от 1 мкс при 0° и до 1024 мкс при 359,6°

Схема подключения AS5040

Печатная плата

Датчик в сборе

Проверка калибровки датчика направления ветра:

   do
      readadc10 B.3, w0    ;Read from AS5040 magnetic bearing
      pause 100
      w0 = w0 * 64 / 182   ; Convert to 0 - 360 (degrees)
      debug		   ; Display in Prog/Edit debug window
   loop

Калибровка датчика

Измеритель уровня осадков

Конструкция измерителя уровня осадков

Насколько это возможно, я сделал дождемер из пластика и нержавеющей стали, основание сделано из алюминия толщиной 3 мм для жесткости.

В измерителе уровня осадков есть две ведерка. Каждое ведерко вмещает до 6 мл воды до его смещения центра тяжести, которое заставляет его вылить воду в ёмкость и подать сигнал на датчик. Когда ведро опрокидывается, алюминий флаг проходит через оптический датчик, посылающий сигнал на электронику наружного блока.

Дождемер

На данный момент, я оставил его с прозрачными стенками (потому что интересно наблюдать это работает!). Но я подозреваю, что нужно покрасить его белой краской, чтобы отражать тепло летом, во избежание испарения. Я не мог найти маленькую воронку, поэтому пришлось сделать её самому. Обратите внимание на проволоку внутри воронки и по центру желоба. Это поможет остановить поверхностное натяжение воды в воронке и помогает капать воде. Без проволоки, дождь имел бы тенденцию к "водовороту", и его траектория была-бы непредсказуемой

Воронка

Оптодатчики крупным планом:

Оптодатчики

Электронная часть дождемера

Схема дождемера

Из-за случайного характера работы датчика, программное прерывание в микроконтроллере наружного блока, казалось, логичный подход. К сожалению, некоторые команды программы, отключают механизм прерываний в то время, как они выполняются, т.о. есть вероятность, что сигнал придет в никуда.  По этим причинам, дождемер имеет собственный микроконтроллер 08М Picaxe.

Использование отдельного чипа позволяет использовать его для создания достаточно точной 1-часовой задержки для того, чтобы считать ведра в час.

     #picaxe 08M

	  Symbol ThisHour = b2				; Store the current sensor count in b2
	  Symbol LastHour = b3				; Save the previous hour's count in b3

	  ;Hardware definitions

	  Symbol DataRequest = pin3
	  Symbol BucketSensor = pin4


	  setint %00010000, %00010000			; pin4 is interrupt pin
      main:
          for w0 = 1 to 60000				; Loop for 1 hour
             pause 60
          next				
          LastHour = ThisHour				; Update Last hour's count with
          ThisHour = 0					; current hour & reset current hour
		
          goto main					; Do the next hour
 
      interrupt:
          setint %00010000, %00010000			; Re-instate interrupt
 
          if DataRequest = 1 then			; Was the interrupt from the 18M2 ?
             serout 2, N2400, ("r", LastHour, ThisHour) ; Yes, so send previous hour's count & curent count.
             do : loop while DataRequest = 1		; Wait until 18M2 stops requesting before continuing
          endif
          if BucketSensor = 1 then			; Was the interrupt from the rain sensor?
             inc ThisHour				; Yes, so increment bucket-tip count
             do : loop while BucketSensor = 1		; Make sure flag has cleared sensor before continuing
          endif

          return

Калибровка

Picaxe 18м2 получает текущее количество ведерок в час и выводит его на дисплей и компьютер.

В качестве отправной точки, я использую следующие данные:
Воронка диаметров 120мм и емкость площадью 11,311мм2
1 мм дождя = 11,311мм3 или 11,3 мл.
Каждое ведро это 5,65 мл. Таким образом, 2 ведра 2 х 5,65 = 11,3 мл (или 1 мм) осадков. Одно ведро = 0,5 мм осадков.

Для сверки, я купил дешевый стакан для измерения осадков.

Наружный блок

Схема внешнего блока

Для вышеприведенной схемы и схемы 08М Picaxe для датчика используется одна и та же топология печатной платы. Устройство питается от аккумулятора 12V 7Ah через стабилизатор 7805.
Я использовал набор RF Connect kit для беспроводной связи на 433 МГц. Комплект содержит пару специально запрограммированных PIC контроллеров. Комплект беспроводных модулей в ходе испытаний зарекомендовал себя как достаточно надежный.

Печатная плата

Печатная плата внешнего блока

На ПП установлен 08М Picaxe и 18м2. Каждый из них имеет свой собственный разъем программирования. Отдельные разъемы, каждый со своим +5 В, предназначены для каждого датчика - за исключением температуры и влажности.

Обратите внимание, что я нарисовал чертёж в Paintshop Pro поэтому я не могу гарантировать точность расстояния между выводами.

Печатная плата

Плата с датчиками

Наружный блок

Внутренний блок

Схема внутреннего блока

Во внутреннем блоке используетя 18м2 Picaxe, датчик давления и ЖК-дисплей. Также есть стабилизатор напряжения 5В.

Датчик давления

После нескольких неудачных попыток, я остановился на MPX4115A. Хотя другие датчики имеют диапазон измерения немного больше, они труднодоступны. Кроме того, другие датчики, как правило, работают от 3,3В и требуют дополнительный стабилизатор. MPX4115A выдает аналоговое напряжение от 3,79 и до 4,25В пропорционально давлению. Хотя это почти достаточное разрешение для обнаружения 1 мбар изменения давления, после некоторого обсуждения на форуме, я добавил АЦП MCP3422. Он может работать в 16-битном режиме (или выше) по сравнению с 10-битном режиме Picaxe. MCP3422 может быть связан (как в нашей схеме) в дифференциальный режим с аналоговым входом от датчика. Основным преимуществом является то, что это позволяет корректировать выход датчика, тем самым легко компенсировать ошибки MPX4115A и обеспечить простой способ калибровки датчика.

MPC3422 на самом деле имеет два дифференциальных входа, но так-как один не используется они замкнуты. Выход из MCP3422 имеет интерфейс I2C и соединяется с SDA и SCL контактам на 18м2 Picaxe – выводы B.1 и B.4 соответственно. С моей точки зрения, единственный недостаток в использовании MCP3422 том, что это небольшое устройство для поверхностного монтажа, но я его припаял к адаптеру. В дополнение к I2C интерфейсу MCP3422 18м2 просто обрабатывает поступающие данные из 433МГц беспроводной приемник, выводит данные на дисплей и передает данные на ПК. Для того чтобы избежать ошибок внутреннего блока когда компьютер не работает, нет никаких ответов от ПК. Внутренний блок передает данные и идет дальше. Он передает данные приблизительно в 2-секундным интервалом, чтобы потери данных быстро компенсировались следующий раз. Я использовал незадействованные порты на 18м2 для подключения кнопки на передней панели. Переключатель S1 (вход С.5) используется для включения подсветки ЖК-дисплея. Переключатель S2 (вход C.0) сбрасывает значение давления (мбар) на ЖК-дисплее. Переключатель S3 (вход C.1) переключает осадки отображаемые на ЖК-дисплее между общим в предыдущий час и текущими.  Кнопки необходимо удерживать более 1 секунды для их реакции.

Схема регулятора напряжения

Сборка внутреннего блока

Плата внутреннего блока

Как и в печатной плате для наружного блока, я нарисовал макет вручную с помощью Paintshop Pro, так что в расстояниях могут быть ошибки

Плата внутреннего блока

Плата немного больше, чем это необходимо, чтобы вписаться в пазы в алюминиевом корпусе.
Я сознательно сделал разъем для программирования немного "внутрь" от края платы, чтобы предотвратить его прикосновение к корпусу. Вырез для ЖК-дисплея производится высверливание и подгонкой до точных размеров.

Корпус

На фото показано всё уже установленное в корпус.

Штырьки на плате делают сложным её установку в корпус, поэтому мне пришлось отпаять их и припаять дисплей к плате проводами.

Фото метеостанции

Внешний блок - код Picaxe

	; ==================================================================
	; Main 18M2 code for the Picaxe Weather Station Outdoor (Transmitter) Unit

	; Decimal precision Humidity & Temperature routines,
	; copyright, Peter H Anderson, Baltimore, MD, Jan, '04
	; 
	; ==================================================================

	 #Picaxe 18M2

 	  Symbol HValue = w0
   	  Symbol HighWord = w1
  	  Symbol LowWord = w2
  	  Symbol RH10 = w3
  	  Symbol HQuotient = b0
   	  Symbol HFract = b1
  	  Symbol X = b0
  	  Symbol aDig = b1
   	  Symbol TFactor = b2
  	  Symbol Tc = b3
  	  Symbol SignBit = b4
   
  	  Symbol TValue = w4
  	  Symbol TQuotient = b10
  	  Symbol TFract = b11  
   	  Symbol TempC_100 = w6
   
   	  Symbol MagDir = w7
  	  Symbol MagDirLo = b14
  	  Symbol MagDirHi = b15
   
  	  Symbol WindSpeed = w8
  	  Symbol WindSpeedLo = b16
   	  Symbol WindSpeedHi = b17
  	  Symbol ThisHour = b18
  	  Symbol LastHour = b19
  	  Symbol RainRequest = b20
   
   
   	  ; Hardware
  	  Symbol HumidRaw = B.7
  	  Symbol TempRaw = B.6
  	  Symbol DirRaw = B.3
  	  Symbol Speed = B.0 
 
      do
   	  ; Read Humidity

   	  ReadADC10 HumidRaw, HValue			;Get Humidity (HValue)
   	  HighWord = 1613 ** HValue			; calculate RH
  	  LowWord = 1613 * HValue
   	  RH10 = LowWord / 1024
  	  LowWord = Highword * 64
  	  RH10 = RH10 + LowWord
  	  RH10 = RH10 - 258
   
  	  pause 100
   
   	  ; Read temperature
   
  	  Readtemp12 TempRaw, TValue			; Get temperature
 
          SignBit = TValue / 256 / 128

          if SignBit = 0 then positive			; It's negative so
          TValue = TValue ^ $ffff + 1                   ; take twos comp


       positive:
   
          TempC_100 =  TValue * 6	       	        ; TC = value * 0.0625
          TValue = TValue * 25 / 100
          TempC_100 = TempC_100 + TValue
          TQuotient = TempC_100 / 100
          TFract = TempC_100 % 100 / 10 
   
          X = TQuotient / 10				; Calculate temperature correction factor for Humidity
   
          if SignBit = 0 then
             SignBit = " "
          else
             SignBit = "-"
          endif           


          if SignBit = "-" then
             X = 4 - X
          else
             X = X + 4
          endif


          GoSub TempCorrection				; compensate RH

          HQuotient = RH10 / 10			        ; Calculate RH Quotient and...
          HFract = RH10 % 10 				; ...decimal place.

          if HQuotient > 99 then 			; Over range
             HQuotient = 99
             HFract = 9  
          endif
   
          if HQuotient > 127 then 			; Under range
             HQuotient = 0
             HFract = 0
          endif
   
          ; Read AS540 magnetic encoder for wind direction
  
          readadc10 DirRaw, MagDir			; Read from AS5040 magnetic bearing
          pause 100
      
          ; Read rpm from windspeed counter
   
          count  Speed, 1000, WindSpeed
   
          ; Every 30th cycle (approx 1 minute), request rain gauge data from 08M
   
          inc RainRequest
          if RainRequest >= 30 then
             high C.1
             serin [500], C.0, N2400, ("r"), LastHour, ThisHour   ; Rain counters
             low C.1
             RainRequest = 0
          endif
   
          ; Send data to Indoor Unit in 8 byte blocks
          ; First group needs no calibration so calculations are done here first.
          ; Second group will need "tweaking" - more easily done at indoor end.

          serout C.2, N2400, ("t", SignBit, TQuotient, TFract, HQuotient, HFract, "A", "B")
          pause 100
          serout C.2, N2400, ("m", MagDirHi, MagDirLo, WindSpeedHi, WindSpeedLo, LastHour, ThisHour, "C")
      loop



      TempCorrection:
          Lookup X, (87, 89, 91, 93, 95, 97, 99, 101, 103, 106, 108, 110, 113, 116, 119, 122, 126), TFactor
                  ' -40 -30 -20 -10  0   10  20   30   40   50   60   70   80   90  100  110  120

          if TFactor < 100 then 
             aDig = TFactor / 10
             RH10 = RH10 * aDig / 10
             TFactor = TFactor % 10

             aDig = TFactor
             RH10 = RH10 * aDig / 100 + RH10

          else 
             TFactor = TFactor % 100
             aDig = TFactor / 10
             RH10 = RH10  * aDig / 10  + RH10
             TFactor = TFactor % 10

             aDig = TFactor
             RH10 = RH10  * aDig / 100 + RH10
          endif

          return

Использовано памяти = 295 байт из 2048

Счетчик количества осадков - 08M код

     #picaxe 08M

	  Symbol ThisHour = b2				; Store the current sensor count in b2
	  Symbol LastHour = b3				; Save the previous hour's count in b3

	  ;Hardware definitions

	  Symbol DataRequest = pin3
	  Symbol BucketSensor = pin4


	  setint %00010000, %00010000			; pin4 is interrupt pin
      main:
          for w0 = 1 to 60000				; Loop for 1 hour
             pause 60
          next				
          LastHour = ThisHour				; Update Last hour's count with
          ThisHour = 0					; current hour & reset current hour
		
          goto main					; Do the next hour
 
      interrupt:
          setint %00010000, %00010000			; Re-instate interrupt
 
          if DataRequest = 1 then			; Was the interrupt from the 18M2 ?
             serout 2, N2400, ("r", LastHour, ThisHour) ; Yes, so send previous hour's count & curent count.
             do : loop while DataRequest = 1		; Wait until 18M2 stops requesting before continuing
          endif
          if BucketSensor = 1 then			; Was the interrupt from the rain sensor?
             inc ThisHour				; Yes, so increment bucket-tip count
             do : loop while BucketSensor = 1		; Make sure flag has cleared sensor before continuing
          endif

          return

Внутренний блок - код Picaxe

          ;============================================================================
          ; Main Indoor (Receiver) Program.
          ;
          ; Receives data from outdoor unit, displays on LCD and passes data on to PC
          ; Also measures the barometric pressure (thanks to 'matherp')
          ;============================================================================

        #PICAXE 18M2

          ; Variable Definitions (b2 to b5 are re-used for mBar code when they become available)

  
          symbol Quotient = b2
          symbol Fract = b3
          symbol SignBit = b4
          symbol Humidity = b5
          symbol HFract = b14
  
          symbol Dir = w5
          symbol DirLo = b10
          symbol DirHi = b11
  
          symbol Speed = w3
          symbol SpeedLo = b6
          symbol SpeedHi = b7
  
          symbol RainCountThisHour = b12
          symbol RainCountLastHour = b13
          symbol LCDRainWhole = b21
          symbol LCDRainFract = b22
          symbol LastOrThis = b23
  
          ; MCP3422 ADC variables

          symbol mb900 = 17429              ; ADC reading for 900Mbar, then add 72.288 counts per mbar
          symbol adj0 = 72
  
          symbol mBarADCValue = w0
          symbol adj1 = b4                  ; used to add 1 count every 4 mbar
          symbol adj2 = b5                  ; used to add 1 count every 24 mbar
          symbol mBar = w4
  
          ; Housekeeping variables

          symbol lastmbar = w8              ; Remember previous mBar reading
          symbol RiseFall = b18             ; Indicator for pressure rising or falling (up arrow or down arrow)
          symbol active = b19               ; Telltale shows activity on LCD screen
          symbol LCD_Status = b20           ; Is LCD Backlight on or off (0 or 1)?
 
  
          ; Hardware Definitions
  
          symbol Wireless = C.7             ; Incoming connection from Wireless receiver/decoder
          symbol Computer = C.2	            ; Outgoing serial connection to computer
  
          symbol LCD = pinC.5               ; Front-panel button to blank / unblank LCD backlight    
          symbol ClearRiseFall = pinC.0     ; Front-panel button to clear pressure 'rising / falling' indicator
          symbol LastOrThisSwitch = pinC.1  ; Front-panel button to display current or previous hour's rainfall
  
  
     Init:  
          hsersetup B9600_4, %10000 			         ; Use LCD Pin 1, no hserin 
                                                                 ; ByVac 20x4 IASI-2 Serial LCD 
 						  
          hi2csetup i2cmaster, %11010000, i2cfast, i2cbyte	 ; Initialize I2C for MCP3422 ADC chip.
          hi2cout (%00011000)                                    ; set MCP3422 for 16 bit continuous conversion

          pause 500
          hserout 0, (13) : pause 100           		 ; Initialize LCD
          hserout 0, (13) : pause 100
          hserout 0, (13) : pause 100
          pause 500

          hserout 0, ("ac50", 13)
          hserout 0, ("ad", 32, 32, 32, 32, 49, 42, 36, 32, 13)  ; Define down arrow character (char 10)

          hserout 0, ("ac1", 13)  			         ; Clear display
          pause 50                				
          hserout 0, ("acc", 13)                  	         ; Hide cursor
  
          hserout 0, ("ac81", 13, "ad ", $df, "C", 13)	         ; Print the headings
          hserout 0, ("ac88", 13, "admBar", 13)
          hserout 0, ("ac8e", 13, "adRH %", 13)
 
          hserout 0, ("acd5", 13, "ad", "dir", 13)               ; Print footings      	 
          hserout 0, ("acdc", 13, "ad", "mph", 13)       	 ;  
          hserout 0, ("ace3", 13, "ad", "mm", 13) 
 
  
          lastmbar = 0						 ; Initialize variables
          LastOrThis = "c"
  
  ;==========================================================================
  ; Main Loop
  ;==========================================================================

     main:

 
          ; Check if a front-panel switch is pressed. The Picaxe interrupt mechanism is
          ; almost permanently disabled due to the large number of serin and serout commands
          ; so sprinkling the program with 'gosub switches' to check the switch status is more
          ; effective that interrupts.
  
          gosub switches
  
          ; Get first group of values from outdoor unit via 433MHz radio link. 

          serin Wireless, N2400, ("t"), SignBit, Quotient, Fract, Humidity, HFract, b15, b15
  
  
          ; Flash 'telltale' on LCD to indicate activity and successful 'serin' from wireless.
  
          gosub telltale
  
  
          ; Display first group on LCD
  
          hserout 0, ("acc0", 13)
          hserout 0, ("ad", SignBit, #Quotient, ".", #Fract, "  ", 13) 
          hserout 0, ("acce", 13)
          hserout 0, ("ad", #Humidity,".", #HFract, "  ", 13)
  
 
          gosub switches
  
  
          ; Send first group to computer COM port
  
          ; Each group has a start identifier, data and an end identifier:
          ; Start = "xS", End is "xE" eg Wind Start is WS, Wind End is WE 
          ; Multiple data are separated by a single space character.
   
          serout Computer, N2400, ("TS", SignBit, #Quotient," ", #Fract, "TE")    ; Temperature
          serout Computer, N2400, ("HS", #Humidity, " ", #HFract, "HE")           ; Humidity
  
          ; Check switches again and at regular intervals throughout program.
          gosub switches
  
  
          ; Get second group of values from outdoor unit radio link.  
 
          serin Wireless, N2400, ("m"), DirHi, DirLo, SpeedHi, SpeedLo, RainCountLastHour, RainCountThisHour, b15
 
          gosub telltale
  
          Speed = Speed * 300 / 448                             ; Estimated conversion from pulses/sec to mph
					
          Dir = Dir * 64 / 182                                  ; Convert 0 - 1023 to 0 - 359 degrees


          ; To preserve precision, rain gauge has to be calibrated by adjusting the
          ; mechanical stops on the tipping bucket so that 1 tip is 0.5 mm of rain.

          if LastOrThis = "c" then				; Decide whether to display previous hour's
             LCDRainWhole = RainCountThisHour / 2		; rainfall or the current hour's.
             LCDRainFract = RainCountThisHour * 5 // 10
          else
             LCDRainWhole = RainCountLastHour / 2		;
             LCDRainFract = RainCountLastHour * 5 // 10 
          endif
   
          ; Send second group to LCD
   
          hserout 0, ("ac95", 13)
          hserout 0, ("ad", #Dir, "   ", 13)
  
          hserout 0, ("ac9c", 13)
          hserout 0, ("ad", #Speed, "   ", 13)
 
          hserout 0, ("aca1", 13)
          hserout 0, ("ad", LastOrThis, " ", #LCDRainWhole, ".", #LCDRainFract, "  ", 13)
   
  
          ; Send second group to computer COM port
  
          serout Computer, N2400, ("WS", #Dir," ", #Speed, "WE")          ; Wind
          serout Computer, N2400, ("RS", #RainCountLastHour," ", #RainCountThisHour, "RE")  ; Rain
  
          gosub switches
  
          ; Thanks to 'matherp' on the Picaxe forum for the mbar code loop:

          ; Measuring atmosperic pressure with a MPX4115A
          ; Analogue to digital conversion using a MCP3422
          ; MPX output to V+, 2.5V to V-
          ; ADC in 16 bit mode

          hi2cin (b1,b0,b2)             ; Read in the ADC reading and the status byte from MCP3422
  
          adj1 = 0
          adj2 = 0
          w1 = mb900
  
          mbar = 900
          do while mBarADCValue > w1	; mBarADCValue = w0 = b1:b0
             inc mbar
             w1 = w1 + adj0
             inc adj1
             if adj1 = 4 then
	        inc adj2
	        w1 = w1 + 1
	        adj1 = 0
             endif
             if adj2 = 6 then
                w1 = w1 + 1
	        adj2 = 0
             endif
          loop
  
          gosub switches	
          gosub telltale
  
  
          ; Send pressure to computer COM port
  
          serout Computer, N2400, ("PS:", #mbar, "PE")
   

          ; Initialize previous pressure reading (lastmbar) if not already set
          if lastmbar = 0 then
             lastmbar = mbar
             RiseFall = " "
          endif
  
          ; Display up arrow or down arrow if pressure has changed
          if mbar > lastmbar then
             RiseFall = "^"                                     ; ^
             lastmbar = mbar
          endif

          if mbar < lastmbar then
             RiseFall = 10				        ; Custom LCD character. Down arrow
             lastmbar = mbar
          endif

          hserout 0, ("acc7", 13)
          hserout 0, ("ad", RiseFall, #mbar, "  ",13) 
 
          gosub telltale
     goto main
  
  
  
          ; Check if one of the front panel buttons is pressed. 
     switches:						
          if LCD = 1 then			      		; LCD Backlight on/off Button is pressed
             if LCD_Status = 0 then		      		; Backlight is on so...
                hserout 0, ("ab0", 13)			    	; Turn it off
                LCD_Status = 1
             else
                hserout 0, ("ab1", 13)		      		; Else turn it on.
                LCD_Status = 0
             endif
             do: loop while LCD = 1		       		; Don't return while button is pressed
          endif
   
          if ClearRiseFall = 1  then				; Pressure rise/fall button is pressed
             RiseFall = " "					; Clear indicator and...
             hserout 0, ("acc7", 13)				; ... update display.
             hserout 0, ("ad", RiseFall, #mbar, "  ",13)      
             do: loop while ClearRiseFall = 1
          endif
   
          if LastOrThisSwitch = 1 then		      	        ; Rain Previous Hour / Last Hour button.
             if LastOrThis = "c" then
                LastOrThis = "p"					
                LCDRainWhole = RainCountLastHour / 2		; Recalculate values and re-display to
                LCDRainFract = RainCountLastHour * 5 // 10      ; give visual confirmation of button-press
             else
                LastorThis = "c"
                LCDRainWhole = RainCountThisHour / 2		;
                LCDRainFract = RainCountThisHour * 5 // 10        
             endif
             hserout 0, ("aca1", 13)
             hserout 0, ("ad", LastOrThis, " ", #LCDRainWhole, ".", #LCDRainFract, "  ", 13)    
             do : loop while LastOrThisSwitch = 1
          endif
          return 
   
   
          ; Flash "tell-tale" on LCD display to show activity    
    telltale:
          if active = "*" then
             active = " "
          else
             active = "*"
          endif
          hserout 0, ("ac80", 13, "ad", active, 13)
          return

Использовано памяти = 764 байт из 2048

Программное обеспечение для ПК

Weather 1.1

Программное обеспечение, работающее на ПК было написано с использованием Borland Delphi 7. Оно довольно примитивно в его нынешнем виде, но это, по крайней мере, показывает связь Picaxe с компьютером.

Графики могут быть выбраны для показа в период  1 час или 12 часов. Графики можно прокручивать вперёд-назад с помощью мышки. Они могут быть сохранены. Для этого необходимо кликнуть по ним правой кнопкой мыши и указать имя и файл значения. Можно настроить ограниченный набор APRS данных, записываемых раз в минуту на одну строку файла APRS.TXT и которые сохраняются в той же папке, где находится Weather.exe. Отмечу, что температура в градусах по Фаренгейту и осадки в 1/100ths на дюйм.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Датчик температуры и относительной влажности воздуха
Датчик температуры
DS18B20
1 Поиск в магазине ОтронВ блокнот
Датчик влажностиHIH-36101 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
1 Поиск в магазине ОтронВ блокнот
Измеритель скорости и направления ветра
ФототранзисторИК1 Поиск в магазине ОтронВ блокнот
СветодиодИК1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
1 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
1 Поиск в магазине ОтронВ блокнот
 
Магнитный энкодерAS50401 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор10 мкФ4 Поиск в магазине ОтронВ блокнот
Конденсатор100 нФ1 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
1 Поиск в магазине ОтронВ блокнот
Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
Измеритель уровня осадков
МК PICAXE
PICAXE-08M
1 Поиск в магазине ОтронВ блокнот
Выпрямительный диод
1N4148
2 Поиск в магазине ОтронВ блокнот
Конденсатор100 нФ1 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
1 Поиск в магазине ОтронВ блокнот
Резистор
10 кОм
4 Поиск в магазине ОтронВ блокнот
Резистор
22 кОм
1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
2 Поиск в магазине ОтронВ блокнот
СветодиодИК1 Поиск в магазине ОтронВ блокнот
ФототранзисторИК1 Поиск в магазине ОтронВ блокнот
Наружный блок
МК PICAXE
PICAXE-18M2
1 Поиск в магазине ОтронВ блокнот
Выпрямительный диод
1N4001
2 Поиск в магазине ОтронВ блокнот
Линейный регулятор
LM7805CT
2 Два стабилизатора 5ВПоиск в магазине ОтронВ блокнот
Электролитический конденсатор47 мкФ2 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор470 мкФ2 Поиск в магазине ОтронВ блокнот
Конденсатор100 нФ4 Поиск в магазине ОтронВ блокнот
Резистор
22 кОм
1 Поиск в магазине ОтронВ блокнот
Резистор
10 кОм
9 Поиск в магазине ОтронВ блокнот
Внутренний блок
МК PICAXE
PICAXE-18M2
1 Поиск в магазине ОтронВ блокнот
АЦП
MCP3422
1 Поиск в магазине ОтронВ блокнот
Датчик давленияMPX4115A1 Поиск в магазине ОтронВ блокнот
Конденсатор100 нФ3 Поиск в магазине ОтронВ блокнот
Конденсатор470 пФ1 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор10 мкФ2 Поиск в магазине ОтронВ блокнот
Конденсатор10 нФ1 Поиск в магазине ОтронВ блокнот
Резистор
10 кОм
14 Поиск в магазине ОтронВ блокнот
Резистор
6.8 кОм
2 Поиск в магазине ОтронВ блокнот
Резистор
180 Ом
1 Поиск в магазине ОтронВ блокнот
Резистор
22 кОм
1 Поиск в магазине ОтронВ блокнот
Переменный резистор1 кОм1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Теги:

none Опубликована: 2012 г. 0 2
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (7) | Я собрал (0) | Подписаться

0
Сергей Н. #
Просмотрел. Все очень хорошо для спецов. Сделать чайникам практически невозможно
Ответить
0
Влад Пупкин #
Но зато можно взять интересующую часть для повторения.
К примеру у нас недалеко свалка муссора, и когда ветер в нашу сторону - нужно отключать систему воздуховода (будет использоваться система рекуперации тепла), вот и нужно датчик направления и силы ветра.
Ответить
0
edgi #
Интересно, почему выбран именно Picaxe?
Ответить
0
ArQ2 #
Этот мк не найти, вообще(!) на али.
Датчик давления в статье тоже анрил найти, и 4-8к(!) на али. Сильно до****. bme180-280/bmp180-280 копейки же стоят.
Конструкция сверху хлипкая, просто анрил, имхо. Можно было бы сверху красиво сделать, если уж всё остальное настолько дотошно и полностью разработано.
Двоякое впечатление. особенно микруха непонятна. впервые такие гуглил. Не какие-ниб пики, атмеги, стмки и тп и bt/ble/wifi...
Сейчас хочется еще оптические датчики, доплеровские датчики, ультразвуковые...
+ еще вместо этой переливайки м.быть пойдёт датчик как в автомобилях на лобовом стекле?
Ответить
0
Дмитрий #
Не могли бы вы добавить все характеристики Внешнего Блока? Более подробно что и как используется, какая мощность рабочая и т.д.
Ответить
0
RASEL #
На сколько я знаю с подобными магнитами эта микросхема работает не корректно, нужен специальный сплав магнита. Вот видео работы этой микросхемы с подобным магнитом http://yandex.ua/video/search?filmId=zmjbMorJUXI&where=all&text=AS5040
Как видно работает, но есть пропуски положения.
Ответить
0
Андрей #
Замечательно! Полгода занимаюсь примерно тем же, только на ATMEL. Почти все аналогично + измерение рад. фона и освещенности. А ваш датчик осадков меня убил. Все гениальное просто. С вашего позволения воспользуюсь.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Радиореле 220В
Радиореле 220В
Солнечная панель 10Вт 12В поликристаллическая USB-реле (2 канала)
вверх