Часы DS1307 + MAX7219 7-сегментный индикатор

Vitali-71
Offline
Зарегистрирован: 25.04.2017


Ребята, ДОБРОГО всем ДНЯ! Прошу помощи!!! у меня есть - 

MAX7219 7-сегментный индикатор;

Часы DS1307;

Датчик Температуры и Влажности DH-22

Есть - скетч для вывода скетча часов в Монитор Порт.

Проблема - не могу понять как вывести данные часов на дисплей!!!

Прошу помочь, заранее спасибо!!!

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include "LedControl.h"
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;
LedControl lc1=LedControl(13,12,11,1); // DIN,CLK,CS

void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
    lc1.shutdown(0,false);
    lc1.setIntensity(0,1);
    lc1.clearDisplay(0);

    lc1.setDigit(0,6,0,false);
    lc1.setDigit(0,5,0,false);
    lc1.setDigit(0,4,0,false);
    lc1.setDigit(0,2,0,false);
    lc1.setDigit(0,1,0,false);
    lc1.setDigit(0,0,0,false);

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
    DateTime now = RTC.now();
    
  /*  Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');*/
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    
   /* Serial.print("");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // calculate a date which is 7 days and 30 seconds into the future
    //DateTime future (now.unixtime() + 7 * 86400L + 30);
    
   Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
   */ 
    Serial.println();
    delay(3000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vitali-71 пишет:

Проблема - не могу понять как вывести данные часов на дисплей!!!

Вопрос №1. А просто цифру 2 Вы можете вывести на дисплей? В любую позицию?

Вопрос №2. А значение целой переменной, считая, что оно от 0 до 9, Вы можете вывести на дисплей? В любую позицию?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Vitali-71 пишет:

Проблема - не могу понять как вывести данные часов на дисплей!!!

Вопрос №1. А просто цифру 2 Вы можете вывести на дисплей? В любую позицию?

Вопрос №2. А значение целой переменной, считая, что оно от 0 до 9, Вы можете вывести на дисплей? В любую позицию?

по 1 вопросу наверное смогу, а по второму не понимаю тут!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда сделайте скетч в котором нет ни хрена, только вывод на экранчик константых цифирок. Выложите код. Тогда подумаем как переменную вывести.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Тогда сделайте скетч в котором нет ни хрена, только вывод на экранчик константых цифирок. Выложите код. Тогда подумаем как переменную вывести.

Хорошо, к вечеру выложу!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Давайте, делайте. а там подскажем, что дальше делать.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Давайте, делайте. а там подскажем, что дальше делать.

Вот сделал!!! 

#include "LedControl.h"
/*
 pin 12 is connected to the DIN
 pin 11 is connected to the CLK 
 pin 10 is connected to CS 
 */

LedControl lc1=LedControl(13,12,11,1); // DIN,CLK,CS


int key1Pin = 3;
int key2Pin = 4;

int key3Pin = 5;
int key4Pin = 6;

int k;
int k1;
int k10;
int k100;

int l;
int l1;
int l10;
int l100;

int m;
int m1;
int m10;
int m100;

int n;
int n1;
int n10;
int n100;


byte a[1]={B00000001};

void setup()
{
  Serial.begin(9600);
  
  lc1.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc1.setIntensity(0,1);
  /* and clear the display */
  lc1.clearDisplay(0);

  lc1.setDigit(0,7,0,false);
  lc1.setDigit(0,6,2,false); // на 6 сегменте, (2 слева) высвечивается цифра 2!
  lc1.setDigit(0,5,0,false);
  lc1.setDigit(0,4,0,false);
  lc1.setDigit(0,3,0,false);
  lc1.setDigit(0,2,0,false);
  lc1.setDigit(0,1,0,false);
  lc1.setDigit(0,0,0,false);
  
  pinMode(key1Pin, INPUT);
  digitalWrite(key1Pin, HIGH);
  pinMode(key2Pin, INPUT);
  digitalWrite(key2Pin, HIGH);
  pinMode(key3Pin, INPUT);
  digitalWrite(key3Pin, HIGH);
  pinMode(key4Pin, INPUT);
  digitalWrite(key4Pin, HIGH);
  }

void loop()
{/*
  if(digitalRead(key1Pin)==LOW)
  {
    k++;

    if(k==1000)
    {
      k = 0;
    }
    if(k<0)
    {
      int kTemp = k;
      kTemp = kTemp *(-1);
      k100 = kTemp/100;
      k10 =(kTemp-(k100*100))/10;
      k1 = kTemp - (k100*100) - (k10*10);
      lc1.setRow(0,7,a[0]);
      lc1.setDigit(0,6,k100,false);
      lc1.setDigit(0,5,k10,false);
      lc1.setDigit(0,4,k1,false);
      Serial.println(k);
    }
    else
    {
      k100 = k/100;
      k10 =(k-(k100*100))/10;
      k1 = k - (k100*100) - (k10*10);
      lc1.setChar(0,7,' ',false);
      lc1.setDigit(0,6,k100,false);
      lc1.setDigit(0,5,k10,false);
      lc1.setDigit(0,4,k1,false);
      Serial.println(k);
    }
    delay(500);
  }

  if(digitalRead(key2Pin)==LOW)
  {
    k--;

    if(k<-999)
    {
      k = 0;
    }
    
    if(k<0)
    {
      int kTemp = k;
      kTemp = kTemp *(-1);
      k100 = kTemp/100;
      k10 =(kTemp-(k100*100))/10;
      k1 = kTemp - (k100*100) - (k10*10);
      lc1.setRow(0,7,a[0]);
      lc1.setDigit(0,6,k100,false);
      lc1.setDigit(0,5,k10,false);
      lc1.setDigit(0,4,k1,false);
      Serial.println(k);
    }
    else
    {
      k100 = k/100;
      k10 =(k-(k100*100))/10;
      k1 = k - (k100*100) - (k10*10);
      lc1.setChar(0,7,' ',false);
      lc1.setDigit(0,6,k100,false);
      lc1.setDigit(0,5,k10,false);
      lc1.setDigit(0,4,k1,false);
      Serial.println(k);
    }
    delay(500);
  }
  *-------------------------------*
  if(digitalRead(key3Pin)==LOW)
  {
    l++;

    if(l==1000)
    {
      l = 0;
    }
    if(l<0)
    {
      int lTemp = l;
      lTemp = lTemp *(-1);
      l100 = lTemp/100;
      l10 =(lTemp-(l100*100))/10;
      l1 = lTemp - (l100*100) - (l10*10);
      lc1.setRow(0,3,a[0]);
      lc1.setDigit(0,2,l100,false);
      lc1.setDigit(0,1,l10,false);
      lc1.setDigit(0,0,l1,false);
      Serial.println(l);
    }
    else
    {
      l100 = l/100;
      l10 =(l-(l100*100))/10;
      l1 = l - (l100*100) - (l10*10);
      lc1.setChar(0,3,' ',false);
      lc1.setDigit(0,2,l100,false);
      lc1.setDigit(0,1,l10,false);
      lc1.setDigit(0,0,l1,false);
      Serial.println(l);
    }
    delay(500);
  }

  if(digitalRead(key4Pin)==LOW)
  {
    l--;

    if(l<-999)
    {
      l = 0;
    }
    
    if(l<0)
    {
      int lTemp = l;
      lTemp = lTemp *(-1);
      l100 = lTemp/100;
      l10 =(lTemp-(l100*100))/10;
      l1 = lTemp - (l100*100) - (l10*10);
      lc1.setRow(0,3,a[0]);
      lc1.setDigit(0,2,l100,false);
      lc1.setDigit(0,1,l10,false);
      lc1.setDigit(0,0,l1,false);
      Serial.println(l);
    }
    else
    {
      l100 = l/100;
      l10 =(l-(l100*100))/10;
      l1 = l - (l100*100) - (l10*10);
      lc1.setChar(0,3,' ',false);
      lc1.setDigit(0,2,l100,false);
      lc1.setDigit(0,1,l10,false);
      lc1.setDigit(0,0,l1,false);
      Serial.println(l);
    }
    delay(500);
  }*/
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vitali-71 пишет:

  lc1.setDigit(0,7,0,false);
  lc1.setDigit(0,6,2,false); // на 6 сегменте, (2 слева) высвечивается цифра 2!
  lc1.setDigit(0,5,0,false);
  lc1.setDigit(0,4,0,false);
  lc1.setDigit(0,3,0,false);
  lc1.setDigit(0,2,0,false);
  lc1.setDigit(0,1,0,false);
  lc1.setDigit(0,0,0,false);

А на остальных, видимо, 0. Но Вы понимаете как на любой сегмент любую цифру вывести, правильно?

Теперь попробуйте завести переменную и высветить её, примерно так

int n = 7;
lc1.setDigit(0, 6 , n, false); // на 6 сегменте, (2 слева) высвечивается значение переменной n уж какое есть

После этого сделайте последний шаг. Вы ведь выводили в монитор порта часы и минуты, так ведь. Ну. а теперь выведите их в правильные знакоместа индикатора также, как мы n выводили.

Для это придётся разбить часы (минуты) на единицы и десятки (выводить же придётся отдельно цифирьку единиц и цифирьку десятков). Знаете как это сделать?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Vitali-71 пишет:

  lc1.setDigit(0,7,0,false);
  lc1.setDigit(0,6,2,false); // на 6 сегменте, (2 слева) высвечивается цифра 2!
  lc1.setDigit(0,5,0,false);
  lc1.setDigit(0,4,0,false);
  lc1.setDigit(0,3,0,false);
  lc1.setDigit(0,2,0,false);
  lc1.setDigit(0,1,0,false);
  lc1.setDigit(0,0,0,false);

А на остальных, видимо, 0. Но Вы понимаете как на любой сегмент любую цифру вывести, правильно?

Теперь попробуйте завести переменную и высветить её, примерно так

int n = 7;
lc1.setDigit(0, 6 , n, false); // на 6 сегменте, (2 слева) высвечивается значение переменной n уж какое есть

После этого сделайте последний шаг. Вы ведь выводили в монитор порта часы и минуты, так ведь. Ну. а теперь выведите их в правильные знакоместа индикатора также, как мы n выводили.

Для это придётся разбить часы (минуты) на единицы и десятки (выводить же придётся отдельно цифирьку единиц и цифирьку десятков). Знаете как это сделать?

"После этого сделайте последний шаг. Вы ведь выводили в монитор порта часы и минуты, так ведь. Ну. а теперь выведите их в правильные знакоместа индикатора также, как мы n выводили."

Выводить в Setup или Loop надо 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так Вы посмотрите первое сообщение темы. Там же время выводится в мониитор порта. Вот точно также и выводите, только на индикатор (а лучше для начала и в мониитор (как было) и на индикатор - для контроля и отладки).

Vitali-71
Offline
Зарегистрирован: 25.04.2017

ЕвгенийП пишет:

Так Вы посмотрите первое сооющение темы. Там же время выводится в мониитор порта. Вот точно также и выводите, только на индикатор (а лучше для начала и в мониитор (как было) и на индикатор - для контроля и отладки).

Понял, пробую!!!

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017
Vitali-71 пишет:

ЕвгенийП пишет:

Так Вы посмотрите первое сооющение темы. Там же время выводится в мониитор порта. Вот точно также и выводите, только на индикатор (а лучше для начала и в мониитор (как было) и на индикатор - для контроля и отладки).

Понял, пробую!!!

 

Так, изменить на 6-ой строчке, цифру с помощью int получилось, но со второй задачей не справился...

подскажите подробней, как вывести данные на дисплей!!!

вот скетч,

//We always have to include the library
#include "LedControl.h"
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
/* pin 13 is connected to the DIN
   pin 12 is connected to the CLK 
   pin 11 is connected to CS
   We have only a single MAX72XX.*/
LedControl lc=LedControl(13,12,11,1);

int n = 7;
void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");

  /*
   MAX72XX находится в режиме энергосбережения при запуске,
   мы должны сделать пробуждение
   */
  lc.shutdown(0,false);
  /* Установите яркость на средние значения */
  lc.setIntensity(0,8);
  /* и очистить дисплей */
  lc.clearDisplay(0);
  lc.setDigit(0,7,0,false);
  lc.setDigit(0,6,n,false); // на 6 сегменте, (2 слева) высвечивается цифра 2!
  lc.setDigit(0,5,0,false);
  lc.setDigit(0,4,0,false);
  lc.setDigit(0,3,0,false);
  lc.setDigit(0,2,0,false);
  lc.setDigit(0,1,0,false);
  lc.setDigit(0,0,0,false);

}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = "); //Надпись перед часами
    print2digits(tm.Hour);       //время - часы
    Serial.write(':');
    print2digits(tm.Minute);     //время - минуты
    Serial.write(':');
    print2digits(tm.Second);     //время - секунды
    Serial.write(';');
    
    Serial.println();            //печать с новой строки
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

часы в монитор порт работают...

 
из него мне надо вывести только часы и минуты без всяких надписей!
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код как положено, чтобы номера строк были.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

извини, не заметил ошибку!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, значит, код из первого сообщения писали не Вы и что там написано Вы не понимаете, так? Хреново.

Из последнего кода убирайте нахрен строки 28-35 (и строку 12 заодно).

После стоки 49 вставляйте.

lc.setDigit(0,6, tm.Second % 10,false);
lc.setDigit(0,7, tm.Second / 10,false);

В позициях 6 и 7 появятся секунды и будут меняться кажду секунду (возможно, они будут задом наперёд, я не знаю где у Вас лево. а где право, если так, то поменяёте в моих строка цифры 6 и 7). Меняться они будут одновременно с выводом в монитор порта.

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

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Все, класс, супер!!!

Спасибо!!! вопрос еще 1, как точку сделать мигающей?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Vitali-71 пишет:

Все, класс, супер!!!

Спасибо!!! вопрос еще 1, как точку сделать мигающей?

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не знаю, что за библиотека "LedControl.h", возможно, там есть что-то готовое на эту тему. Но если нет, то точно также, как в примере блинк без делэй, только зажигать и гасить не светодиод, а точку. Лучше раз в полсекунды, так красивее, чем раз в секунду.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

понял, спасибо!

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Ребята, есть еще один вопрос...

сделал я свои часы...

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

//We always have to include the library
#include "LedControl.h"
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

#include <DHT_U.h>
#define DHTPIN            3         // Pin which is connected to the DHT sensor.
#define DHTTYPE           DHT22     // DHT 22 (AM2302)

/* pin 13 is connected to the DIN
   pin 12 is connected to the CLK 
   pin 11 is connected to CS
   We have only a single MAX72XX.*/
LedControl lc=LedControl(13,12,11,1);

byte a[1]={B10000000};
byte b[1]={B00000000};

DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");

  /* MAX72XX находится в режиме энергосбережения при запуске,
     мы должны сделать пробуждение*/
  lc.shutdown(0,false);
  /* Установите яркость на средние значения */
  lc.setIntensity(0,8);
  /* и очистить дисплей */
  lc.clearDisplay(0);
  //lc.setRow(0,5,a[0]);
  dht.begin();
  Serial.println("DHTxx Unified Sensor Example");
  // Print temperature sensor details.
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Temperature");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" *C");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" *C");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" *C");  
  Serial.println("------------------------------------");
  // Print humidity sensor details.
  dht.humidity().getSensor(&sensor);
  Serial.println("------------------------------------");
  Serial.println("Humidity");
  Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println("%");
  Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println("%");
  Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println("%");  
  Serial.println("------------------------------------");
  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;

}

