Неверно отображается день недели.

Xakep.rus
Offline
Зарегистрирован: 25.06.2017

Доброго времени суток)

Столкнулся с проблемой отображения дня недели словом, вместо него отображается месяц..

если поменять местами 138-ю и 139-ю строки - день недели вообще не отображается(

Подскажите где я косячу.

Собсно код:

#include <LCD5110_Graph.h>
// SCK - 2, MOSI - 3, DC - 4, RST - 6, CS - 5
LCD5110 myGLCD(2,3,4,6,5);

extern unsigned char TinyFont[];
extern unsigned char SmallFont[];
extern unsigned char MediumNumbers[];
extern unsigned char BigNumbers[];

const char * mes[] =
{ "December", "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November" }; 
const char * den[] =
{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

#include <DS3231.h>
DS3231 RTC;
RTCDateTime dt;
#include <Wire.h>

#include <DHT.h>
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

byte LEDpin = 9;

byte tem;
byte hum;
byte h;
byte m;
byte s;
byte d;
byte M;
byte D;

const unsigned char PROGMEM pill [] = {
0x0E, 0x1F, 0x1F, 0x1F, 0x0E, 
};

const unsigned char PROGMEM perc[] = {
0X3C,0X7E,0XE7,0XC3,0XC3,0XE7,0X7E,0X3C,0X00,0X00,0XC0,0XF0,0X78,0X1E,0X07,0X03,
0X00,0X00,0X00,0X00,0X00,0XC0,0XF0,0X78,0X1E,0X07,0X03,0X00,0X00,0X00,0X00,0X00,
0XC0,0XF0,0X78,0X1E,0X07,0X03,0X00,0X00,0X3C,0X7E,0XE7,0XC3,0XC3,0XE7,0X7E,0X3C,
};

const unsigned char PROGMEM bulb[] = {
0X00,0X00,0X00,0X00,0X00,0XE0,0XFC,0XFF,0XFF,0XFC,0XE0,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X80,0XF0,0XFF,0XFF,0X7F,0X1F,0XFF,0XFF,0XFF,0XFF,0XF0,0X80,0X00,0X00,
0X00,0X00,0X07,0X1F,0X3F,0X7F,0XFC,0XF8,0XFF,0XFF,0X7F,0X3F,0X1F,0X07,0X00,0X00,
};


const unsigned char PROGMEM grad [] = {
0X00,0X00,0X00,0XA0,0XA0,0XFC,0XA2,0XA3,0X03,0X02,0XFC,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X0A,0X8A,0XFF,0X0A,0X0A,0X00,0X00,0XFF,0X80,0X00,0X00,0X00,0X00,
0X00,0X00,0X1E,0X3F,0X7F,0X7F,0XFF,0XFF,0XFF,0XFF,0X7F,0X7F,0X3F,0X1E,0X00,0X00,
};

const unsigned char PROGMEM gr[] = {
0X3C,0X7E,0XE7,0XC3,0XC3,0XE7,0X7E,0X3C,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
};


byte nowBLnum = 50;

void setup()
{
  dht.begin();
  RTC.begin();
  Serial.begin(9600);
  
//  RTC.setDateTime(__DATE__, __TIME__);

  myGLCD.InitLCD();
  myGLCD.setFont(MediumNumbers);
  myGLCD.drawRoundRect(0,0, 83,47);
  myGLCD.update();

  pinMode(LEDpin, OUTPUT);

}

void loop()
{
  newBackLigth(map(analogRead(1), 280, 1023, 5, 255));
  
  myGLCD.drawRoundRect(0,0, 83,47);

    if (s <= 15 || ( s >25 && s <=45)) 
  {WATCH();}
    else  if (s >15 && s <=19 || (s >45 && s <=49))
    {DATE();}
      else if (s >19 && s <=22 || (s >49 && s <=52))
      {TEMP();}
        else if (s >22 && s <=25 || (s >52 && s <=55))
        {HUM();}
          else
          {WATCH();}

  
  dt = RTC.getDateTime();
  hum = dht.readHumidity();
  tem = dht.readTemperature();
  h = dt.hour;
  m = dt.minute;
  s = dt.second;
  d = dt.day;
  M = dt.month;
  D = dt.dayOfWeek;
}

void WATCH()
{
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(h/10,3,3);
  myGLCD.printNumI(h%10,20,3);
  myGLCD.printNumI(m/10,50,3);
  myGLCD.printNumI(m%10,67,3);
  if (s % 2 == 0)
  {
    myGLCD.drawBitmap(40, 7, pill, 5, 5);
    myGLCD.drawBitmap(40, 18, pill, 5, 5);
  }
  myGLCD.setFont(SmallFont);
  myGLCD.printNumI(dt.unixtime, CENTER, 38);
  myGLCD.update();
  myGLCD.clrScr();
}

void DATE()
{
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(d/10,26,12);
  myGLCD.printNumI(d%10,44,12);
  myGLCD.setFont(SmallFont);
  myGLCD.print(M[mes],CENTER,38);
  myGLCD.print(D[den],CENTER,3);
  myGLCD.update();
  myGLCD.clrScr();
}

void HUM()
{
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(hum/10, 26,12);
  myGLCD.printNumI(hum%10, 41,12);
  myGLCD.drawBitmap(6, 12, bulb, 16, 24);
  myGLCD.drawBitmap(60, 12, perc, 16, 24);
  myGLCD.update();
  myGLCD.clrScr();
 
}

void TEMP()
{
  myGLCD.setFont(BigNumbers);
  myGLCD.printNumI(tem/10, 26,12);
  myGLCD.printNumI(tem%10, 41,12);
  myGLCD.drawBitmap(6, 12, grad, 16, 24);
  myGLCD.drawBitmap(60, 12, gr, 16, 24);
  myGLCD.update();
  myGLCD.clrScr();
}

void newBackLigth(byte newBLnum)
{     // задаём новую подсветку,
  int dif = nowBLnum - newBLnum;
  if (abs(dif) > 25)
  {
    for (; nowBLnum != newBLnum; dif < 0 ? nowBLnum++ : nowBLnum--)
    {
      analogWrite(LEDpin, nowBLnum);
      delay(5);
    }
  }
}

Ардуины пока нет (зжог), код лью прямо в ATMega238 с помощью "eXtreme Burner" через ICSP.

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

Так код под вашу ATMega238 не подходит )))

