Неверно отображается день недели.
- Войдите на сайт для отправки комментариев
Вс, 09/07/2017 - 13:20
Доброго времени суток)
Столкнулся с проблемой отображения дня недели словом, вместо него отображается месяц..
если поменять местами 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.

Так код под вашу ATMega238 не подходит )))
Так код под вашу ATMega238 не подходит )))
ATMega238 => ATMega328 (опечатался)
Как так не подходит?)
Код собираю в Arduino IDE 1.8.3 (плата выбрана: Arduino/Genuino Uno)
Я так уже делал))
Вы программировать вообще не умеете? Посмотрите, как у вас называется массив с именами месяцев и массив с названиями дней недели. А потом сравните со строками 138 и 139. Постарайтесь сами найти ошибку, она элементарна.
Вы программировать вообще не умеете?
Видимо не умею(
Забрал Ардуину с почты)
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]
Дописал вывод в Порт:
Мда.
У мня, видима, самогон лучше, чем у Виталика Дракулы. Я промолчу.
наверно потому что сегодня седьмой день недели и седьмой месяц года? :)
К Вашему коду у меня есть некоторые вопросы... то что неделя у вас начинается с воскресенья - это можно обьяснить, во многих западных странах. Но вот то что год начинается с декабря - это удивительно.
Правильный код
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 - смените ник, не позорьте хакеров...
UPdate - смените ник, не позорьте хакеров...
он русский хакер - они такие. что не потеряют, то сломают.
UPdate - смените ник, не позорьте хакеров...
он русский хакер - они такие. что не потеряют, то сломают.
Я подозревал, что слухи о русских хакерах сильно преувеличены )))
Правильный код
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]);:)
на "чистом" Си это выглядит вот так:
программирование тем и хорошо, что обычно правильных ответов больше одного :) Ваш метод тоже верный... если поправить кучу опечаток в коде :)
да, это шедевр конечно
да, это шедевр конечно
ну, ваши строчки с 9 по 12 не сильно лучше, как мне кажется :)
ну да сморозил, копипаст проклятый !!!
сорри...
Правильный код
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 оно их не получит, а Ардуина считает с нуля...
Вот так заработало без пустых кавычек:
Блин! У меня уже цензурных слов нет!
Medvedik, ты что, вообще тупой??? Если тебе уже несколько человек написали mes[dt.month-1], ПОЧЕМУ ТЫ ВСЕ ВРЕМЯ ПИШЕШЬ dt.month-1[mes]????
Ты правда считаешь, что d[x] и x[d] это одно и то же?!
Ты правда считаешь, что d[x] и x[d] это одно и то же?!
...или дуб хреновый...или хрен дубовый... ;-)
Ты правда считаешь, что d[x] и x[d] это одно и то же?!
Согласен, не одно и то же, но почему и так:
и так:
РАБОТАЕТ...?
Согласен, не одно и то же, но почему и так:
и так:
РАБОТАЕТ...?
Ты правда считаешь, что d[x] и x[d] это одно и то же?!
Не знаю, как Medvedik, но вот я - таки да, правда так считаю.
Если одно из "а" и "b" указатель, а второе - целое (перечислимое или интегральное), а здесь как раз тот самый случай, то таки да a[b] абсолютно эквивалентно b[a].
А Вы правда считаете по-другому? И в чём же тогда разница по-вашему?
a[b],b[a],*(a+b) - одно и тоже.
a[b],b[a],*(a+b) - одно и тоже.
Да? для меня это новость.
Я (вроде) хорошо понимаю, что есть массив в Си. ... это же элементарно...
a[x] = * (a + x * sizeof(a)), *(a+x) - то же самое
Но у меня не укладывается в голове, как разложить x[a], если a, к примеру, указатель на тип char.
Добавлю.
a[x] - это массив
a - указатель на первый элемент
x - целое, смещение от первого элемента
Если подходить с позиций формальной логики... a и x менять местами нельзя -получается ерунда. Это некоммутативный оператор, как например возведение в степень.
Если подходить с позиций формальной логики... a и x менять местами нельзя -получается ерунда. Это некоммутативный оператор, как например возведение в степень.
Язык программирования - формальный язык и к нему надо подходить не с позиций логики, а с позиций его определения.
Операция a[b] (при условии, что что-то одно из a и b - указатель на что угодно, отличное от void, а второе - величина любого интегрального или перечислимого типа) определена как *(a+b) (ISO IEC 14882 - 2011, п. 5.2.1, стр. 114). В стандарте 14-го года то же самое, в том же пункте и даже на той же странице.
Вот и всё. Никаких других фокусов и никакой другой логики. Да и, кстати, с логикой всё в порядке, коль скоро операция определена именно через сложение, а сложение, слава Богу, коммутативно.
Это, кстати, если склероз не изменяет, так было ещё со времён чистого, лампового Си.
Операция a[b] (при условии, что что-то одно из a и b - указатель на что угодно, отличное от void, а второе - величина любого интегрального или перечислимого типа) определена как *(a+b)
Да, спасибо, уже сам допер. Хотя. честно признаться. за 20 лет программирования на Си не задумывался об этом. Как-то не возникало необходимости путать массив и его индекс.
Ну, как, чтобы противника в заблуждение ввести - полезная фича :)