void loop() {
  tmElements_t tm;
  
  if (RTC.read(tm)) {
      
    Serial.print("Ok, Time = "); //Надпись перед часами
    print2digits(tm.Hour);       //время - часы
    Serial.write(':');
    print2digits(tm.Minute);     //время - минуты
    Serial.write(':');
    print2digits(tm.Second);     //время - секунды
    Serial.write(';');
    Serial.println();            //печать с новой строки
    
    lc.setDigit(0,7, tm.Hour / 10,false);
    lc.setDigit(0,6, tm.Hour % 10,false); //печать точки как секунда
    lc.setDigit(0,5, tm.Minute / 10,false);
    lc.setDigit(0,4, tm.Minute % 10,false);
    delay(600);
    lc.setDigit(0,6, tm.Hour % 10,true);
    delay(400);
    } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(500);

  
// Delay between measurements.
  delay(delayMS);
  // Get temperature event and print its value.
  sensors_event_t event;  
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
  }
  else {
    Serial.print("Temperature: ");
    Serial.print(event.temperature);
    Serial.println(" *C");
    
    lc.setDigit(0,2, event.temperature / 10,false);
    lc.setDigit(0,1, / 10,false);
  
        
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  }
  else {
    Serial.print("Humidity: ");
    Serial.print(event.relative_humidity);
    Serial.println("%");
  }  
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

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