Xakep.rus
Offline
Зарегистрирован: 25.06.2017

ua6em пишет:

Так код под вашу ATMega238 не подходит )))

ATMega238 => ATMega328 (опечатался)

Как так не подходит?)

Код собираю в Arduino IDE 1.8.3 (плата выбрана: Arduino/Genuino Uno)

Я так уже делал))

b707
Offline
Зарегистрирован: 26.05.2017

Вы программировать вообще не умеете? Посмотрите, как у вас называется массив с именами месяцев и массив с названиями дней недели. А потом сравните со строками 138 и 139. Постарайтесь сами найти ошибку, она элементарна.

Xakep.rus
Offline
Зарегистрирован: 25.06.2017

b707 пишет:

Вы программировать вообще не умеете?

Видимо не умею(

Забрал Ардуину с почты)

const char* mes[] =
{ "December", "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November" }; 
const char* den[] =
{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

  myGLCD.print(dt.month[mes], CENTER,38);
  myGLCD.print(dt.dayOfWeek[den], CENTER,3);
  Serial.print("dt.month   ");
  Serial.println(dt.month);
  Serial.print("dt.dayOfWeek   ");
  Serial.println(dt.dayOfWeek);

Вроде как месяцы обозваны [mes], а дни недели [den]

Дописал вывод в Порт:

dt.month   7
dt.dayOfWeek   7
непойму почему так..
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мда.

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

У мня, видима, самогон лучше, чем у Виталика Дракулы. Я промолчу.

b707
Offline
Зарегистрирован: 26.05.2017

Xakep.rus пишет:

dt.month   7
dt.dayOfWeek   7
непойму почему так..
 

наверно потому что сегодня седьмой день недели и седьмой месяц года? :)

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

Правильный код

const char* mes[] =
{ " ", "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November", "December" }; 
const char* den[] =
{ " ", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

  
  Serial.print("dt.month   ");
  Serial.println(mes[dt.month]);
  Serial.print("dt.dayOfWeek   ");
  Serial.println(den[dt.dayOfWeek]);

UPdate - смените ник, не позорьте хакеров...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

b707 пишет:

UPdate - смените ник, не позорьте хакеров...

он русский хакер - они такие. что не потеряют, то сломают.

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

Клапауций 112 пишет:

b707 пишет:

UPdate - смените ник, не позорьте хакеров...

он русский хакер - они такие. что не потеряют, то сломают.

Я подозревал, что слухи о русских хакерах сильно преувеличены )))
 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707 пишет:

Правильный код

const char* mes[] =
{ " ", "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November", "December" }; 
const char* den[] =
{ " ", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

  
  Serial.print("dt.month   ");
  Serial.println(mes[dt.month]);
  Serial.print("dt.dayOfWeek   ");
  Serial.println(den[dt.dayOfWeek]);

на "чистом" Си это выглядит вот так:

const char* mes[] =
{ "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November", "December" }; 
const char* den[] =
{ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

  
  Serial.print("dt.month   ");
  Serial.println(mes[dt.month-1]);
  Serial.print("dt.day   ");
  Serial.println(den[dt.day-1]);
  Serial.print("dt.dayOfWeek   ");
  Serial.println(den[dt.dayOfWeek]);

:)

 

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

на "чистом" Си это выглядит вот так:

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да, это шедевр конечно

  myGLCD.print(M[mes],CENTER,38);
  myGLCD.print(D[den],CENTER,3);
 
 
b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

да, это шедевр конечно

  myGLCD.print(M[mes],CENTER,38);
  myGLCD.print(D[den],CENTER,3);
 
 

ну, ваши строчки с 9 по 12 не сильно лучше, как мне кажется :)

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну да сморозил, копипаст проклятый !!! 

сорри...

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

b707 пишет:

Правильный код

