|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Szia!
Szerintem megoldható, azonban jó lenne tudni, hogy maximum mennyi embert kell memóriában tartani, de szerintem ez nem lesz gond. A pontos(abb) időméréshez, RTC kell, ezen kívül kellene szerintem egy SD kártyaolvasó, illetve az RFID olvasó és egy I2C illesztő+LCD kijelző, később lehet még kelleni fog egy keypad. Attól függ milyen az arduino, lehet kell még a keypad-hoz i2C illesztő, de csak akkor, ha nincs elég digitális láb van a kiválasztott arduino-n.
Ellenállások, Led esetleg, stb.
Szerintem elsőnek ennyi.
LCD mehet I2C illesztő nélkül is, felesleges túlbonyolítani. SD kártya sem lényeg, van bőven eeprom, abban el lehet férni szerintem.
Szia!
Alapvetően egy, max. 2 személy rögzítésére gondoltam. RTC rendben, csak mondjuk az RFID még ismeretlen a számomra. Data logger kapcsolásokat már elkezdtem tanulmányozni. Amin még agyalok, hogy gombnyomásra, vagy RFID kártyára éledjen, ha egyáltalán lehet az Arduinot stand-by üzemmódba rakni (akkus táplálás). A tárolt info: dátum, kezdő időpont, záró időpont. (Esetleg még az eltelt idő)
Az igazság az, hogy édesanyámnál a gondozónő jelenlétét szeretném ellenőrizni, mivel erős a gyanúm, hogy vastagon fog a ceruzájuk A hozzászólás módosítva: Márc 4, 2017
Ne legyen akku üzemmód. Egy 1$-os telefontöltővel megtáplálva nem lesz gondod vele. Akksival tovább fog bonyolódni a hardver.
Sziasztok!
Van egy kis WiFi gondom. Vettem egy Arduino Uno WiFi boardot. Az egyértelműség kedvéért: nem egy Uno és WiFi shieldet, hanem Uno-ra integrált WiFi.
//#include <WiFi.h>
//#include <WiFiUdp.h>
#include <SPI.h>
#include <WiFi101.h>
IPAddress ip(192,168,100,109);
char ssid[] = "SunLion";
char key[] = "k4v3c1g1";
int status = WL_IDLE_STATUS;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while (true);
}
WiFi.config(ip);
while(status != WL_CONNECTED) {
Serial.print("várakozás: ");
Serial.println(ssid);
status = WiFi.begin(ssid, key);
delay(10000);
}
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// put your main code here, to run repeatedly:
}
Ez a kódom. A WiFi.status-nál akad el. WiFi shield not present
Ezen a linken találtam beállítást: http://www.arduino.org/learning/getting-started/getting-started-wit...o-wifi
Ezt végig csináltam. Mobiltelefon, számítógép, tablet látja az eszközt WiFi-n. Épp csak programozni nem tudom.
Ötlet?
Most fáradt vagyok, de írtad:
" vagy RFID kártyára éledjen, ha egyáltalán lehet az Arduinot stand-by üzemmódba rakni (akkus táplálás)."
RFID felélesztheti. De fix tápláláskor nem is kell. Az EEPROM is ok, de azt kiolvasni? Arduino kivesz, pc összeköt sketch feltölt ami kiolvas, majd a régi vissza? Ok, megoldható ez nélkül is, de akkor a kódot kell felkészíteni rá.
Akkor inkább mindkettő! Redundánsan meglenne minden adat! SD kártya csak azért, hogy a pc-ben fel tudd könnyem dolgozni az adatokat havonta.
Okulásképp! Én vagyok a hülye!
Ha egyszer nincs WiFi shield, persze, hogy nem találja.
A működő program
/*
File: WebServer.ino
This example creates a simple web server on your Arduino Uno WiFi. It serves a
simple web page which shows values of the analog pins, and refreshes every 20 seconds.
Please type on your browser http://<IP>/arduino/webserver/ or http://<hostname>.local/arduino/webserver/
Note: works only with Arduino Uno WiFi Developer Edition.
http://www.arduino.org/learning/tutorials/boards-tutorials/webserver
*/
#include <Wire.h>
#include <UnoWiFiDevEd.h>
#include "cactus_io_BME280_I2C.h"
void setup() {
Serial.begin(9600);
Wifi.begin();
Wifi.println("Web Server is up");
bme.begin();
bme.setTempCal(-1);
}
void loop() {
while(Wifi.available()){
process(Wifi);
}
delay(50);
}
void process(WifiData client) {
// read the command
String command = client.readStringUntil('/');
if (command == "webserver") {
WebServer(client);
}
}
void WebServer(WifiData client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 20"); // refresh the page automatically every sec
client.println();
client.println("<html>");
client.println("<head> <title>UNO WIFI Example</title> </head>");
client.print("<body>");
// for(int analogChannel = 0; analogChannel < 4; analogChannel++) {
// int sensorReading = analogRead(analogChannel);
bme.readSensor();
client.print("Pressure: ");
client.print(bme.getPressure_MB());
client.print("mb<br>");
client.print("Humidity: ");
client.print(bme.getHumidity());
client.print("%<br>");
client.print("Temperature: ");
client.print(bme.getTemperature_C());
client.print("C<br>");
client.print("</body>");
client.println("</html>");
client.print(DELIMITER); // very important to end the communication !!!
}
Helló mindenkinek.
Lenne egy elég hülye problémám...
Van egy Megám és nyíván meghalt a 20-21-es lába, amit I2C kommunikációra használtam.
Valahogy lehetne másik portot használni ugyan erre a célra??
A hibát több mint valószínű az okozhatta, hogy nem csináltam rendes panelt csak úgy hipp-hopp összedobáltam hozzá a dolgokat, és ha majd működik akkor lehet szépíteni a dolgokat.
SZia, szoftveres I2C-t használj, ott átirányíthatod a kommunikációt, "bármelyik" más lábra.
Erre már én is gondoltam csak nem találtam rá leírást vagy valami példát. Az is megfordult a fejemben hogy a Mega pin...Arduino.h-ban átírom a lábak funkcióját, de ez a szoftveres dolog kényelmesebb lenne, mivel már megvan írva egy prog amit nem szeretnék nagyon változtatni.
Kaphatnék valami konkrétabb iránymutatást erre a szoftveres I2C -re?
Üdv
Például, én meg ezt találtam: Bővebben: Link, Portot is meg kell adni, és azon belül nem a lábszámot, hanem a bitjét. Aztán gépészkedni kell vele rendesen, de kitanulod a működését.
Sziasztok,
Teljesen kezdő vagyok ebben az arduinos témában.
A kérdésem hogy hogyan tudnám megoldani hogy etherneten keresztűl reléket tudjak kapcsolni? A probléma hogy kevés a memoria a weblap miatt esetlegesen nem lehet hogy egy sd kártyára a weblap kódját feltöltöm és azt jelenlítse meg ?
de ha valakinek van forrása hogy Uno R3-al és ethernetshieldel lanon keresztül tudjak 8 relét kapcsolni az is jó
Sziasztok!
Lenne egy kisebb problémám egy DS3231 RTC modullal. Egy Arduino pro minit átállítottam 1MHz-re és azzal olvastatom róla az időt, mindkettő egy CR2032-es elemről megy. Az Arduino egy 4+6 ledes bináris óra számlapját vezérli, a kapott infók alapján. A gond az lenne, hogy amikor elindul az Arduino, beáll az idő 6:01-re és onnan lépked. Mindegy hogy meddig jut el, minden indulásnál beáll a 6:01, pedig van elem az RTC-ben. Mit szúrtam el?
#include "Wire.h"
//#include <avr/power.h>
#define DS3231_I2C_ADDRESS 0x68
int buttonpin = 2;
int buttonstate = 0;
int h1 = 12;
int h2 = 11;
int h4 = 10;
int h8 = 9;
int m1 = 8;
int m2 = 7;
int m4 = 6;
int m8 = 5;
int m16 = 4;
int m32 = 3;
int hourcheckbit = 0;
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
void setup()
{
Wire.begin();
//Serial.begin(9600);
pinMode(h1, OUTPUT);
pinMode(h2, OUTPUT);
pinMode(h4, OUTPUT);
pinMode(h8, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(m4, OUTPUT);
pinMode(m8, OUTPUT);
pinMode(m16, OUTPUT);
pinMode(m32, OUTPUT);
pinMode(buttonpin, INPUT_PULLUP);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
ADCSRA = ADCSRA & B01111111;
ACSR = B10000000;
DIDR0 = DIDR0 | B00111111;
//CLKPR = 0;
//CLKPR = (1<<CLKPCE);
//CLKPR = _BV(CLKPS1) | _BV(CLKPS0);
}
void readDS3231time(byte *second,
byte *minute,
byte *hour)
{
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0);
Wire.endTransmission();
Wire. requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
}
void displayTime()
{
byte second, minute, hour;
if (hourcheckbit > 0) {
hour = hour + 12;
hourcheckbit = 0;
}
buttonstate = digitalRead(buttonpin);
if (buttonstate == LOW) {
minute++;
if (minute == 60) {
minute = 0;
hour++;
}
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour));
Wire.endTransmission();
}
readDS3231time(&second, &minute, &hour);
if (hour > 11) {
hour = hour - 12;
hourcheckbit++;
}
digitalWrite(h1, LOW);
digitalWrite(h2, LOW);
digitalWrite(h4, LOW);
digitalWrite(h8, LOW);
digitalWrite(m1, LOW);
digitalWrite(m2, LOW);
digitalWrite(m4, LOW);
digitalWrite(m8, LOW);
digitalWrite(m16, LOW);
digitalWrite(m32, LOW);
if (hour == 1) {
digitalWrite(h1, HIGH);
}
if (hour == 2) {
digitalWrite(h2, HIGH);
}
if (hour == 3) {
digitalWrite(h1, HIGH);
digitalWrite(h2, HIGH);
}
if (hour == 4) {
digitalWrite(h4, HIGH);
}
if (hour == 5) {
digitalWrite(h1, HIGH);
digitalWrite(h4, HIGH);
}
if (hour == 6) {
digitalWrite(h2, HIGH);
digitalWrite(h4, HIGH);
}
if (hour == 7) {
digitalWrite(h1, HIGH);
digitalWrite(h2, HIGH);
digitalWrite(h4, HIGH);
}
if (hour == 8) {
digitalWrite(h8, HIGH);
}
if (hour == 9) {
digitalWrite(h1, HIGH);
digitalWrite(h8, HIGH);
}
if (hour == 10) {
digitalWrite(h2, HIGH);
digitalWrite(h8, HIGH);
}
if (hour == 11) {
digitalWrite(h1, HIGH);
digitalWrite(h2, HIGH);
digitalWrite(h8, HIGH);
}
if (minute == 1) {
digitalWrite(m1, HIGH);
}
if (minute == 2) {
digitalWrite(m2, HIGH);
}
if (minute == 3) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
}
if (minute == 4) {
digitalWrite(m4, HIGH);
}
if (minute == 5) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
}
if (minute == 6) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
}
if (minute == 7) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
}
if (minute == 8) {
digitalWrite(m8, HIGH);
}
if (minute == 9) {
digitalWrite(m1, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 10) {
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 11) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 12) {
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 13) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 14) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 15) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
}
if (minute == 16) {
digitalWrite(m16, HIGH);
}
if (minute == 17) {
digitalWrite(m1, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 18) {
digitalWrite(m2, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 19) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 20) {
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 21) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 22) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 23) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 24) {
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 25) {
digitalWrite(m1, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 26) {
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 27) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 28) {
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 29) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 30) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 31) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
}
if (minute == 32) {
digitalWrite(m32, HIGH);
}
if (minute == 33) {
digitalWrite(m1, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 34) {
digitalWrite(m2, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 35) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 36) {
digitalWrite(m4, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 37) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 38) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 39) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 40) {
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 41) {
digitalWrite(m1, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 42) {
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 43) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 44) {
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 45) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 46) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 47) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 48) {
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 49) {
digitalWrite(m1, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 50) {
digitalWrite(m2, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 51) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 52) {
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 53) {
digitalWrite(m1, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 54) {
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 55) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m4, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 56) {
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 57) {
digitalWrite(m1, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 58) {
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
if (minute == 59) {
digitalWrite(m1, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m8, HIGH);
digitalWrite(m16, HIGH);
digitalWrite(m32, HIGH);
}
/*
byte second, minute, hour;
readDS3231time(&second, &minute, &hour);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(":");
if (minute<10)
{
Serial.print("0");
}
Serial.print(minute, DEC);
Serial.print(":");
if (second<10)
{
Serial.print("0");
}
Serial.print(second, DEC);
*/
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
Illetve ha valaki nagyon ráérne bogarászni ezt a spagetti kódot... hogy tudnám csökkenteni a méretét? Mert látszik, hogy a nagyrésze ismétlődő kód, de nem jövök rá hogy ez hogy lehetne kisebb. Ez így 6024 byte és nagyon jó lenne 4096 alá vinni, amennyire csak lehet. Eredetileg PWM vezérlésű volt, de az +400 byte, szóval kivettem. Köszi előre is, már annak is aki végigolvassa!
---UPDATE---
Annyit még hozzátennék, hogy előtte az RTC-t egy másik arduinoval programoztam, de 5:39-re. Mondjuk benne volt az elem egy ideig, lehet elment 6:01-ig. A hozzászólás módosítva: Márc 7, 2017
Vessetek a mókusok elé, de én nem tennék arduinora webservert. És ahogy hallottam ethernet chip-ből is van ami instabil tud lenni.
Én pi zero+homeassistant irányt tervezek ilyen relé (és sokminden más) kapcsolgatós témában.
Ha jól látom, a DisplayTime függvényben feltétel nélkül felülírod az RTC-ben az időt:
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour));
Wire.endTransmission();
Ezt valamilyen feltételhez kellene kötni!
Nem, az időt akkor írom, ha a 2-es láb feszültségértéke alacsony:
buttonstate = digitalRead(buttonpin);
if (buttonstate == LOW) {
minute++;
if (minute == 60) {
minute = 0;
hour++;
}
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour));
Wire.endTransmission();
}
Mi a baj a webszerver és Aurduino párossal?
Nézőpont kérdése.
Szerintem az arduino (pontosabban az atmega 368) egy nagyon jó _mikrokontroller_, de ez nem jelenti azt hogy webserver feladatra jó lenne.
Ugyanakkor nálam a homeassistant nem csak reléket kapcsolgatna, hanem egy kicsit nagyobb funkcionalitású dolog lenne (ez itt nagyrészt OFF).
A zero pedig - a szállítást nem számolva - kb. annyina kerül mint egy uno klón, szóval ez az irány 4 GBP szállítási költséggel és egy uSD kártya árával drágább. (A LAN csatlakozás és a relé mindkettőnél pénzbe kerül, kb. ugyanannyiba.)
Bocs, akkor benéztem az if zárójel párosításokat.
A problémám az, hogy nagyon nehézkesen programozható (egyáltalán van hozzá "full" TCP/IP stack?), szóval küzdős, és gondolom a sebessége se túl acélos. Amiket eddig láttam arduino+webserver témában azok nagyrészt ilyen "Hello World" és "Analog 0 is 253" kategóriájú dolgok voltak, "so 1994" kinézettel. Arra mondjuk biztos jó.
Illetve még egy dolog: ahogy látom a google ki akarja nyírni a plain http-t, és szerintem a firefox is menni fog velük. Nem ma és nem holnap lesz az, hogy tiltani fogják, de előbb utóbb ez lesz. Egy "rendes" SoC-n pedig a HTTPS pedig Let's Encrypt-tel megoldható (mondjuk egy domain nem árt hozzá), erre pedig az Uno gyenge. A hozzászólás módosítva: Márc 7, 2017
digitalWrite(h1, LOW);
digitalWrite(h2, LOW);
digitalWrite(h4, LOW);
digitalWrite(h8, LOW);
...
if (hour == 1) {
digitalWrite(h1, HIGH);
}
if (hour == 2) {
digitalWrite(h2, HIGH);
}
if (hour == 3) {
digitalWrite(h1, HIGH);
digitalWrite(h2, HIGH);
}
if (hour == 4) {
digitalWrite(h4, HIGH);
}
Ezt inkább valahogy így csinálnám (a kód simán lehet hibás, maga az elv a lényeg):
digitalWrite(h1, hour % 2);
hour = hour / 2;
digitalWrite(h2, hour % 2);
hour = hour / 2;
digitalWrite(h4, hour % 2);
...
Vagy mondjuk bitshift, vagy logikai operátorok, de semmiképp se úgy hogy 12 if az órához és 60 if a perchez
Ez nagyon jó ötlet, köszi!
Akkor már csak az idővisszaállást kellene valahogy megoldanom...
Tipp1: ki kellene olvasnod minden regisztert
Tipp2: a displayTime() fv-ben a 3 változó deklarása és a readDS3231time meghívása közötti részt kommentezd ki a fenébe, lehet ott a hiba.
Szerintem a display rutin igy jó:
...
readDS3231time(&second, &minute, &hour);
if (hour > 11) {
hour = hour - 12;
hourcheckbit++;
}
// átrakod a bit értékeit a kimenetekre
digitalWrite(h1, bitRead(hour, 0));
digitalWrite(h2, bitRead(hour, 1));
digitalWrite(h4, bitRead(hour, 2));
digitalWrite(h8, bitRead(hour, 3));
digitalWrite(m1, bitRead(minute, 0));
digitalWrite(m2, bitRead(minute, 1));
digitalWrite(m4, bitRead(minute, 2));
digitalWrite(m8, bitRead(minute, 3));
digitalWrite(m16, bitRead(minute, 4));
digitalWrite(m32, bitRead(minute, 5));
}
...
Uraim, köszönöm szépen! Működik a dolog, a beállító gomb szépen pörgeti az időt ha nyomom, kikapcsolásnál nem ugrik vissza az alapértékre. Végül ez lett a jó megoldás, ha érdekelne valakit: #include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
int buttonpin = 2;
int buttonstate = 0;
int h1 = 12;
int h2 = 11;
int h4 = 10;
int h8 = 9;
int m1 = 8;
int m2 = 7;
int m4 = 6;
int m8 = 5;
int m16 = 4;
int m32 = 3;
int hourkeep = 0;
int minutekeep = 0;
int hourcheckbit = 0;
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
void setup()
{
Wire.begin();
pinMode(h1, OUTPUT);
pinMode(h2, OUTPUT);
pinMode(h4, OUTPUT);
pinMode(h8, OUTPUT);
pinMode(m1, OUTPUT);
pinMode(m2, OUTPUT);
pinMode(m4, OUTPUT);
pinMode(m8, OUTPUT);
pinMode(m16, OUTPUT);
pinMode(m32, OUTPUT);
pinMode(buttonpin, INPUT_PULLUP);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
ADCSRA = ADCSRA & B01111111;
ACSR = B10000000;
DIDR0 = DIDR0 | B00111111;
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0);
Wire.endTransmission();
Wire. requestFrom(DS3231_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
if (hour > 11) {
hour = hour - 12;
hourcheckbit++;
}
hourkeep = hour;
minutekeep = minute;
digitalWrite(h1, hour % 2);
hour = hour / 2;
digitalWrite(h2, hour % 2);
hour = hour / 2;
digitalWrite(h4, hour % 2);
hour = hour / 2;
digitalWrite(h8, hour % 2);
hour = hourkeep;
digitalWrite(m1, minute % 2);
minute = minute / 2;
digitalWrite(m2, minute % 2);
minute = minute / 2;
digitalWrite(m4, minute % 2);
minute = minute / 2;
digitalWrite(m8, minute % 2);
minute = minute / 2;
digitalWrite(m16, minute % 2);
minute = minute / 2;
digitalWrite(m32, minute % 2);
minute = minutekeep;
if (hourcheckbit > 0) {
hour = hour + 12;
hourcheckbit = 0;
}
buttonstate = digitalRead(buttonpin);
if (buttonstate == LOW) {
minute++;
if (minute == 60) {
minute = 0;
hour++;
}
setDS3231time(second,minute,hour,dayOfWeek,dayOfMonth,month,year);
}
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(1000); // every second
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS3231
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
Viszont most is lenne egy gondom, remélem erre is tud valaki megoldást. Ez a program 4114 byte így ahogy most van. Ezt valahogy bele kéne erőltetnem egy ATmega48PA-ba. Ha jól tudom, ahhoz 4096 bytenak kéne lennie maximum. Hogy tudnám ezt megoldani anélkül, hogy újraírom az egészet assemblyben? Azzal is próbálkoztam, de nekem sajnos magas, ha pedig nem értem a kódot, esélytelen a debug, ha egyszer szükség lenne rá.
Amit fentebb javasoltam vezérlést! Nem vált be, vagy nem is próbáltad?
Bővebben: Link
Nem töltöttem fel. Az IDE hiba nélkül fordította, de kicsit nagyobb lesz a végeredmény byteok terén, mint a másik megoldásnál. Ezért használom inkább ezt, de mint látod, így sem férek el sajnos
-UPDATE-
Meglett a megoldás azt hiszem. Arduino IDE 1.8.1-el 3460 byte. Eredetileg 1.0.6-tal fordítottam. Ez hogy lehet? A kód egy az egyben ugyanaz, csak 1.8.1-el nyitottam meg. Működést gondolom ez nem befolyásol A hozzászólás módosítva: Márc 9, 2017
|
|