заранее спасибо!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

чустую, без моих таймеров тебе не обойтись... 

https://www.youtube.com/watch?v=NmL4b7wAZVg

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

Vitali-71 пишет:

Ребята, есть еще один вопрос...

сделал я свои часы...

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

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

А взять и подумать чуть, чуть? Или уже чудесный ЕвгенийП появился, который программы пишет?
Цифирки выводить научились. Теперь пять секунд выводим цифирки времени, пять секунд цифирки давления и т.д. Потом все сначала.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

А тебе тяжело подсказать? я всего работаю с Ардухой 3-ий месяц!

 

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

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

Vitali-71
Offline
Зарегистрирован: 25.04.2017

так я и пишу, что часы заработали! но с термометром не получается!!!

я пишу два числа, а он пишет:

    lc.setDigit(0,2, event.temperature / 10,false);
    lc.setDigit(0,1, event.temperature / 10,false);

а что дальше делать не пойму!!!!

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Нужно перечитать еще раз сообщение #15 и найти различия между двумя строчками (подсказка: в третьем параметре функции)...

Vitali-71
Offline
Зарегистрирован: 25.04.2017

sadman41 пишет:

Нужно перечитать еще раз сообщение #15 и найти различия между двумя строчками (подсказка: в третьем параметре функции)...

