ЭЛЕКТРОННЫЙ ПРЕДСКАЗАТЕЛЬ ПОГОДЫ

Прибор предсказывает скорое приближение осадков (гроза, циклон), основываясь на изменении атмосферного давления по времени. При запуске показывает уровень заряда аккумулятора (представь, что шкала от 0 до 100%). Каждые 10 минут просыпается, делает расчёты, если есть изменения — подключает сервопривод и поворачивает стрелку.

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

ПОДРОБНОЕ ВИДЕО ПО ПРОЕКТУ

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

СХЕМЫ, ПЕЧАТНЫЕ ПЛАТЫ

Простая

Энергосбережение

Остальные панели в архиве

МАТЕРИАЛЫ И КОМПОНЕНТЫ

Ссылки на магазины, с которых я закупаюсь уже не один год

Вам скорее всего пригодится:

всё для пайки
аккумуляторы и модули
все arduino модули
мультиметры
инструменты
бп и преобразователи

ПРОШИВКА И НАСТРОЙКА

Содержимое папок в архиве

  • libraries — библиотеки для дисплея и прочего, скопировать в
    C:\Program Files (x86)\Arduino\libraries\ (Windows x64)
    C:\Program Files\Arduino\libraries\ (Windows x86)
  • weather_predict_approx — прошивка для Arduino, файл в папке открыть в Arduino IDE (читай FAQ)
  • scale_image — файлы картинок формата 10х15 для печати
скачать архив
страница на github

Как прошить?

  • ЕСЛИ ЭТО ПЕРВЫЙ ОПЫТ РАБОТЫ С ARDUINO — посмотреть ВИДЕО о платформе с целью ознакомления, далее скачать, установить и настроить необходимые для работы программы согласно СУПЕР ПОДРОБНОЙ ИНСТРУКЦИИ (там даже видео версия есть!).
  • Скачать архив с проектом напрямую, или с GitHub (кнопки чуть выше)
  • Установить библиотеки (папка Libraries) в
    C:\Program Files (x86)\Arduino\libraries\ (Windows x64)
    C:\Program Files\Arduino\libraries\ (Windows x86)

  • Подключить Ардуино к компьютеру при помощи Data-кабеля
  • Открыть файл прошивки желаемой версии (файлы прошивок .ino лежат в одноимённых папках)
  • Настроить Arduino IDE (COM порт, куда подключена плата; подключенная модель Arduino, как в статье из первого пункта)
  • Настроить что нужно в прошивке, нажать загрузить
  • Если происходит ошибка компиляции или ошибка загрузки, читать 5-ый пункт в ЭТОЙ СТАТЬЕ

Настройки в прошивке

#define servo_invert 1       // если серва крутится не в ту сторону, изменить значение (1 на 0, 0 на 1)
#define battery_min 3000     // минимальный уровень заряда батареи для отображения
#define battery_max 4200     // максимальный уровень заряда батареи для отображения
// диапазон для 3 пальчиковых/мизинчиковых батареек: 3000 - 4700
// диапазон для одной банки литиевого аккумулятора: 3000 - 4200

Дополнительно

  • Если серво как будто не хватает напряжения — акум не тянет, либо мосфет «китайский»!

АЛГОРИТМ РАБОТЫ

if (wake_flag) {
  delay(500);
  pressure = aver_sens();                          // найти текущее давление по среднему арифметическому
  for (byte i = 0; i < 5; i++) {                   // счётчик от 0 до 5 (да, до 5. Так как 4 меньше 5)
    pressure_array[i] = pressure_array[i + 1];     // сдвинуть массив давлений КРОМЕ ПОСЛЕДНЕЙ ЯЧЕЙКИ на шаг назад
  }
  pressure_array[5] = pressure;                    // последний элемент массива теперь - новое давление

  sumX = 0;
  sumY = 0;
  sumX2 = 0;
  sumXY = 0;
  for (int i = 0; i < 6; i++) {                    // для всех элементов массива
    sumX += time_array[i];
    sumY += (long)pressure_array[i];
    sumX2 += time_array[i] * time_array[i];
    sumXY += (long)time_array[i] * pressure_array[i];
  }
  a = 0;
  a = (long)6 * sumXY;             // расчёт коэффициента наклона приямой
  a = a - (long)sumX * sumY;
  a = (float)a / (6 * sumX2 - sumX * sumX);
  // Вопрос: зачем столько раз пересчитывать всё отдельными формулами? Почему нельзя считать одной большой?
  // Ответ: а затем, что ардуинка не хочет считать такие большие числа сразу, и обязательно где-то наё*бывается,
  // выдавая огромное число, от которого всё идёт по пи*зде. Почему с матами? потому что устал отлаживать >:O
  delta = a * 6;                   // расчёт изменения давления

  angle = map(delta, -250, 250, servo_0, servo_180);  // пересчитать в угол поворота сервы
  angle = constrain(angle, 0, 180);                   // ограничить диапазон

  // дальше такая фишка: если угол несильно изменился с прошлого раза, то нет смысла лишний раз включать серву
  // и тратить энергию/жужжать. Так что находим разницу, и если изменение существенное - то поворачиваем стрелку    
  if (abs(angle - last_angle) > 7) move_arrow = 1;

  if (move_arrow) {
    last_angle = angle;
    digitalWrite(servo_Vcc, 1);      // подать питание на серво
    delay(300);                      // задержка для стабильности
    servo.write(angle);              // повернуть серво
    delay(1000);                     // даём время на поворот
    digitalWrite(servo_Vcc, 0);      // отключить серво
    move_arrow = 0;
  }

  if (readVcc() < battery_min) LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); // вечный сон если акум сел
  wake_flag = 0;
  delay(10);

2018-02-21T00:39:11+00:00