Неверно отображается день недели.
- Войдите на сайт для отправки комментариев
Вс, 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. Постарайтесь сами найти ошибку, она элементарна.
Вы программировать вообще не умеете?
Видимо не умею(
Забрал Ардуину с почты)
Вроде как месяцы обозваны [mes], а дни недели [den]
Дописал вывод в Порт:
Мда.
У мня, видима, самогон лучше, чем у Виталика Дракулы. Я промолчу.
наверно потому что сегодня седьмой день недели и седьмой месяц года? :)
К Вашему коду у меня есть некоторые вопросы... то что неделя у вас начинается с воскресенья - это можно обьяснить, во многих западных странах. Но вот то что год начинается с декабря - это удивительно.
Правильный код
UPdate - смените ник, не позорьте хакеров...
UPdate - смените ник, не позорьте хакеров...
он русский хакер - они такие. что не потеряют, то сломают.
UPdate - смените ник, не позорьте хакеров...
он русский хакер - они такие. что не потеряют, то сломают.
Я подозревал, что слухи о русских хакерах сильно преувеличены )))
Правильный код
на "чистом" Си это выглядит вот так:
:)
на "чистом" Си это выглядит вот так:
программирование тем и хорошо, что обычно правильных ответов больше одного :) Ваш метод тоже верный... если поправить кучу опечаток в коде :)
да, это шедевр конечно
да, это шедевр конечно
ну, ваши строчки с 9 по 12 не сильно лучше, как мне кажется :)
ну да сморозил, копипаст проклятый !!!
сорри...
Правильный код
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 лет программирования на Си не задумывался об этом. Как-то не возникало необходимости путать массив и его индекс.
Ну, как, чтобы противника в заблуждение ввести - полезная фича :)