вы имеете символы / и %???

если да, то прописывая их, мне на строке с % он выдает ОШИБКУ!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И правильно делает, смотрите какого типа Ваша event.temperature.

Гриша
Offline
Зарегистрирован: 27.04.2014

Vitali-71 пишет:

А тебе тяжело подсказать? я всего работаю с Ардухой 3-ий месяц!

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

Vitali-71
Offline
Зарегистрирован: 25.04.2017
// Delay between measurements.
  delay(delayMS);
  // Get temperature event and print its value.
  sensors_event_t event;  
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
    } else {
    Serial.print("Temperature: ");
    Serial.print(event.temperature);
    Serial.println(" *C");
    
    lc.setDigit(0,2, event.temperature / 10,false);
    lc.setDigit(0,1, event.temperature / 10,false);
    lc.setRow(0,0,c[0]);  
        
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  } else {
    Serial.print("Humidity: ");
    Serial.print(event.relative_humidity);
    Serial.println("%");
  } 
  delay(500);
}

ЕвгенийП пишет:

И правильно делает, смотрите какого типа Ваша event.temperature.

тогда я не понимаю какое надо???

может я ТУПОЙ, не отрицаю...

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

в 14 строке если пишешь %, то ошибку выдает!!

Гриша
Offline
Зарегистрирован: 27.04.2014