const char* mes[] =
{ " ", "January", "February", "March", "Aprl", "May", "June", "July", "August", "September", "October", "November", "December" }; 
const char* den[] =
{ " ", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

  
  Serial.print("dt.month   ");
  Serial.println(mes[dt.month]);
  Serial.print("dt.dayOfWeek   ");
  Serial.println(den[dt.dayOfWeek]);

UPdate - смените ник, не позорьте хакеров...

Спасибо, заработало)

Как я понял пустые кавычки вначале массива это для "нуля",

Или можно просто вычитать 1(единицу) -   Serial.println((dt.month-1)[mes]); ?

Только от модуля RTC оно их не получит, а Ардуина считает с нуля...

Вот так заработало без пустых кавычек:

  myGLCD.print((dt.month-1)[mes], CENTER,38);
  myGLCD.print((dt.dayOfWeek-1)[den], CENTER,3);

 

b707
Offline
Зарегистрирован: 26.05.2017

Medvedik пишет:

  myGLCD.print((dt.month-1)[mes], CENTER,38);
  myGLCD.print((dt.dayOfWeek-1)[den], CENTER,3);

Блин! У меня уже цензурных слов нет!

Medvedik, ты что, вообще тупой??? Если тебе уже несколько человек написали mes[dt.month-1], ПОЧЕМУ ТЫ ВСЕ ВРЕМЯ ПИШЕШЬ dt.month-1[mes]????

Ты правда считаешь, что d[x] и x[d] это одно и то же?!

 

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

b707 пишет:

Ты правда считаешь, что d[x] и x[d] это одно и то же?!

...или дуб хреновый...или хрен дубовый... ;-)

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

b707 пишет:

Ты правда считаешь, что d[x] и x[d] это одно и то же?!

Согласен, не одно и то же, но почему и так:

myGLCD.print(mes[M-1], CENTER,38);
myGLCD.print(den[D-1], CENTER,3);

и так:

myGLCD.print((M-1)[mes], CENTER,38);
myGLCD.print((D-1)[den], CENTER,3);

РАБОТАЕТ...?

 
Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Medvedik пишет:

Согласен, не одно и то же, но почему и так:

myGLCD.print(mes[M-1], CENTER,38);
myGLCD.print(den[D-1], CENTER,3);

и так:

myGLCD.print((M-1)[mes], CENTER,38);
myGLCD.print((D-1)[den], CENTER,3);

РАБОТАЕТ...?

А чего ему не работать? Коммутативность сложения уже отменили?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Ты правда считаешь, что d[x] и x[d] это одно и то же?!

Не знаю, как Medvedik, но вот я - таки да, правда так считаю.

Если одно из "а" и "b" указатель, а второе - целое (перечислимое или интегральное), а здесь как раз тот самый случай, то таки да a[b] абсолютно эквивалентно b[a].

А Вы правда считаете по-другому? И в чём же тогда разница по-вашему?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:
Если одно из "а" и "b" указатель, а второе - целое (перечислимое или интегральное), а здесь как раз тот самый случай, то таки да a[b] абсолютно эквивалентно b[a].

a[b],b[a],*(a+b) - одно и тоже.

 

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

a[b],b[a],*(a+b) - одно и тоже.

Да? для меня это новость.

Я (вроде) хорошо понимаю, что есть массив в Си. ... это же элементарно...

a[x] = * (a + x * sizeof(a)),  *(a+x) - то же самое

Но у меня не укладывается в голове, как разложить x[a], если a, к примеру, указатель на тип char.

 

b707
Offline
Зарегистрирован: 26.05.2017

Добавлю.

a[x] - это массив

a - указатель на первый элемент

x - целое, смещение от первого элемента

 

Если подходить с позиций формальной логики... a и x менять местами нельзя -получается ерунда. Это некоммутативный оператор, как например возведение в степень.

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

b707 пишет:

Если подходить с позиций формальной логики... a и x менять местами нельзя -получается ерунда. Это некоммутативный оператор, как например возведение в степень.

Язык программирования - формальный язык и к нему надо подходить не с позиций логики, а с позиций его определения.

Операция a[b] (при условии, что что-то одно из a и b - указатель на что угодно, отличное от void, а второе - величина любого интегрального или перечислимого типа) определена как *(a+b) (ISO IEC 14882 - 2011, п. 5.2.1, стр. 114).  В стандарте 14-го года то же самое, в том же пункте и даже на той же странице.

Вот и всё. Никаких других фокусов и никакой другой логики. Да и, кстати, с логикой всё в порядке, коль скоро операция определена именно через сложение, а сложение, слава Богу, коммутативно.

Это, кстати, если склероз не изменяет, так было ещё со времён чистого, лампового Си.

b707
Offline
Зарегистрирован: 26.05.2017

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

Операция a[b] (при условии, что что-то одно из a и b - указатель на что угодно, отличное от void, а второе - величина любого интегрального или перечислимого типа) определена как *(a+b)

Да, спасибо, уже сам допер. Хотя. честно признаться. за 20 лет программирования на Си не задумывался об этом. Как-то не возникало необходимости путать массив и его индекс.

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

Ну, как, чтобы противника в заблуждение ввести - полезная фича :)