Нужна помощь в создание скетча

chashqa
Offline
Зарегистрирован: 23.05.2017

Искал по интернету,форумах,ютубов но ничего нету подобного. Нужен скетч вывода данных датчика ds18b20 на lcd экран 16x2 без шины i2c

Прешибаллин
Offline
Зарегистрирован: 23.05.2017

http://arduino.ru/forum/apparatnye-voprosy/ds18b20-pokazyvaet-127

http://arduino.ru/forum/programmirovanie/pochistil-sketch-primera-raboty-s-ds18b20-iz-bibly-oneware

http://arduino.ru/forum/apparatnye-voprosy/lcd-1602-i-konverter-i2c

 

 

используйте  <LiquidCrystal_I2C.h> - для дисплеев с контроллером I2C  или  <LiquidCrystal.h> - для дисплеев без контроллера IIC

chashqa
Offline
Зарегистрирован: 23.05.2017

нужно чтоб выводило на экран, а не просто порт.

Прешибаллин
Offline
Зарегистрирован: 23.05.2017

Для этого выводите значение на экран при помощи указанных библиотег. Если нужно пришить пуговицу или постирать трусы - все это надо предусмотреть в программе.

chashqa
Offline
Зарегистрирован: 23.05.2017

Но в тех пример не используется библиотека LiquidCrystal.h

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Нужно, чтобы за вас написали - пишите в "Ищу исполнителя". Можно сразу мне - yaryarikyar@ya.ru .

Нужна помощь - начните писать и объясните, что у вас не получается.

bwn
Offline
Зарегистрирован: 25.08.2014

Yarik.Yar пишет:

Нужно, чтобы за вас написали - пишите в "Ищу исполнителя". Можно сразу мне - yaryarikyar@ya.ru .

А ты алчный однако.))))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Контекстная реклама:D

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

Yarik.Yar пишет:

Нужно, чтобы за вас написали - пишите в "Ищу исполнителя". Можно сразу мне - yaryarikyar@ya.ru .

А ты алчный однако.))))

не только, кода этого море, тут делов минут на 20 )))

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

bwn пишет:

Yarik.Yar пишет:

Нужно, чтобы за вас написали - пишите в "Ищу исполнителя". Можно сразу мне - yaryarikyar@ya.ru .

А ты алчный однако.))))

не только, кода этого море, тут делов минут на 20 )))

Лень, она дорого стоит, здесь Ярослава поддерживаю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bwn пишет:

ua6em пишет:

bwn пишет:

Yarik.Yar пишет:

Нужно, чтобы за вас написали - пишите в "Ищу исполнителя". Можно сразу мне - yaryarikyar@ya.ru .

А ты алчный однако.))))

не только, кода этого море, тут делов минут на 20 )))

Лень, она дорого стоит, здесь Ярослава поддерживаю.

Эта лень такая, вечно имеет привычку развалится и дремать под развесистым карагачом

WolfRamm
Offline
Зарегистрирован: 25.05.2017

Добрый день! Помогите с кодом начинающему ардуинщику. Подключил к Ардуино весы, добился вывода значения массы на дисплей.

Ниже представлен код используемого скетча

#include <OLED_I2C.h>                               // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
#include <HX711.h>                                  // Подключаем библиотеку HX711 для работы с АЦП hx711

HX711 scale(A1, A0);                                // Указываем в какие пины подключен АЦП hx711 (DT(DOUT)  - pin A1, SCK - pin A0)
OLED  myOLED(A4, A5, A4);                           // Определяем пины OLED дисплея: SDA - пин A4, SCL - пин A5
extern uint8_t RusFont[];                           // Подключаем русский шрифт
extern uint8_t BigNumbers[];                        // Подключаем цифровой шрифт

float myScale;                                      // Инициализируем переменную в которой будем хранить текущий вес

void setup() {
  myOLED.begin();                                   // Инициализируем дисплей, как устройство вывода
  myOLED.clrScr();                                  // Стираем все с экрана
  myOLED.setFont(RusFont);                          // Инициализируем русский шрифт
  myOLED.print("Bltn rfkb,hjdrf", CENTER, 0);         // Выводим надпись "Идет калибровка"
  myOLED.update();                                  // Обновляем содержимое экрана
  
  scale.set_scale(17.04);                          // Устанавливаем калибровочный коэффициент 
  scale.tare();                                     // Сбрасываем весы на 0
  myScale = round(scale.get_units(10));             // Запоминаем среднее значение без груза, но с учетом тары 
  
  myOLED.clrScr();                                  // Стираем все с экрана
  myOLED.setFont(BigNumbers);                       // Инициализируем шрифт BigNumbers
  myOLED.print("0.00", CENTER, 20);                 // Обнуляем значение веса на экране
  myOLED.update();                                  // Выводим на дисплей
}

