přetečení int v C arduino
Petr Zapadlo
zapik na email.cz
Pátek Červenec 18 10:10:15 CEST 2014
Zdravím,
je to jednorázové udělátko - časovač na dýmovnici na tábor. Použito
arduino a LCD shield. V určenou dobu (8:08:08) to má odpálit dýmovnici.
Nachystat to pujdu večer před akcí, proto nepotřebuju nějaké ošetření
všech možných stavů, prostě jen funkčnost na tu jednu příležitost.
Celý kod je zde:
/ include the library code:
#include <LiquidCrystal.h>
int sensorPin = A0;
int sensorValue = 0;
unsigned long fr = 0;
unsigned long cas=0;
unsigned long alarm=115688;
int rychlost=991;
int outpin = 2;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
pinMode(outpin, OUTPUT);
digitalWrite(outpin, LOW);
}
void loop() {
//hodiny
lcd.setCursor(0, 0);
zobraz(cas);
//zrychleni chodu pro nastaveni casu
if ( (analogRead(sensorPin) > 120) && (analogRead(sensorPin) < 140) ) {
rychlost= 10;
}
if ( (analogRead(sensorPin) > 300) && (analogRead(sensorPin) < 320) ) {
rychlost= 100;
}
if ( (analogRead(sensorPin) > 460) && (analogRead(sensorPin) < 500) ) {
cas=cas+60;
}
if ( (analogRead(sensorPin) > 1020)) { rychlost= 991;}
if ((millis()-fr) >= rychlost) {
fr = millis();
cas++;
}
lcd.setCursor(12,0);
lcd.print(analogRead(sensorPin));
lcd.print(" ");
lcd.setCursor(0,1);
zobraz(alarm);
lcd.setCursor(7,1);
if (alarm >= cas) {
zobraz(alarm-cas);
}
else {
lcd.print ("----------");
digitalWrite(outpin, HIGH);
}
}
void zobraz(unsigned long cas1) {
long den,hodina,minuta,vterina;
den=long(cas1/86400);
cas1=cas1-den*86400;
hodina=long(cas1/3600);
cas1=cas1-hodina*3600;
minuta=long(cas1/60);
cas1=cas1-minuta*60;
vterina=int(cas1);
lcd.print ( den);
lcd.print (" ");
lcd.print (hodina);
lcd.print (":");
lcd.print (minuta);
lcd.print (":");
lcd.print (vterina);
lcd.print (" ");
}
Dne 18.7.2014 09:53, Jaroslav Lukesh napsal(a):
> Arduino se neprogramuje v Céčku, ale v uměleckém jazyku Wire, který je
> zjednodušeným céčkem.
>
> http://arduino.cc/en/Reference/HomePage
>
> viz odstavec Data Types, mrkněte taky na typ byte
>
> Zajímalo by mně, jak je máte udělané celé, hoďte to sem celé, za
> odměnu sem hodím svého knightridera.
>
> A až se budete někdy příště divit proč třeba mikrosekundy občas
> neposlouchají, tak si přečtětě, jaký je jejich reliable rozsah.
>
> A zkuste si do něj přidat doplněk ArduBlock, co tomu řeknou děti.
>
>
>
> ----- Původní zpráva ----- Od: "Petr Zapadlo" <zapik na email.cz>
>
> nejsem úplně zběhlý v Céčku, tak mě občas něco překvapí.
> Mám následující funkci:
>
> void zobraz(unsigned long cas1) {
> int den,hodina,minuta,vterina;
>
>
> den=int(cas1/86400); //den=0, cas1=36000
> cas1=cas1-den*86400; //den=0, cas1=36000
> hodina=int(cas1/3600); //hodina=10, cas1=65535
> cas1=cas1-hodina*3600; //hodina=10, cas1=65535
> minuta=int(cas1/60); //minuta=1092,
> cas1=cas1-minuta*60;
> vterina=int(cas1);
>
>
>
> }
>
> A když proměnná cas1 má hodnotu přes 36000, tak dojde někde přetečení a
> v minutách se objeví hodnota přes 1092. Do komentářů jsem připsal
> hodnoty.
> Při změně proměných na long se to začalo chovat korektně.
> V čem je problém, co jsem nepochopil?
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list