Барометр на Ардуино

shapkin
Offline
Зарегистрирован: 17.10.2016
...
shapkin
Offline
Зарегистрирован: 17.10.2016

shapkin
Offline
Зарегистрирован: 17.10.2016

ну как то так

shapkin
Offline
Зарегистрирован: 17.10.2016
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Adafruit_BMP280.h>
#include "RTClib.h"

RTC_DS1307 rtc; 

char daysOfTheWeek[7][12] = {"воскр", "понед", "вторн", "среда", "четвг", "пятн", "субот"};

Adafruit_BMP280 bmp280;
int mm; 

int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 7; // число матриц

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 15; // скорость

int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей

/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

String Serial_Read() {
  unsigned char c; // переменная для чтения сериал порта
  String Serial_string = ""; // Формируемая из символов строка
  while (Serial.available() > 0) { // Если в сериал порту есть символы
    c = Serial.read(); // Читаем символ
    //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
    if (c == '\n') {  // Если это конец строки
          return Serial_string; // Возвращаем строку 
    }
    if (c == 0xB8) c = c - 0x01;  // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
    if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
    Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
  }
  return Serial_string; 
}
String chas;
String myn;
//String mesyc = "";

void setup() {
  
  Serial.begin(9600);
  Serial.println(F("BMP280"));
  //==================================== часы
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
 //====================================
  while (!bmp280.begin(BMP280_ADDRESS - 1)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    delay(2000);
  }
  
 
  
  matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //1 - 90  2 - 180   3 - 270
 //a=a+1;
}
void loop() {
  DateTime now = rtc.now();
  float temperature = bmp280.readTemperature();
  float pressure = bmp280.readPressure();
  float altitude = bmp280.readAltitude(1014.7);
 mm = pressure/133.322;// тут вычисляем мм ртутного столба
 //======================================= корекция цыфр времени ноль перед числом
 chas ="";
 myn = "";
 if (now.hour() < 10) {
chas = '0';
}

if (now.minute() < 10) {
myn = ('0');
}

//=======================================
 tape = utf8rus((String)+daysOfTheWeek[now.dayOfTheWeek()]+"     время  "+chas +now.hour()+":"+myn+now.minute()+"    температура = "+temperature +"^С   время   " +chas +now.hour()+":"+myn+now.minute()+  "    давление = "+ mm +" мм/рт.ст.");
  if (Serial.available()){
    tape=Serial_Read();
  } 
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) 
       {
    matrix.fillScreen(LOW);

    int letter = i / width; // номер символа выводимого на матрицу 
    
    int x = (matrix.width() - 1) - i % width;  
    int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Отправить картинку для отображения
    delay(wait);
  }
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

начнем, помолясь, с самого начала.  Хто тебя вот этому научил? 

char daysOfTheWeek[7][12] = {"воскр", "понед", "вторн", "среда", "четвг", "пятн", "субот"};

 

shapkin
Offline
Зарегистрирован: 17.10.2016

в этот массив больше 5 символов не залазит.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

shapkin пишет:

в этот массив больше 5 символов не залазит.

Но вопрос другой был.  Где ты это увидел, или кто тебя научил такому? 

shapkin
Offline
Зарегистрирован: 17.10.2016

а че там не так.

b707
Онлайн
Зарегистрирован: 26.05.2017

shapkin пишет:

в этот массив больше 5 символов не залазит.

что за бред?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

А у меня залазит 

const char* const DaysString[] = {
	"воскресенье",
	"понедельник",
	"вторник",
	"среда",
	"четверг",
	"пятница",
	"суббота"
};

const uint8_t DAYS_COUNT = 7;


void PrintDays() {
	for (uint8_t i = 0; i < DAYS_COUNT; ++i) {
		Serial.println(DaysString[i]);
	}
}

 

shapkin
Offline
Зарегистрирован: 17.10.2016

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

initializer-string for array of chars is too long [-fpermissive]

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

тогда тебе надо чонить за UTF-8 почитать

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

2. ....<тут было матом>...

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

wdrakula пишет:

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

2. ....<тут было матом>...

Спасибо, давно так не ржал. :))))) 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

wdrakula пишет:

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

2. ....<тут было матом>...

Спасибо, давно так не ржал. :))))) 

Над тем, что я запятую перед "если" пропустил? ;))

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