void loop() {
  scale.power_up();                                 // Отключаем энергосберегающий режим hx711
  if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
    myScale = scale.get_units(20)/1000;                  // Запоминаем текущий вес
    myOLED.clrScr();                                // Стираем все с экрана
    myOLED.setFont(BigNumbers);                     // Инициализируем шрифт вывода веса
   
    if (myScale > 0.5)                              // Если вес не ничтожно мал
      myOLED.print(String(myScale), CENTER, 20);    // то выводим его
    else                                            // иначе
      myOLED.print("0.00", CENTER, 20);             // выводим нули
   
    myOLED.update();                                // Обновляем информацию на дисплее
    myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
  }
}

После этого купил GSM-шилд, попробовал подключить к Ардуино, в ответ на СМС-запрос присылает болванку "A test!"

#include <SoftwareSerial.h>
     
    SoftwareSerial gprsSerial(7, 8);
     
    void setup()
    {
        gprsSerial.begin(19200);
     
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
    }
     
    String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;
     
    void loop()
    {
        if (!gprsSerial.available())
            return;
     
        char currSymb = gprsSerial.read();    
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("Weight")) {
    gprsSerial.print("AT+CMGF=1\r");
    delay(100);
    gprsSerial.println("AT + CMGS = \"+37529ХХХХХХХ\"");//отправить SMS-сообщение на заданный номер
    delay(100);
    gprsSerial.println("A test!");//содержание сообщения
    delay(100);
    gprsSerial.println((char)26);
    delay(100);
    gprsSerial.println();
}
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
    }

Вопрос к более опытным разработчикам: возможно ли собрать данные коды в один скетч, чтобы после СМС-запроса ответной СМС-кой приходило значение переменной "myScale" - масса груза на весах? Пробовал это сделать сам, пока не получилось.

okta
Offline
Зарегистрирован: 10.01.2015

Что конкретно не получилось?

По беглому взгляду все должно скрещиваться без проблем даже особо не меняя код.

WolfRamm
Offline
Зарегистрирован: 25.05.2017

Я тоже думал, что склеить получится, но не очень силен в прграммировании, возможно, не туда повставлял строки - шилд смс принимает, но ответа не дает. Может, кто-нибудь может собрать в один скетч рабочий?

okta
Offline
Зарегистрирован: 10.01.2015

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

Из подсказок, могу сказать, что скорее всего инклуды, переменные и сетап из скетча про весы можно переносить в скетч про смс "как есть".

Функцию loop из весов сделать отдельной функцией (естественно переименовав) и вызывать ее когда нужно отправлять смс.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Лучше loop не вызывать больше одного раза, это же цикл, рекурсия нежелательна получится. Ничто не мешает написать ещё одну функцию.

WolfRamm
Offline
Зарегистрирован: 25.05.2017

Вроде собрал, прислало 0 - тензодатчик дома, массу не показывает. Вечером проверю. Изначально мыслил правильно, но лишнего добавил.

WolfRamm
Offline
Зарегистрирован: 25.05.2017

Рано радоался: без подключенных весов смс присылает, при подключенных молчит как рыба об лед.

Переделел код под монитор порта, вот что плучилось:

#include <HX711.h>                                  // Подключаем библиотеку HX711 для работы с АЦП hx711
#include <SoftwareSerial.h>

HX711 scale(A1, A0);                                // Указываем в какие пины подключен АЦП hx711 (DT(DOUT)  - pin A1, SCK - pin A0)
SoftwareSerial gprsSerial(7, 8);

float myScale;                                      // Инициализируем переменную в которой будем хранить текущий вес

void setup() {
  Serial.begin(9600);                               // Инициализируем монитор порта, как устройство вывода
  Serial.println("Calibration...");                 // Выводим надпись

  
  scale.set_scale(17.04);                          // Устанавливаем калибровочный коэффициент 
  scale.tare();                                     // Сбрасываем весы на 0
  myScale = round(scale.get_units(10));             // Запоминаем среднее значение без груза, но с учетом тары 
  
  Serial.println(0.00);                             // Обнуляем значение веса на мониторе порта
  gprsSerial.begin(19200);
      
        // Настраиваем приём сообщений с других устройств
        // Между командами даём время на их обработку
        gprsSerial.print("AT+CMGF=1\r");
        delay(300);
        gprsSerial.print("AT+IFC=1, 1\r");
        delay(300);
        gprsSerial.print("AT+CPBS=\"SM\"\r");
        delay(300);
        gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
        delay(500);
}