Vitali-71 пишет:

// Delay between measurements.
  delay(delayMS);
  // Get temperature event and print its value.
  sensors_event_t event;  
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println("Error reading temperature!");
    } else {
    Serial.print("Temperature: ");
    Serial.print(event.temperature);
    Serial.println(" *C");
    
    lc.setDigit(0,2, event.temperature / 10,false);
    lc.setDigit(0,1, event.temperature / 10,false);
    lc.setRow(0,0,c[0]);  
        
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println("Error reading humidity!");
  } else {
    Serial.print("Humidity: ");
    Serial.print(event.relative_humidity);
    Serial.println("%");
  } 
  delay(500);
}

тогда я не понимаю какое надо???

что делает строка 13? как вы ее понимаете?

sadman41
Offline
Зарегистрирован: 19.10.2016

Vitali-71 пишет:

вы имеете символы / и %???

если да, то прописывая их, мне на строке с % он выдает ОШИБКУ!!!

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

Проблема в том, что температура и влажность представляют из себя не целое число, а число с плавающей запятой. Т.е. там может быть четыре значащих цифры и запятая. Таким образом вам нужно определиться, что вы делаете - отбрасываете дробную часть или не отбрасываете... если первое, то делаете, например, int(event.temperature) % 10 и int(event.temperature) % 10.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Гриша пишет:

