microman
niet storen aub, ben al gestoord genoeg !
Moeilijke titel.. ik weet het !
Maar de echte C++ programmeur weet wel beter
Ik ben nog bezig aan een klok. Met alarm. Maar te kiezen op welke dagen van de week. Lang verhaal kort.
In één byte (alarm1_weekdagen) komen de dagen van de week
bit 7 = maandag
bit 6 = dinsdag
bit 5 = woensdag
etc ...
Maar ik krijg mijn IF functie niet werkende
if (alarm1_weekdagen && 0b10000000 == 1) is dan maandag
if (alarm1_weekdagen && 0b01000000 == 1) is dan dinsdag
Al van alles geprobeerd.. hulp nodig 
void setup_alarm1()
{
display.clearDisplay ();
display.setTextSize(1);
display.setCursor (0,0);
display.println ("Ma Di Wo Do Vr Za Zo");
display.setCursor(2,12); if (alarm1_weekdagen && 0b10000000 == 1) {display.println("^");} else {display.println(" ");} // maandag
display.setCursor(20,12); if (alarm1_weekdagen && 0b01000000 == 1) {display.println("^");} else {display.println(" ");} // dinsdag
display.setCursor(38,12); if (alarm1_weekdagen == 32) {display.println("^");} else {display.println(" ");} // woensdag
display.setCursor(56,12); if (alarm1_weekdagen == 16) {display.println("^");} else {display.println(" ");} // donderdag
display.setCursor(74,12); if (alarm1_weekdagen == 8) {display.println("^");} else {display.println(" ");} // vrijdag
display.setCursor(92,12); if (alarm1_weekdagen == 4) {display.println("^");} else {display.println(" ");} // zaterdag
display.setCursor(110,12); if (alarm1_weekdagen == 2) {display.println("^");} else {display.println(" ");} // zondag (alarm1_weekdagen && 0b10000000 == 1)
Dat moet zijn ((alarm1_weekdagen & 0b10000000) == 1)
Er is een bitwise and: &
en een logische and: &&
microman
niet storen aub, ben al gestoord genoeg !
Hey
Werkt jammer genoeg niet..
Net even Life getest.. nu geeft hij niets weer. In mijn test opstelling zou alleen "dinsdag" een vinkje krijgen
Als ik een "dubbele AND" zet geeft hij beide dagen weer.
display.clearDisplay ();
display.setTextSize(1);
display.setCursor (0,0);
display.println ("Ma Di Wo Do Vr Za Zo");
byte alarm1_weekdagen = 0b01000000 ; // 00000000 == ma di wo do vr za zo 0
display.setCursor(2,12); if ((alarm1_weekdagen & 0b10000000) == 1) {display.println("^");} else {display.println(" ");} // maandag
display.setCursor(20,12); if ((alarm1_weekdagen & 0b01000000) == 1) {display.println("^");} else {display.println(" ");} // dinsdag
display.setCursor(38,12); if (alarm1_weekdagen == 32) {display.println("^");} else {display.println(" ");} // woensdag
display.setCursor(56,12); if (alarm1_weekdagen == 16) {display.println("^");} else {display.println(" ");} // donderdag
display.setCursor(74,12); if (alarm1_weekdagen == 8) {display.println("^");} else {display.println(" ");} // vrijdag
display.setCursor(92,12); if (alarm1_weekdagen == 4) {display.println("^");} else {display.println(" ");} // zaterdag
display.setCursor(110,12); if (alarm1_weekdagen == 2) {display.println("^");} else {display.println(" ");} // zondag
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Jup, je wilt een bitwise AND met je gekozen mask (welke weekdag, de 0b01000000 bijvoorbeeld voor dinsdag). Maar daar komt dan geen 1 uit, maar 0b01000000 (of uiteraard 0b00000000).
Dat kun je rechtstreeks als true (of false) gebruiken, dus de ==1 kan weg.
Alternatief zou je if(alarm1_weekdagen&DINSDAG==DINSDAG) kunnen gebruiken, met #define DINSDAG 0b01000000, maar die hele == weglaten lijkt me duidelijker en minder foutgevoelig.
microman
niet storen aub, ben al gestoord genoeg !
Nu werkt het wel
Bedankt allemaal voor jullie hulp !!
display.clearDisplay ();
display.setTextSize(1);
display.setCursor (0,0);
display.println ("Ma Di Wo Do Vr Za Zo");
byte alarm1_weekdagen = 0b01010100 ; // 00000000 == ma di wo do vr za zo 0
display.setCursor(2,12); if ((alarm1_weekdagen & 0b10000000) == 128 ) {display.println("^");} else {display.println(" ");} // maandag
display.setCursor(20,12); if ((alarm1_weekdagen & 0b01000000) == 64 ) {display.println("^");} else {display.println(" ");} // dinsdag
display.setCursor(38,12); if ((alarm1_weekdagen & 0b00100000) == 32 ) {display.println("^");} else {display.println(" ");} // woensdag
display.setCursor(56,12); if ((alarm1_weekdagen & 0b00010000) == 16 ) {display.println("^");} else {display.println(" ");} // donderdag
display.setCursor(74,12); if ((alarm1_weekdagen & 0b00001000) == 8 ) {display.println("^");} else {display.println(" ");} // vrijdag
display.setCursor(92,12); if ((alarm1_weekdagen & 0b00000100) == 4 ) {display.println("^");} else {display.println(" ");} // zaterdag
display.setCursor(110,12); if ((alarm1_weekdagen & 0b00000010) == 2 ) {display.println("^");} else {display.println(" ");} // zondag
microman
niet storen aub, ben al gestoord genoeg !
Voor de geïnteresseerden.
Het ging over de vink'jes ^^ onder de Ma Di Wo...
Alle vink'jes beheerd in 1 byte.
Groet Microman
dat vergelijken met 128, 64,32 etc is onnodig. je AND maar met 1 bit dus elk resultaat ongelijk aan nul is goed.
Het is dus veel makkelijker om gewoon != 0 te doen in je check.
Daarmee komen we tot een verband tussen dag van de week op een manier dat het de x positie van je lcd bevat (blijkbaar 18 pixels per dag) en de bitpositie in je alarm1_weekdagen variabele.
Je kan het dus ook met een loopje zoals dit doen:
for (uint8_t i = 0; i < 7; i++) {
display.setCursor(2+ (i * 18),12);
if ((alarm1_weekdagen & (1 << (7 - i))) != 0) {
display.println("^");
} else {
display.println(" ");
}
}
wellicht minder leesbaar, maar wel makkelijker als je je character of je x positie aan wilt passen. Als je het nog netjes DEFINED hoe je het maar 1x aan te passen
[Bericht gewijzigd door Stijnos op (11%)]
Netjes!
En als je toch telkens de cursor op zijn plek zet hoef je ook geen "else print spatie" te doen, je begint al met een clearDisplay.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
En als je de manier waarop de bitjes in je byte zitten omdraait dan wordt de "(7-i)" gewoon "i". Dat maakt dit stukje code een stuk leesbaarder.
Nog even een algemene tip:
if (alarm1_weekdagen && 0b10000000 == 1)
is m.i. zowiezo "fout".
De prioriteit tussen && en == is tegenwoordig goed gedefinieerd, maar vroeger was dat niet zo. Dan waren er compilers die het van links naar rechts deden (gaat hier goec) of andersom. Maar worst case denkt de compiler dus:
if (alarm1_weekdagen && (0b10000000 == 1))
Dus mijn advies is: Als er &, |, && of || en een == in 1 expressie staan, dan ALTIJD extra haakjes toevoegen.
Bovenstaand voorbeeld stukje code was zowiezo fout. Maar als je die corrigeert naar
if (alarm1_weekdagen & 0b10000000 == 128)
, dan zie je dat het fout gaat als de compiler het anders doet dan bedoeld:
(alarm1_weekdagen && (0b10000000 == 128))Nou 0b1000000 == 128, dus "true" "1".
En 1 & alarm1_weekdagen is "true" (niet gelijk aan nul) als bit0 hoog is. Nou dat is in jou code dus waarschijnlijk "nooit".
... edit K7jz kwam er tussendoor. Zijn tip had ik zelf nog niet gespot. (nog voor koffietijd hier in D).
In dit soort stukjes code wil je regelmatig een print-at doen. Het loont de moeite om daar een functietje voor te maken:
void printat (int x, int y, char *str)
{
display.setCursor(x,y);
display.println(str);
}Dan wordt het dus:
for (int i = 0; i < 7; i++) {
if (alarm1_weekdagen & (1 << i))
printat(2+ (i * 18), 12, "^");
}En DAN vind ik ineens "wellicht minder leesbaar" niet meer van toepassing.
[Bericht gewijzigd door rew op (21%)]
microman
niet storen aub, ben al gestoord genoeg !
Hey
Ben hier nog eens..
Ik zie dat ik hier met specialisten te maken heb.
Uiteindelijk wil ik met een button DOWN UP ENTER een instelbaar alarm maken.
De dagen van de week met de vinkjes werken.
De byte "alarm1_weekdagen" wil ik ook kunnen instellen.
Ik laat "maandag" knipperen en met ENTER wil ik Yes of No zetten.
Met UP ga ik naar "dinsdag" , knippert , ENTER voor Yes of No
Enzovoort.. vervolgens in het midden het klokje , UP en DOWN , vervolgens bevestigen met ENTER.
Uiteindelijk heb ik een byte voor weekdagen, een byte voor uren, een byte voor minuten als output.
Ik ben het aant uitvogelen, maar wat hulp mag altijd natuurlijk.
Thx Microman
void setup_alarm1() {
for (int timer=0; timer <100; timer++) { // tijd dat de instelling actief blijft +-10 seconden
display.clearDisplay ();
display.setTextSize (1);
display.setCursor (15,50); display.println ("ALARM 1 INSTELLEN");
display.setCursor (0,0); display.println ("Ma Di Wo Do Vr Za Zo");
for (uint8_t i = 0; i < 7; i++) {display.setCursor(2+ (i * 18),12); if ((alarm1_weekdagen & (1 << (7 - i))) != 0)
{display.println("^");} else {display.println(" "); } } // vinkjes weekdagen weergeven
boolean L_state_enter = C_state_enter ;
C_state_enter = digitalRead(BUTTON_ENTER);
if (L_state_enter == 1 && C_state_enter == 0) { on_off =! on_off ; timer =0; } // button enter
boolean L_state_up = C_state_up ;
C_state_up = digitalRead(BUTTON_UP);
if (L_state_up == 1 && C_state_up == 0) { on_off =! on_off ; timer =0; } // button up
boolean L_state_down = C_state_down ;
C_state_down = digitalRead(BUTTON_DOWN);
if (L_state_down == 1 && C_state_down == 0) { } // button down
display.setTextSize(2); display.setCursor (30,25);
display.println("ON");
on_off =! on_off ; if (on_off == 1) {alarm1_weekdagen = 0b11111100;} else {alarm1_weekdagen = 0b10111100;} // test knipperen van vinkje
digitalWrite(LED_ENTER,on_off); // knipperen LED
display.display();
delay (100); // 100ms x 100 = 10seconden
} }
uh ja, ik kan niet heel veel kaas van je code maken.
Ik zou je functie in ieder geval opsplitsen in 2 states.
Je hebt een menu toestand waar je met up en down door de dagen fietst.
In die toestand brengt enter je naar een 2e toestand waar je met up en down tussen yes en no wisselt. Een enter daar past je alambits aan indien yes en anders niet. na beide ga je terug naar toestand 1.
kleine best practice tip.
Als je een boolean var hebt, noem hem dan zo zodat je al lezende zie wat true en false betekend.
dus een variabele "on_off" zegt niemand of true nu On of Off is.
Noem hem dan bevoorbeeld "ledOn"
het betreft hier iets om enkel te togglen. noem het dan gewoon "toggle" ofzo.
werkt die button afhandeling nu naar wens? Zo ja prima, anders zou ik er nog even goed naar kijken
Eerst maar eens de haakjes op de goede plaats zetten, Zo is het niet te lezen:
void setup_alarm1()
{
// tijd dat de instelling actief blijft +-10 seconden
for (int timer=0; timer <100; timer++)
{
display.clearDisplay ();
display.setTextSize (1);
display.setCursor (15,50); display.println ("ALARM 1 INSTELLEN");
display.setCursor (0,0); display.println ("Ma Di Wo Do Vr Za Zo");
// vinkjes weekdagen weergeven
for (uint8_t i = 0; i < 7; i++)
{ display.setCursor(2+ (i * 18),12);
if ((alarm1_weekdagen & (1 << (7 - i))) != 0)
{ display.println("^");
}
else
{ display.println(" ");
}
}
// button enter
boolean L_state_enter = C_state_enter ;
C_state_enter = digitalRead(BUTTON_ENTER);
if (L_state_enter == 1 && C_state_enter == 0)
{ on_off =! on_off ;
timer =0;
}
// button up
boolean L_state_up = C_state_up ;
C_state_up = digitalRead(BUTTON_UP);
if (L_state_up == 1 && C_state_up == 0)
{ on_off =! on_off ;
timer =0;
}
// button down
boolean L_state_down = C_state_down ;
C_state_down = digitalRead(BUTTON_DOWN);
if (L_state_down == 1 && C_state_down == 0)
{
}
display.setTextSize(2); display.setCursor (30,25);
display.println("ON");
on_off =! on_off ;
if (on_off == 1)
{ alarm1_weekdagen = 0b11111100;
}
else
{ alarm1_weekdagen = 0b10111100;
} // test knipperen van vinkje
digitalWrite(LED_ENTER,on_off); // knipperen LED
display.display();
delay (100); // 100ms x 100 = 10seconden
}
}
microman
niet storen aub, ben al gestoord genoeg !
hey
ik heb het display al voor een groot deel werkende.
Ik heb nu een byte 0b01000000 (shift_lr) en het 1'tje verschuif ik van links naar rechts met mijn buttons.
Ik XOR alarm1_weekdagen met shift_lr en schakel zo gekozen bitje (dus dag van de week) in of uit.
Enigste waar ik nog niet uit ben is dat mijn shift_lr bitje niet lager dan <0 en niet hoger dan >128 mag kunnen.
Want dan loopt het mis.
Sorry van de haakjes Kees. Ieder zijn eigen manier zeker ?? 
void setup_alarm1() {
for (int timer=0; timer <150; timer++) { // tijd dat de instelling actief blijft +-10 seconden
display.clearDisplay ();
display.setTextSize (1);
display.setCursor (15,50); display.println ("ALARM 1 INSTELLEN");
display.setCursor (0,0); display.println ("Ma Di Wo Do Vr Za Zo");
for (uint8_t i = 0; i < 7; i++) {display.setCursor(2+ (i * 18),12); if ((alarm1_week_show & (1 << (7 - i))) != 0)
{display.println("^");} else {display.println(" "); } } // vinkjes weekdagen weergeven
boolean L_state_enter = C_state_enter ;
C_state_enter = digitalRead(BUTTON_ENTER);
if (L_state_enter == 1 && C_state_enter == 0) { yes_no =! yes_no; alarm1_weekdagen = (alarm1_weekdagen ^ shift_lr); } // button enter
boolean L_state_up = C_state_up ;
C_state_up = digitalRead(BUTTON_UP); (led_up_aan =! C_state_up);
if (L_state_up == 1 && C_state_up == 0) {shift_lr = shift_lr >> 1 ;timer =0; } // button up // shift_lr rechts
boolean L_state_down = C_state_down ;
C_state_down = digitalRead(BUTTON_DOWN); (led_down_aan =! C_state_down);
if (L_state_down == 1 && C_state_down == 0) {shift_lr = shift_lr << 1 ;timer =0; } // button down // shift_lr Links
// ----------------------------------------------
if (toggle == 1) {alarm1_week_show = (alarm1_weekdagen ^ shift_lr) ;} // XOR van alarm1_weegdagen met shift_lr
else // XOR toggelt het geselecteerde bitje 0 <> 1
{alarm1_week_show = alarm1_weekdagen ;} // knipperen vinkje
display.setTextSize(2); display.setCursor (45,25);
if (alarm1_weekdagen & shift_lr) {display.println("yes");} else {display.println(" no");} // laat zien of gekozen weekdag yes of no is
if (alarm1_weekdagen & shift_lr) {yes_no = 1 ;} else {yes_no = 0 ;} // LED_ENTER doet hetzelfde
//display.setTextSize(2); display.setCursor (45,25);
//if (shift_lr == 0) {display.println("8:26"); }
digitalWrite(LED_DOWN ,led_down_aan ); // status van de 3 LED's
digitalWrite(LED_UP ,led_up_aan);
digitalWrite(LED_ENTER, yes_no);
display.display();
toggle =! toggle ;
delay (80); // 80ms x 150 = 10seconden
} }
if (L_state_up == 1 && C_state_up == 0 && shift_lr > 0 ) {
shift_lr = shift_lr >> 1 ;
timer =0;
}
of shift_lr < 128, ben links en rechts nu even kwijt.
Het is best schattig om bitjes te gebruiken maar een map of paar arrays had natuurlijk ook prima gegaan.
string days[7] = {"Ma","Di"... };
bool alarmdays[7] = {0,0,....};
alarmdays[3]=1; // "Wo" aan,
for (uint8_t i = 0; i < 7; i++) {
display.setCursor(2+ (i * 18),0);
display.println(days[i]);
display.setCursor(2+ (i * 18),12);
if (alarmdays[i])
{display.println("^");} else {display.println(" "); } } Je kan dan met aan/uitzetten ook gewoon zeggen "Alarm op Wo : Aan" en na enter op "uit".
Verder ben ik een groot fan van puur engels in code. (Gebruikersteksten mogen prima in NL natuurlijk).
Led_up/down_aan is een mix van twee talen, terwijl het prima met alleen "led_up" en "led_down" had gekund