Новички просят помощи у профессуры

beginner
Offline
Зарегистрирован: 20.11.2014

Подключаю BMP 085, LCD 1602 к MEGA 2560. Задал вопрос на этом форуме в теме: "Помогите составить скетчик" Мне указали на выход и я создал новую тему. На авторство этой темы не претендую. Все, кому это необходимо - пусть ей пользуются. Никто не может никого от сюда прогнать!

Ну а теперь по существу:

Просил помочь отредактировать код по подключению BMP 085. LCD 1602 к мега 2560, Но справился сам.

Мне помог код http://bashlaev.ru/?p=141 , я убрал все лишнее - в итоге получил рабочий код для

BMP 085+LCD1602. Мне помогло то, что на каждой строчке программы есть комментарий.

#include <LiquidCrystal.h> // Подключаем стандартную библиотеку LiquidCrystal
#include <Wire.h>
#include <BMP085.h> // Библиотека для работы с датчиком BMP085

 
// Инициализируем объект-экран, определяем пины для работы с экраном
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
BMP085 dps = BMP085();
long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0;
 
 
void setup()
{
lcd.begin(16, 2); 
// устанавливаем размер (количество столбцов и строк) экрана
Serial.begin(9600); 
// старт работы серийного порта

lcd.clear(); 
// очищаем дисплей
Serial.println("start"); 
// пишем в серийном порту «start»
Wire.begin();
delay(1000); 
// ожидание 1 секунда
dps.init();
}
 
void loop ()
 
{
dps.getTemperature(&Temperature085);
dps.getPressure (&Pressure085);
lcd.setCursor(0, 0); 
// устанавливаем курсор в колонку 0 строка 0
lcd.print("mm="); 
// пишем «mm=»
lcd.print(Pressure085/133); 
// показания давления с датчика
lcd.setCursor(0, 1); 
// устанавливаем курсор в колонку 0 строка 1
lcd.print("t="); 
// пишем «t=»
lcd.print(Temperature085*0.1); 
// показания температуры с датчика BMP085 

delay(1000);
}

Всем удачи!

hugoboss317
Offline
Зарегистрирован: 21.03.2013

А зачем в порт ещё посылаешь, проверяешь работу?

Если тебе это не надо, то строку 17 и 22 можно убрать. Градусы можно выводить кратными 0,1, от это можно избавиться от четырёхбайтной long и остановиться на двухбайтной int. К томуж там же (в строке 10) ты обьявляешь третью переменную такого же типа. Зачем?

На самом деле я не работал с библиотекой BMP 085, но думаю там есть сэмплы. На будущее... Сначала подключаешь дисплей и пробуешь управлять только им, после того как освоил и понал что к чему, подключаешь к дуине датчики и посылаешь в порт данные... разобрался что и как, вот тогда и совмещай.

И ненадо ни на кого дуться, никто тебя не посылал.

beginner
Offline
Зарегистрирован: 20.11.2014

Насчет строки 17 - пока не догнал , почему она не нужна. Строку 22 действительно оставил для контроля в плане ( если на дисплее ничего нет, а в порту - START. значит косяк в подключении дисплея.)  Ну а строка 10 - да, там 3 переменная (высота над уровнем моря) эта величина мне не нужна. Хотя попробую вывести на дисплей (в качестве обучения)  Разницу между long и ink пока не понял. Если не затруднит, то напиши альтернативный код.

Ну и насчет обид - поверь мне я ни на кого не дуюсь ( возраст не тот) А осваиваю Арддуино для изучения серьезного проекта

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

Спасибо за комментарий.

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

beginner
Offline
Зарегистрирован: 20.11.2014

Согласен. Чем и занимаюсь в свободное время.

Kлапаyций 99.99
Offline
Зарегистрирован: 11.10.2014

шото я не въехал - в чём вопрос заключался?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Как ты обычно говоришь!? "Здаётся мне, что это не конец, а только начало". Ну так вот и я так думаю.

Radjah
Offline
Зарегистрирован: 06.08.2014

https://github.com/adafruit/Adafruit-BMP085-Library это раз.

И по поводу кода.

Форматируй все числа перед выводом. Если сначала было например 10 градусов, а потом будет 9, то на экране будет 90.

Зачем 25-я строка?

beginner
Offline
Зарегистрирован: 20.11.2014

Спасибо. 

DaZdraNaGon
Offline
Зарегистрирован: 25.11.2014

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