Vitali-71 пишет:

А тебе тяжело подсказать? я всего работаю с Ардухой 3-ий месяц!

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

У меня все эти скетчи есть! просто термометр только ОДНУ цифру пишет!!!

так что не понял, не лезь!

Гриша
Offline
Зарегистрирован: 27.04.2014

Vitali-71 пишет:

У меня все эти скетчи есть! просто термометр только ОДНУ цифру пишет!!!

так что не понял, не лезь!

чукча не читатель, чукча писатель :)))))))))))))

UPD  пост 32

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:
я поставил все эти дурацкие библиотеки и откомпилировал скетч.
Так вроде ж там вариантов негусто. Я давно написал
ЕвгенийП пишет:
смотрите какого типа Ваша event.temperature.
Только зря Вы так сразу, ТС было бы полезнее самому найти.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Гриша пишет:

Vitali-71 пишет:

У меня все эти скетчи есть! просто термометр только ОДНУ цифру пишет!!!

так что не понял, не лезь!

чукча не читатель, чукча писатель :)))))))))))))

чувствуется что этот ЧУКЧА (Arduino) мне все нервы изматает!!

Vitali-71
Offline
Зарегистрирован: 25.04.2017
Casi_na_disp:117: error: invalid operands of types 'float' and 'int' to binary 'operator%'

exit status 1
invalid operands of types 'float' and 'int' to binary 'operator%'

А вот  ошибка!!!

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

\Только зря Вы так сразу, ТС было бы полезнее самому найти.

Понял. Пойду тогда налью и понаблюдаю за развитием ситуации.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну тут же прямо всё и написано! Поправьте тип - делов-то.

Vitali-71
Offline
Зарегистрирован: 25.04.2017

мля, не понимаю!

Гриша
Offline
Зарегистрирован: 27.04.2014

на заре перекроил библиотеку под себя для 1 датчика, и теперь использую только ее, криво и косо, но работает. Много чего удаляю когда пользуюсь...

/*
попытка избавиться от "повисания" при измерении температуры
в IDE 1.8.3 - ошибок не обнаружено, а в 1.0.6 - не работает :(

*/

#include <OneWire.h>
OneWire  ds(8);          // Линия 1-Wire будет на этом выходе

void setup(void)  
{ 
  Serial.begin(9600); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
}



// температура 1 датчика. начало-+++++++++++++++++++++++++++++++++++++++++

 int SignBit;      // знак температуры
 int Tc_100;       // умножено на 100 целочисленное значение температуры, т.е. запятая "подвинута" на 2 знака
 byte ERR = 0;      // ошибка при обращении к датчику
 byte readnew=0;   // признак получения новой температуры, необходимо сбрасывать после обработки
 byte  part; // часть кода до/после запроса на конвертацию
 byte  tick_tempr;
 unsigned long previousMillis1t = 0;