wdrakula пишет:

Над тем, что я запятую перед "если" пропустил? ;))

Нет, над меткими характеристиками происходящего

shapkin
Offline
Зарегистрирован: 17.10.2016

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

shapkin
Offline
Зарегистрирован: 17.10.2016
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Adafruit_BMP280.h>
#include "RTClib.h"

RTC_DS1307 rtc; 

char daysOfTheWeek[7][24] = {"воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "субота"};
//char monthe[12][24] = { "Декабрь","январь","Февраль", "Март", "апрель", "Май", "Июнь", "июль", "Август", "Сентябрь", "Октябрь", "Ноябрь"};
Adafruit_BMP280 bmp280;
int mm; 

int pinCS = 10; // Uno or Duemilanove DIN 11 (MOSI) CLK 13 (SCK)
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 7;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 15; // скорость

int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей

/* Recode russian fonts from UTF-8 to Windows-1251 */

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

String Serial_Read() {
  unsigned char c; // переменная для чтения сериал порта
  String Serial_string = ""; // Формируемая из символов строка
  while (Serial.available() > 0) { // Если в сериал порту есть символы
    c = Serial.read(); // Читаем символ
    //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
    if (c == '\n') {  // Если это конец строки
          return Serial_string; // Возвращаем строку 
    }
    if (c == 0xB8) c = c - 0x01;  // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
    if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
    Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
  }
  return Serial_string; 
}
String chas;
String myn;
//String mesyc = "";
int stroka = 0;//переменая строки

void setup() {
  
  Serial.begin(9600);
  Serial.println(F("BMP280"));
  //==================================== часы
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    // When time needs to be set on a new device, or after a power loss, the
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
 //====================================
  while (!bmp280.begin(BMP280_ADDRESS - 1)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    delay(2000);
  }
  
 
  
  matrix.setIntensity(3); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //1 - 90  2 - 180   3 - 270
 //a=a+1;
}
void loop() {
  DateTime now = rtc.now();
  float temperature = bmp280.readTemperature();
  float pressure = bmp280.readPressure();
  float altitude = bmp280.readAltitude(1014.7);
 mm = pressure/133.322;
 //======================================= корекция цыфр времени ноль перед числом
 chas ="";
 myn = "";
 if (now.hour() < 10) {
chas = '0';
}

if (now.minute() < 10) {
myn = ('0');
}

//=======================================

    if (stroka == 0) {

 tape = utf8rus((String)"    "+daysOfTheWeek[now.dayOfTheWeek()]+"");
   }
   if (stroka == 1) {

 tape = utf8rus((String)"     время  "+chas +now.hour()+":"+myn+now.minute()+"    температура = "+temperature +"^С       давление = "+ mm +" мм/рт.ст.");
   }
   stroka += 1;
   if (stroka == 2) {
    stroka = 0;
    
   }
 if (Serial.available()){
    tape=Serial_Read();
  } 
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) 
       {
    matrix.fillScreen(LOW);

    int letter = i / width; // номер символа выводимого на матрицу 
    
    int x = (matrix.width() - 1) - i % width;  
    int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Отправить картинку для отображения
    delay(wait);
  }
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

shapkin пишет:

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

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

кстати, массив дней недели, так как он у тебя обьявлен, жрёть 168 байт ОЗУ, а так как у меня - меньше, 117 всего.  Чуешь разность на ровном месте?  

shapkin
Offline
Зарегистрирован: 17.10.2016

кому интересно посмотреть как работает. вот видео.

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

240265
240265 аватар
Offline
Зарегистрирован: 12.08.2015

А чо даты полной нету ?

Blackhock
Offline
Зарегистрирован: 09.02.2018

А как на счёт датчика BME280?

progrik
Offline
Зарегистрирован: 30.12.2018

shapkin пишет:
вот видео
строка Бога))
ты устанавливаешь температуру и давление среды, совершаешь побитовые операции с температурой и миллиметры делишь на ртутный столб))

я бы сделал через двоеточия, слова писал-бы с Большой Буквы, десятичные через запятую, нарисовал знак градусов ° и давление написал по человечески "мм рт. ст."
Пятница Температура: 27,1°С Давление: 748 мм рт. ст.
и т.д...

но это дело личное, кому как нравится)
ЗЫ: я кодер, но воспитывали меня дизайнеры)) шутка)