String currStr = "";
    // Переменная принимает значение True, если текущая строка является сообщением
    boolean isStringMessage = false;

void loop() {
  scale.power_up();                                 // Отключаем энергосберегающий режим hx711
  if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
    myScale = scale.get_units(20)/1000;                  // Запоминаем текущий вес
    
   if (!gprsSerial.available())
            return;
      
        char currSymb = gprsSerial.read();   
        if ('\r' == currSymb) {
            if (isStringMessage) {
                //если текущая строка - SMS-сообщение,
                //отреагируем на него соответствующим образом
                if (!currStr.compareTo("Weight")) {
    gprsSerial.print("AT+CMGF=1\r");
    delay(100);
    gprsSerial.println("AT + CMGS = \"+37529XXXXXXX\"");//отправить SMS-сообщение на заданный номер
    delay(100);
    gprsSerial.println(myScale);//содержание сообщения
    delay(100);
    gprsSerial.println((char)26);
    delay(100);
    gprsSerial.println();
    }
                isStringMessage = false;
            } else {
                if (currStr.startsWith("+CMT")) {
                    //если текущая строка начинается с "+CMT",
                    //то следующая строка является сообщением
                    isStringMessage = true;
                }
            }
            currStr = "";
        } else if ('\n' != currSymb) {
            currStr += String(currSymb);
        }
        
    if (myScale > 0.5)                              // Если вес не ничтожно мал
      Serial.println(myScale);                      // то выводим его
    else                                            // иначе
      Serial.println(0.00);                         // выводим нули
    myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
  }
}

Если HX711 с тензодатчиком не подключены, стабильно присылает в ответ 0 либо близкие к нему фантомные числа, отображающиеся в мониторе порта. При Подключении к ардуино HX711 на мониторе порта выводятся реальные цифры массы предмета, но SIM900 уже не шлет в ответ смс :( Такое впечатление, что при подключении к ардуино HX711, ардуино теряет связь с SIM900. В чем может быть проблема? Обидно, цифры нужные в мониторе порта и дисплее отображаются, а переслать их не получается.

okta
Offline
Зарегистрирован: 10.01.2015

Проследите по коду сами, что будет, если вес на весах остается неизменным после проверки этого условия (во второй, третий, четвертый... цатый проходы)? Что будет выполняться следующим действием?

if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего

 

WolfRamm
Offline
Зарегистрирован: 25.05.2017

Это условие вроде как не выполняется в принципе - из-за особенностей HX711 показания все время "гуляют" в пределах 100 г (на весах груз 37.5 кг). Меня это устраивает - важно изменение более 0,5 кг.

Как, писал выше, не очень силен в программировании - насколько понимаю физический смысл:

if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего

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

По идее

 if (round(scale.get_units(10)) != myScale) {      // Условие выполняется, если округленный до граммов вес отличается от последнего
    myScale = scale.get_units(20)/1000;                  // Запоминаем текущий вес
   
    if (myScale > 0.5)                              // Если вес не ничтожно мал
      Serial.println(myScale);                      // то выводим его
    else                                            // иначе
      Serial.println(0.00);                         // выводим нули
   
    myScale = round(myScale);                       // Запоминаем округленный текущий вес (для сравнения)
  }

можно заменить на

    myScale = scale.get_units(20)/1000;                  // Запоминаем текущий вес
   
    if (myScale > 0.5)                              // Если вес не ничтожно мал
      Serial.println(myScale);                      // то выводим его
    else                                            // иначе
      Serial.println(0.00);                         // выводим нули

чтобы ничего не округляло и не запоминало, а выводило как есть?

А потом подать запрос на передачу значения myScale в виде смс?

Если написал ерунду, заранее прошу прощения - только учусь работе с ардуино.

okta
Offline
Зарегистрирован: 10.01.2015

Я бы все что касается замера веса делал бы один раз непосредственно перед отправкой смс. Т.е. после строки

if (!currStr.compareTo("Weight")) {

 

WolfRamm
Offline
Зарегистрирован: 25.05.2017

okta пишет:

Я бы все что касается замера веса делал бы один раз непосредственно перед отправкой смс. Т.е. после строки

if (!currStr.compareTo("Weight")) {

Спасибо, так и сделал - работает. Это логично - если пришел запрос, провели одно измерение, его результат отправили в виде ответа.