Задание сделующее: есть 7 светодиодов. Надо сделать так, чтобы они включались в такой последовательности - 123,234,345,456,567,654,543,432,321 и так далее. Нашёл похожий код, но там просто светодиоды бесконечно включаются поочереди от первого до седьмого.

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(0, OUTPUT);     
  pinMode(1, OUTPUT);     
  pinMode(2, OUTPUT);     
  pinMode(3, OUTPUT);     
  pinMode(4, OUTPUT);     
  pinMode(5, OUTPUT); 
  pinMode(6, OUTPUT);     
}

int led =0;
// the loop routine runs over and over again forever:
void loop() 
{
    for(int i=0; i<7;i++) 
    {
      if(i==led) 
      {
        digitalWrite(i,HIGH);
      } 
      else 
      {
        digitalWrite(i,LOW);
      }  
    }
    led++;
    if (led > 6) led = 0;
  
  delay(1000);               // wait for a second
}

З.Ы. Программирование у меня на уровне новорождённого.

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

DaZdraNaGon пишет:
Задание сделующее: есть 7 светодиодов. Надо сделать так, чтобы они включались в такой последовательности - 123,234,345,456,567,654,543,432,321 и так далее.

void setup() {                
  DDRD = 127;
  PORTD = 7; 
}

void loop() {
  delay(1000);
  PORTD = ((PORTD&64)/64)+(PORTD << 1); 
}

з.ы. Для UNO. Светодиоды висят на портах 0 до 6.

 

vvadim
Offline
Зарегистрирован: 23.05.2012

DaZdraNaGon пишет:

 

З.Ы. Программирование у меня на уровне новорождённого.

без комментов не разберётся

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

Упс. Не внимательно прочел условие. Так будет ближе к истине:

boolean i = true; //направление движения
void setup()
{
   DDRD = B1111111; //Переключаем пины от 0 до 6 на выход
   PORTD = B0000111; //Устанавливаем пины от 0 до 2 в HIGH
}
void loop(){
 delay(1000);//ждем секунду
 if(i) PORTD <<= 1; else PORTD >>= 1; //двигаем в зависимости от направления
 if((PORTD == B1110000) || (PORTD == B0000111)) i=!i; //если огоньки достигли края меняем направление на противоположное
}

 

DaZdraNaGon
Offline
Зарегистрирован: 25.11.2014

Весьма интересный способ. Но я не смогу такое объяснить преподавателю. Можно это как-то реализовать через циклы и ифы?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Вспомнился фильм "Приключения Электроника" и решение задачи через "интрегал".

hugoboss317
Offline
Зарегистрирован: 21.03.2013

DaZdraNaGon пишет:
... я не смогу такое объяснить преподавателю....

Ты пытаешься объяснить преподавателю таблицу уиножения, при том что не знаешь таблици сложения.

Была поставлена задача, тебе написали готовый и МАКСИМАЛЬНО ПРОСЬТОЙ код, раскоментировали его...

Давай так: показываешь мне своего профессора, я даю ему сто баксов, он ставит тебе пять за семестр и все про всё забывают. Ты про предмет и про форум, проффесор про тебя и про светодиоды, я про сто баксов.

Есть десятки способов воплотить твою идею, но разочарование в том, что это тебе и нафиг не надо.

Что именно ты не смог пояснить?

DaZdraNaGon
Offline
Зарегистрирован: 25.11.2014
boolean i = true; //направление движения
void setup()
{
DDRD = B1111111; //Переключаем пины от 0 до 6 на выход
PORTD = B0000111; //Устанавливаем пины от 0 до 2 в HIGH
}
void loop(){
delay(1000);//ждем секунду
if(i) PORTD «= 1; else PORTD »= 1; //двигаем в зависимости от направления
if((PORTD == B1110000) || (PORTD == B0000111)) i=!i; //если огоньки достигли края меняем направление на противоположное
}

Что такое DDRD? Что такое PORTD? B1111111 - это такой стандартный синтактический оборот, или вместо B можно написать A и результат будет совсем другой? Никогда не встречал доселе "<<=", ">>=". Зачем в десятой строке между скобками стоит "||"?

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

KVadik
KVadik аватар
Offline
Зарегистрирован: 15.06.2014

DDRD это регистр направления передачи данных порта D

PORTD это регистр значений порта D

Порт D это выводы от 0 до 7 ардуино UNO (по биту на каждый вывод)

B1111111 это число 127 записаное в двоичном виде

<< и >> это побитовый сдвиг x << = 1 эквивалентно x = x << 1 (синтаксис Си)

|| это оператор ИЛИ

Учиться не пробовали? Зачем Вам вообще контроллер программировать? Возьмите какой-нибудь бейсик или ещё лучше выучите Си.