void GETTEMP ()
{
  byte present = 0;
  byte data[12];
  byte addr[8];
  unsigned long currentMillis1t = millis();

  if (currentMillis1t - previousMillis1t >= 500)   
  {
    previousMillis1t = currentMillis1t;
    tick_tempr++;
  }
 
  if ( part >= 2 )  //// проверка антисбой !!!!!!!!!!!!     
       {
             part = 0;
             tick_tempr = 0;
       }      
   
 if (part == 0) // запрос на преобразование, до получения данных из датчика
 {   
  if (!ds.search(addr)) {
      ds.reset_search();
      ERR=1;
      return;
  }
  if (OneWire::crc8( addr, 7) != addr[7]) {
//     Serial.print("CRC is not valid!\n"); //CRC is used for data transfer validation  !!!!!!!!!!!!!!!!!!!!!!!!
      ERR=2;
      return;
  }
  
  if (addr[0] != 0x28) {
//      Serial.print("Device is not a DS18B20  device.\n"); /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!
      ERR=3;
      return;
  }
  ERR=0;
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);   // Запускаем конвертацию
  tick_tempr = 0;  // запускаем таймер преобразования с этого момента
  part = 1;
  previousMillis1t = currentMillis1t;
 } // and   запрос на преобразование, до получения данных из датчика

 
  if (part == 1 && tick_tempr >= 2) //если прошло больше  ( > 1 секунды)
  {                                 // подробности в даташите!!!!!!!!!!
  
  present = ds.reset();
  ds.select(addr); 

  ds.write(0xBE);    // Считываем ОЗУ датчика  

  for (byte i = 0; i < 9; i++)    // Обрабатываем 9 байт
  {     data[i] = ds.read();   }
  
  // Высчитываем температуру :)

  int TReading;
  TReading = (data[1] << 8) + data[0];
  
   SignBit = TReading & 0x8000;      // Проверяем дубак там или нет
   if (SignBit)                      // Если на улице дубак :)
   { TReading = (TReading ^ 0xffff) + 1;  }

   Tc_100 = (6 * TReading) + TReading / 4;     // Умножаем на (100 * 0.0625) или 6.25
                                               // т.е. убираем 4 лишних бита                                         
   readnew =1;  
   part = 0;   
   tick_tempr = 0;
}
}
//----------------------------------конец получения температуры


void loop() 
{
   
 GETTEMP (); // получаем температуру

   // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   Serial.print("ERR= ");
   Serial.println(ERR );

   Serial.print("part= ");
   Serial.println(part );
   
   Serial.print("tick_tempr= ");  
   Serial.println(tick_tempr); 

   
 if ( readnew == 1)
 {
   Serial.print("              Tc_100= ");
   Serial.println(Tc_100);  
   readnew =0;
 }

 delay (300); /// удалить, просто для проверки
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Чего Вы не понимаете?

В конце концо в последних строчках поста #33 уже просто написано как делать - и понимать ничего не надо. Надо просто написать как там написано. Или Вы не читаете что Вам пишут?

Vitali-71
Offline
Зарегистрирован: 25.04.2017

то есть надо прописать в самом начале int прописать ?

Гриша
Offline
Зарегистрирован: 27.04.2014

Vitali-71 пишет:

то есть надо прописать в самом начале int прописать ?

Преобразование типов данных
Гриша
Offline
Зарегистрирован: 27.04.2014

ЕвгенийП пишет:

Чего Вы не понимаете?

В конце концо в последних строчках поста #33 уже просто написано как делать - и понимать ничего не надо. Надо просто написать как там написано. Или Вы не читаете что Вам пишут?

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

Vitali-71
Offline
Зарегистрирован: 25.04.2017

гриша, стоп, знак минус мне не нужен!

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

тут вообще не соображаю...

 

Гриша
Offline
Зарегистрирован: 27.04.2014

Vitali-71 пишет:

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

тут вообще не соображаю...

снова пост 38, нужно поменять Тип вещественного числа с плавающей запятой на Основной тип целого числа со знаком, ну или другой подходящий

 

Vitali-71
Offline
Зарегистрирован: 25.04.2017

Гриша пишет:

Vitali-71 пишет:

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

тут вообще не соображаю...

снова пост 38, нужно поменять Тип вещественного числа с плавающей запятой на Основной тип целого числа со знаком, ну или другой подходящий

 

смотри... прописываю int далее просто я не могу понять что дальше прописать? event?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Vitali-71 пишет:

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

Блин, но Вы бы за это время уже сто раз попробовали. Ну, посмотрите на свой 25 пост! А теперь вместо "event.temperature" тупо напишите так, как написано в посте №33. В одной строке с "/", а в другой с "%"

Давно бы уже попробовали! Делов-то, блин!