Fórum témák
- • Kondenzátor
- • Audiofil, High End Audio
- • Hibrid erősítő
- • Alternativ HE találkozó(k)
- • Háromfázisú aggregátor
- • Számítógép hiba, de mi a probléma?
- • Központi fűtés (vezérlés)
- • Erősítő mindig és mindig
- • IMI villanymotor
- • Műhelyünk felszerelése, szerszámai
- • SMD, mi a típusa?
- • Szünetmentes táp javítása, élesztése
- • Videomagnó problémák
- • Borhűtő vezérlő panel
- • Androidos okos telefonok
- • Klíma beszerelése, fűtés-hűtés házilag
- • Súlymérés
- • Dobozolási technikák, műszerdobozok
- • Elfogadnám, ha ingyen elvihető
- • Kombikazán működési hiba
- • Laptop javítás, tuning
- • Digitális óra
- • Varrógép elektronika
- • Arduino
- • Mosógép vezérlők és általános problémáik
- • Analóg oszcilloszkóp javítása
- • Boombox javítás
- • Elektromos távirányítós kapunyitó
- • Hűtőgép probléma
- • Videoton EA-7386-s erösítő
- • Digitális mérleg
- • Kapcsolási rajzot keresek
- • TV hiba, mi a megoldás?
- • Felajánlás, azaz ingyen elvihető
- • Triak és tirisztor helyettesítése
- • Rádióamatőrök topikja
- • Hangszórójavítás (otthon)
- • LED-es világítás
- • Whirlpool mosógép
- • Vásárlás, hol kapható?
- • Autóelektronika
- • Hangváltók (készítése)
- • Függvénygenerátor építése
- • Vicces - mókás történetek
- • Forrasztópákák - melyik miért jó
- • CPLD, FPGA - Miértek, hogyanok
- • Eredményjelző
- • Klíma szervizelés, javítás
- • V-FET és SIT erősítő kapcsolások
- • Érdekességek
- • Autós erősítős kérdések, problémák
- • Padlófűtés vezérlés
- • Li-Ion saját akkucsomag készítése
- • Tranzisztor teszter
- • Elektromos kerékpár, robogó házilag
» Több friss téma
|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Fagyás = programozási hiba, ami a felhasználó hibája, program megáll, bármi történhet, kimenetek úgy maradnak, ahogy voltak, esetleg az interrupt dolgozik a háttérben. Pl: várni egy eseményre, ami sosem fog bekövetkezni, és nincs időkorlát (timeout).
Reset = hibás hardver esetén a tápfeszültség túl alacsony értékre csökken, ekkor általában reset történik ( fuse bit figyel erre, de ha ki van kapcsolva az alacsony feszültség védelem, bármi történhet, esetleg próbál indulgatni a proci, de közben leesik a feszültség lemerült akksi esetén, stb.) relé kapcsolásakor zavar keletkezik, ez a kvarcot befolyásolhatja, legrosszabb esetben megáll a program, hogy ezután lesz-e reset, azt nem tudom, de a watchdog pont ezekért felel. Reset esetén minden kimenet lebeg, és újraindul a program az elejéről. Ezen kívül még több lehetőség is létezik. A hozzászólás módosítva: Márc 6, 2016
Köszönöm a válaszod, sokat segített! Főleg a sokak által említett "fagyás" érdekelt, mert azt hittem ez valami bizonytalanság magában az eszközben. A jó programozó a windows-t is le tudja fagyasztani, szóval a programozási hibák annyira nem érdekelnek, azt bármilyen környezetben el lehet követni. Találtam egy jó tutorial-t a watchdog-ról, így már tudom, hogy bármi van tudom reset-elni a kontrollert. Köszi.
Tisztelt Fórumozók!
A véleményeteket szeretném kérni, hogy melyik függvénnyel készítsem el a stopperem. A cél az, hogy egy elektromágnes elejt egy golyót (valamelyik kimenet HIGH-ról LOW-ra), ekkor indulna az időmérés és a golyó ráesik egy lapra ahol zár egy érintkezőt. Az időt a serial monitoron íratnám ki.
Köszönöm!
A korábban már bemutatott kép szerint építettem ki a vezérlőt, légvezetékeléssel, az eredeti Arduinos sildekkel.
Az optocsatolt relék bemenete kapja a nano megfelelő digitális kimenetét, a kapcsoló 5V-ot a külső tápról, a relék kapcsolják a szivattyúkat, irányváltó motorokat AC 230V-al.
Az AC230 V-os relét a lakástermosztát kapcsolja, ez ad DC 5V-os jelet az Arduino A3 bemenetre a lakás jel figyeléshez.
Lefagyáskor megáll a program futása, a log fájlból látszik, a void loop, a wdt teszteléskor működik, ebben az esetben nem indítja újra a nanot.
A lefagyás általában csak egy-egy szivattyú üzemében jelentkezik, amikor leáll.
A kód:
YourDuino.com Example: Multiple DS18B20 Temperature Sensors
Displayed on 4x20 character LCD display
DS18B20 Pinout (Left to Right, pins down, flat side toward you)
- fekete = Ground
- sárga = Signal (Pin 2): (with 3.3K to 4.7K resistor to +5 or 3.3 )
- zöld = +5 or +3.3 V */
#include <SPI.h>
#include <SD.h>
#include <avr/wdt.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <DS1624.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
DS1624 temperature1(0x48);
DS1624 temperature2(0x4E);
DS1624 temperature3(0x4D);
DS1624 temperature4(0x4F);
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
/*-----( Declare Constants and Pin Numbers )-----*/
// Data wire is plugged into port 2 on the Arduino (can be changed)
#define ONE_WIRE_BUS 2 // NOTE: No ";" on #define
#define SZV1START 3 // relay1
#define LAKAS1 5 // relay2
#define PUFFER 4 // relay3
#define SZV2START 6 // relay4
#define BYPASS 7 // relay5
#define LAKAS2 8 // relay6
/*-----( Declare objects )-----*/
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass address of our oneWire instance to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// Start the LCD display library
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
int LED1 = 13; // Status LED Pin
int SCLK = 9; // SCLK pin of MAX6675
int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F)
float fusthofok = 0.0; // Temperature output variable
float lakaskW = 0.0;
float kazankW = 0.0;
// Initialize the MAX6675 Library for our chip
// Setup Serial output and LED Pin
/*-----( Declare Variables )-----*/
// Assign the addresses of your 1-Wire temp sensors.
// See the tutorial on how to obtain these addresses:
// http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#Read%20individual
// WP 1
DeviceAddress pufferfent = { 0x28, 0xAC, 0xFA, 0x26, 0x06, 0x00, 0x00, 0x8C }; // "T1"
DeviceAddress puffer1_3 = { 0x28, 0x61, 0xBB, 0x26, 0x06, 0x00, 0x00, 0x7D }; // "T2"
DeviceAddress puffer2_3 = { 0x28, 0x99, 0x10, 0x26, 0x06, 0x00, 0x00, 0xED }; // "T3"
DeviceAddress pufferlent = { 0x28, 0x15, 0x1F, 0x28, 0x06, 0x00, 0x00, 0x00 }; // "T4"
float temppufferfent = 0.0;
float temppuffer1_3 = 0.0;
float temppuffer2_3 = 0.0;
float temppufferlent = 0.0;
void setup() /****** SETUP: RUNS ONCE ******/
{
wdt_disable();
lcd.init(); // initialize the lcd
lcd.backlight();
Serial.begin(9600);
// set the initial time here:
//DS3231 seconds, minutes, hours, day, date, month, year
//setDS3231time(30,10,14,3,16,12,15);
//------- Initialize the Temperature measurement library--------------
sensors.begin();
// set the resolution to 10 bit (Can be 9 to 12 bits .. lower is faster)
sensors.setResolution(pufferfent, 10); //T1
sensors.setResolution(puffer1_3, 10); //T2
sensors.setResolution(puffer2_3, 10); //T3
sensors.setResolution(pufferlent, 10); //T4
temperature1.start();
temperature2.start();
temperature3.start();
temperature4.start();
pinMode(LED1, OUTPUT);
pinMode(SZV1START, OUTPUT);
pinMode(LAKAS1, OUTPUT);
pinMode(PUFFER, OUTPUT);
pinMode(SZV2START,OUTPUT);
pinMode(LAKAS2,OUTPUT);
pinMode(BYPASS,OUTPUT);
digitalWrite(SZV1START, HIGH); // szv1 áll
digitalWrite(LAKAS1, HIGH);
digitalWrite(PUFFER, HIGH); // pufferre állítja az irányváltó1-et
digitalWrite(SZV2START,HIGH); // szv2 áll
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS,HIGH); // bypassra állítja irányváltó2-őt
pinMode(A0, OUTPUT);
SD.begin(A0);
if (!SD.begin(A0)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
if (SD.exists("datalog.csv")) {
Serial.println("datalog.csv exists.");
}
else {
Serial.println("datalog.csv doesn't exist.");
}
wdt_enable(WDTO_8S);
}//--(end setup )---
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();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire. beginTransmission(DS3231_I2C_ADDRESS );
Wire. write(0); // set DS3231 register pointer to 00h
Wire.endTransmission();
Wire. requestFrom(DS3231_I2C_ADDRESS, 7);
// request seven bytes of data from DS3231 starting from register 00h
*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);
// 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);
Serial.print(" ");
Serial.print(dayOfMonth, DEC);
Serial.print("/");
Serial.print(month, DEC);
Serial.print("/");
Serial.print(year, DEC);
Serial.print(" Day of week: ");
switch(dayOfWeek){
case 1:
Serial.println("Sunday");
break;
case 2:
Serial.println("Monday");
break;
case 3:
Serial.println("Tuesday");
break;
case 4:
Serial.println("Wednesday");
break;
case 5:
Serial.println("Thursday");
break;
case 6:
Serial.println("Friday");
break;
case 7:
Serial.println("Saturday");
break;
}
}*/
void loop() /****** LOOP: RUNS CONSTANTLY ******/
{
SD.begin(A0);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
digitalWrite(LED1, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(LED1, LOW); // turn the LED off by making the voltage LOW
delay(100); // wait for a second
// Lakástermosztát fűtésre kapcsol= A3=5V
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
delay(100);
sensors.requestTemperatures(); // Send the command to get temperatures
temppufferfent = sensors.getTempC(pufferfent);
temppuffer1_3 = sensors.getTempC(puffer1_3);
temppuffer2_3 = sensors.getTempC(puffer2_3);
temppufferlent = sensors.getTempC(pufferlent);
float T1 = sensors.getTempC(pufferfent);
float T2 = sensors.getTempC(puffer1_3);
float T3 = sensors.getTempC(puffer2_3);
float T4 = sensors.getTempC(pufferlent);
float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
float kW = kW1*1.2771 ;
float szazalek = kW/64*100;
delay(700);
fusthofok = temp.read_temp();
// Read the temp from the DS1624
float T5 = temperature1.getTemp();
float T6 = temperature2.getTemp();
float T7 = temperature3.getTemp();
float T8 = temperature4.getTemp();
float lakaskW1 = (T5-T6)*0.001161*12.5*60;
float kazankW1 = (T7-T8)*0.001161*22*60;
if (LAKASFUTES > 0)
{
lakaskW = lakaskW1;
}
else
{
lakaskW = 0;
}
if(T7 > 45)
{
kazankW = kazankW1;
}
else
{
kazankW = 0;
}
delay(500);
Serial.println(LAKASFUTES);
Serial.println(fusthofok);
Serial.println(T1);
Serial.println(T2);
Serial.println(T3);
Serial.println(T4);
Serial.println(T5);
Serial.println(T6);
Serial.println(T7);
Serial.println(T8);
Serial.println(kW);
Serial.println(szazalek);
String dataString = "";
dataString += String(dayOfMonth, DEC);
dataString += ";";
dataString += String(hour, DEC);
dataString += ";";
dataString += String(minute, DEC);
dataString += ";";
dataString += String(second, DEC);
dataString += ";";
dataString += String(LAKASFUTES);
dataString += ";";
dataString += String(fusthofok);
dataString += ";";
dataString += String(T1);
dataString += ";";
dataString += String(T2);
dataString += ";";
dataString += String(T3);
dataString += ";";
dataString += String(T4);
dataString += ";";
dataString += String(T5);
dataString += ";";
dataString += String(T6);
dataString += ";";
dataString += String(T7);
dataString += ";";
dataString += String(T8);
dataString += ";";
dataString += String(kazankW);
dataString += ";";
dataString += String(lakaskW);
dataString += ";";
dataString += String(kW);
dataString += ";";
dataString += String(szazalek);
dataString += ";";
dataString.replace('.',',');
File dataFile = SD.open("datalog.csv", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
// if the file isn't open, pop up an error:
else
{
//Serial.println("error opening datalog.txt");
}
delay (500);
if(T7 > 58 && fusthofok > 130)
{
digitalWrite(LAKAS1,HIGH );
digitalWrite(SZV1START,LOW);
digitalWrite(PUFFER, LOW);
}
else
{
if(T7 > 45)
{
digitalWrite(PUFFER, HIGH);
digitalWrite(LAKAS1, LOW);
digitalWrite(SZV1START, LOW);
}
else
{
digitalWrite(PUFFER, LOW);
digitalWrite(LAKAS1, HIGH);
digitalWrite(SZV1START, HIGH);
}
}
if ( LAKASFUTES > 4)
{
if(szazalek > 1)
{
digitalWrite(BYPASS, HIGH);
digitalWrite(LAKAS2, LOW); // 6. RELÉ
digitalWrite(SZV2START, LOW); // 4. RELÉ
}
else
{
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS, LOW); // 5. RELÉ
digitalWrite(SZV2START, HIGH); // 4. RELÉ
}
}
else
{
digitalWrite(LAKAS2, HIGH);
digitalWrite(BYPASS, LOW); // 5. RELÉ
digitalWrite(SZV2START, HIGH); // 4. RELÉ
}
// clear the screen
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(5,0);
lcd.print("20");
lcd.setCursor(7,0);
lcd.print(year, DEC);
lcd.setCursor(9,0);
lcd.print(".");
lcd.setCursor(10,0);
lcd.print(month, DEC);
lcd.setCursor(12,0);
lcd.print(".");
lcd.setCursor(13,0);
lcd.print(dayOfMonth, DEC);
lcd.setCursor(15,0);
lcd.print(".");
lcd.setCursor(5,1);
lcd.print(hour, DEC);
lcd.setCursor(7,1);
lcd.print(":");
lcd.setCursor(8,1);
lcd.print(minute, DEC);
lcd.setCursor(10,1);
lcd.print(":");
lcd.setCursor(11,1);
lcd.print(second,DEC);
lcd.setCursor(1,3);
lcd.print(dayOfWeek);
lcd.setCursor(2,3);
lcd.print(".");
lcd.setCursor(5,3);
lcd.print("nap a heten");
delay(4000);
lcd.clear();
lcd.home(); lcd.backlight();
lcd.setCursor(8,0);
lcd.print("PUFFER");
lcd.setCursor(0,1);
lcd.print("T1=");
lcd.setCursor(4,1);
lcd.print(T1);
lcd.setCursor(11,1);
lcd.print("T2=");
lcd.setCursor(14,1);
lcd.print(T2);
lcd.setCursor(0,2);
lcd.print("T3=");
lcd.setCursor(4,2);
lcd.print(T3);
lcd.setCursor(11,2);
lcd.print("T4=");
lcd.setCursor(14,2);
lcd.print(T4);
lcd.setCursor(0,3);
lcd.print("kW=");
lcd.setCursor(4,3);
lcd.print(kW);
lcd.setCursor(11,3);
lcd.print("%=");
lcd.setCursor(14,3);
lcd.print(szazalek);
wdt_reset();
delay(4000);
// clear the screen
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(4,0);
lcd.print("LAKAS:");
lcd.setCursor(11,0);
lcd.print(lakaskW);
lcd.setCursor(0,1);
lcd.print("T5=");
lcd.setCursor(4,1);
lcd.print(T5);
lcd.setCursor(11,1);
lcd.print("T6=");
lcd.setCursor(14,1);
lcd.print(T6);
lcd.setCursor(4,2);
lcd.print("KAZAN:");
lcd.setCursor(11,2);
lcd.print(kazankW);
lcd.setCursor(0,3);
lcd.print("T7=");
lcd.setCursor(4,3);
lcd.print(T7);
lcd.setCursor(11,3);
lcd.print("T8=");
lcd.setCursor(14,3);
lcd.print(T8);
delay(4000);
// clear the screen
lcd.clear();
lcd.home();
lcd.backlight();
lcd.setCursor(8,0);
lcd.print("FUSTHOFOK");
lcd.setCursor(0,1);
lcd.print("fusthofok=");
lcd.setCursor(11,1);
lcd.print(fusthofok);
wdt_reset();
} // End
A hozzászólás módosítva: Márc 7, 2016
Pedig nincs mese, ki kellene derítened és kizárnod, hogy nem -e a tápfeszültség megrogyása kever be. Lehet egy pici induktív lökés. A nano 5 voltos tápját, ott ahol megkapja, és a GND-t már ne vidd tovább , ne is ágaztasd el. Ezek direktbe jöjjenek a táptól. Meg kellene nézned a fuse biteknél, hogy nincs e bekapcsolva a tápfeszfigyelés annak a resetje. Lépésről lépésre kellene haladni, hogy pontosan kiderüljön hol a hiba, mert akkor mi is tanulunk belőle. Jó lenne egy tárolós szkópal elkapni a jelenséget...
(hozzászólás ablaka alatt ott a LINK gomb, a kódot azzal illenék beszúrni)
Szerintem itt csak egyszerűen elfogy a memória, a rossz szervezés miatt!
??? „SD.begin(A0);” A setup-ban van a helye, nem a loop-ban!
Az arduino IDE memória felszabadítása hibás! ezt már többen is megállapították és leírták.
Ezért az Ilyen loop-ba rakott változó területfoglalásokat is kerüljük:
int sensorValue = analogRead(A3);
float LAKASFUTES = sensorValue * (5.0 / 1023.0);
…
temppufferfent = sensors.getTempC(pufferfent);
float T1 = sensors.getTempC(pufferfent);
float T2 = sensors.getTempC(puffer1_3);
float T3 = sensors.getTempC(puffer2_3);
float T4 = sensors.getTempC(pufferlent);
float kW1 = ((T1+T2+T2+T3+T3+T4)/6)-37 ;
float kW = kW1*1.2771 ;
float szazalek = kW/64*100;
…
// Read the temp from the DS1624
float T5 = temperature1.getTemp();
float T6 = temperature2.getTemp();
float T7 = temperature3.getTemp();
float T8 = temperature4.getTemp();
float lakaskW1 = (T5-T6)*0.001161*12.5*60;
float kazankW1 = (T7-T8)*0.001161*22*60;
…
A változókat a setup rész előtt hozzuk létre, a loop-ban már csak felhasználjuk!
Így elkerülhetjük a többszörös helyfoglalás okozta túlcsordulást.
Ami egy igen nehezen megtalálható hibaforrás. A hozzászólás módosítva: Márc 7, 2016
A képen, én csak egy táp bemenetet látok. Ha optocsatolt reléket használsz, akkor két táp kellene. Egy az aduinonak és egy az optonak. Hisz az optonak az a lényege, hogy leválaszd a tápot az arduino-ról. Ha ez nem így van, akkor ne csodálkozz ha "lefagy" a rendszer.
A millis() függvénnyel nem működik.
A kezdés és a megállítás nem sikerül e két érték különbsége kellett volna kiírni. HELP!
Amikor elejteted a golyót, egy változóba (legyen most "kezd" ) letárolod a millis() értékét, majd egy interrupt lábbal pedig eltárolod egy másik változóba (legyen "veg" ) a millis() értékét.
Ezek után egy harmadik változónak ( legyen "ido" ) megmondod, hogy ido = veg - kezd. Ezután az ido változó értéke a golyó földetérésének idelye lesz. Ezt már kiírhatod lcd-re, szegmenskijelzőre, vagy a soros ablakba is.
Kiegészíteném, hogy a millis() értékeket lehetőleg "long" vagy "unsigned long" változóba tárold! Gyakori hiba, hogy "int"-be akarják tárolni!
Köszönöm!
A "majd egy interrupt lábbal" részt nem értem. Kérlek egy picit részletezd! Mit kell itt csinálni?
Sziasztok!
Arduino-ban hogy tudok formázni változót? Mint Bascom-ban a fusing:
Temp = Fusing(T, "+00.0")
Ezt szeretném Arduino-ban is valahogy elérni ezzel:
float tempC = 0;
void takeReading()
{
sensors.requestTemperatures();
delay(750);
tempC = sensors.getTempCByIndex(0);
if (tempC == -127.00) {
Serial.print("Error getting temperature.");
}
//tempC=tempC formázva....
}
És ha meg van formázva 1 tizedes bőven elég lenne akkor használnám fel két helyen:
//Webre
client.print(tempC,DEC);
//És átadni modbus-nak:
Mb.R[8] = tempC*10;
Tudna valaki segíteni ?
Már külön DC 5V-ot kapnak a relék, külön az Arduino VIN bemenete DC 9V-ot.
Ma reggelre is lefagyott a rendszer, a log fájl szerint tegnap 20 órától, csak mérés módban.
Utána kellene nézni az interupt vagy megszakítás fogalmának.
Ebből van többféle, külső és belső.
Ezen felül ezeknek van prioritása vagy elsőbbségi rendszere.
Arduino interupt / megszakítást kezelő rutinjait megismerni és azokat a portokat amik képesek külső hardveres megszakítás kezelésre.
Ezen kívül nem ártana még a prell fogalmával is tisztában lenni.Mert a lehulló tárgyad érzékelésekor ilyen jelenség is lesz ha mechanikusan kontaktussal fogod érzékelni.
(Debounce kezelése)
Talán optikaival határozottabb lenne. A hozzászólás módosítva: Márc 8, 2016
Ha egy "kézzel" rajzolt kapcsolást fel tudsz tenni, lehet, hogy többet tudunk segíteni. Addig, csak találgatunk, hogy mi lehet a baj.
A float típusú változónál így lehet egy tizedesre kiíratni:
A DEC, vagy HEX csak egész típusú kiíratásnál használható.
Köszi!
A
-nél bevált így.
//Webre
Mb.R[8] = tempC*10;
Résznél pedig így.
Ott azt hiszem int-be kell át adni ami egész szám.
Ezért ha 23,568778... jön ki amit felszorzok 10-el, így lesz 235,68778... ami intben:235 lett.
A túl oldalon ezt vissza osztom 10-el és meg is van a 23,5
Köszi!
A kézi üzem rész és az optocsatolós relék a nano és a busz rész nélkül már korábban meg rajzolva.
A Fritzing-ben hogyan lehet opto csatolt relét bevinni? A hozzászólás módosítva: Márc 8, 2016
Új falba ütköztem, a textfinder használatával.
Miért van az hogy ha:
if(finder.find("ASD")){
Serial.println("connection has ASD");
}
if(finder.find("ERT")){
Serial.println("connection has ERT");
}
van a programban, akkor csak az elsőt találja meg bármi van?
Ha "ASD" ha "ERT" érkezik tuti hogy a második nem talál semmit.
ha kicserélem a keresendő kifejezést akkor is csak az első talál.
Ez mi lehet ?
Bővebben: Link
Idézet: „The parsing is done without using a buffer so there is no way to go back through data that has already been read.”
Idézet: „Note that TextFinder takes a single pass through the stream, there is no way to go back to try and find or get something else (see the findUntil method ).”
Ezt én is megtaláltam, azért ennyire nem vagyok láma. Angolul viszont nem beszélek, arra viszont magamtól is rájöttem hogy valamiért kiüríti a buffer-t.
De akkor viszont hogy lehet vizsgálni arduino-ban hogy mi volt a linkben?
Bascom-ban így néz ki és nem egyszer használatos a változó.
If Instr(buffer , "ASD") > 0 Then.....
If Instr(buffer , "ERT") > 0 Then.....
Itt próbáltam hogy
EthernetClient client = server.available();
if (client) {
TextFinder finder(client );
TextFinder finder2(client );
while (client.connected()) {
if (client.available()) {
if(finder.find("ASD")){
Serial.println("connection has ASD");
}
if(finder2.find("ERT")){
Serial.println("connection has ERT");
}
De ez se jött be.
Hogy lehet ezt megcsinálni?
Az a gond, hogy ez nem bufferelt olvasás, tehát ha egyszer végigolvas az adatfolyamon, utána nem tud visszamenni. Képzeld úgy, hogy van egy "kurzor", ami jelzi, hogy hol tart éppen az olvasás. Ez a kurzor csak előrefelé haladhat. A find következő hívása onnan folytatja az olvasást, ahol előzőleg abbamaradt, tehát ahol a kurzor éppen áll. Ha nem talált ASD-t, akkor az azt jelenti, hogy végigment a szövegen, tehát a kurzor a végén áll, nem meglepő, hogy utána már nem talál semmit. És ez a kurzor nem a finderhez tartozik, hanem a clienthez, ezért a második megoldásod is ugyanazt csinálja.
A legegyszerűbb megoldás, ha olyan formátumban küldöd az adatot, hogy pl. adat:ASD vagy adat:ERT. Ezután a finderrel megkeresed az "adat:" szöveget. Ha talált ilyet, akkor odaviszi a kurzort, és neked a következő három karakter kell, ezeket a client.read() függvénnyel be tudod olvasni. Itt láthatsz erre példát, a megkapott JSON struktúrából olvassa ki a "weather" adat "main" mezőjét.
Köszi így menni fog, hogy ez miért nem jutott eszembe..:S Kellemetlen dolog bő 10év bascom után arduino-t tanulni, ami már ott kézre esett és a folyamat ugyan az lenne, igazából eszembe se jut már így 30 fele...
Sikerült, leírom hátha másnak is kellhet.
Még annyi hogy a "result" és a "c" dekralálását kirakom a setup-ba, itt csak értékadás lesz.
while (client.connected()) {
if (client.available()) {
if( finder.find("GET /") ) {
String result = "";
if (finder.findUntil("SBM=", "\n\r")){
char c = client.read();
while(c != '&'){
result = result + c;
c = client.read();
}
Serial.println(result);
if (result == "NET"){
Serial.println("found a NET");
}
if (result == "DSI"){
Serial.println("found a DSI");
}
Köszi még egyszer! A hozzászólás módosítva: Márc 10, 2016
Ismét elakadtam de erre már tényleg nincs ötletem.
Itt adok értéket a tömbnek:
byte DS1 = 0x28;
byte DS2 = 0xAB;
byte DS3 = 0xE3;
byte DS4 = 0xD0;
byte DS5 = 0x04;
byte DS6 = 0x00;
byte DS7 = 0x00;
byte DS8 = 0xB1;
byte dsid1[] = {DS1, DS2, DS3, DS4, DS5, DS6, DS7, DS8};
lejjebb pedig kiolvasnám:
for (int i = 0 ; i < 8; i++)
{
client.print(dsid1[i],HEX);
Serial.print(dsid1[i],HEX);
}
De az eredmény mind két esetben:
lett,
helyett.
Ha 0 lenne az érték eleje akkor eldobja.
Próbáltam így is megadni:
byte dsid1[] = {0x28, 0xAB, 0xE3, 0xD0, 0x04, 0x00, 0x00, 0xB1};
Ezt hogy lehetne meg gátolni? A hozzászólás módosítva: Márc 10, 2016
A serial.print függvény a bűnös. Meg kell vizsgálnod külön, hogy nulla-e a szám, és akkot duplán kiírni. Egyébként logikus. Miért írna ki két nullát a fv.? 0 az nulla, és nem 00, nem is 000, akár HEX-ben, akár BIN-ben íratod ki. A hozzászólás módosítva: Márc 10, 2016
Idézet: „Meg kell vizsgálnod külön, hogy nulla-e a szám...”
Valóban az értéktelen nullák elhagyása okozza a problémát, de nem azt kell vizsgálni, hogy nulla-e a kiírandó, hanem hogy 0x10-nél kisebb-e.
0x10-nél kisebb-e? Azt hogy tudom vizsgálni?
for (int i = 0 ; i < 8; i++)
{
client.print(dsid1[i],HEX);
if((dsid1[i],HEX) < 0x10){
client.print(dsid1[i],HEX);
}
}
Ezt próbáltam a HEX-et elhagyva, 1 zárójelet elhagyva, de nem fordul le.
Ezekben az arduino-s szintaktikákban még nem vagyok túl jó.
Köszi
if((dsid1[i],HEX) < 0x10)
Ilyen nincs. Kiírásnál a HEX a print függvény második argumentuma, az if hasában nem csoda, hogy nem tudja értelmezni a fordító. De haszna sem lenne, mert ugyan kiíratásnál meg lehet adni, hogy milyen formában szeretnéd látni a számot, de összehasonlításnál ez tökmindegy (ezek számok, nem sztringek!).
De egyébként sem lenne jó, mert nem kétszer akarod kiírni a számot, hanem egy nullát akarsz elé írni. Ez a kód 0x04 esetén azt fogja kiírni, hogy 44.
Egyébként ez nem "Arduino szintaktika", hanem C++ szintaktika, úgyhogy esetleg javaslom, hogy C++ tutorialokat nézegess meg. Pláne ha Arduinón kívül is érdekel a programozás, mert a C++ a belépő a modern objektumorientált nyelvek, mint pl. a Java felé. A hozzászólás módosítva: Márc 11, 2016
Na igen és a sorrend sem lenne jó, akkor mert nem a végén hanem az elején vágja le a nullát.
for (int i = 0 ; i < 8; i++)
{
if(dsid1[i] < 0x10){
client.print("0");
}
client.print(dsid1[i],HEX);
}
De az van hogy így sem túl nyerő, már előbb is lehagytam a HEX-et ezt írtam, de hiába.
A dsid1[i] egy hex és a 0x10 is hex. akkor miért nem tudja összehasonlítani?
Ennek pedig működnie kellene, de legalábbis lefordulnia mindenképp. Mi a hiba?
Idézet: „A dsid1[i] egy hex”
Nem! Az egy szám, sima bináris kódban tárolva a memóriában. Hogy te azt 16-os, 10-es, vagy éppen 37-es számrendszerben, esetleg ASCII kódként vagy memóriacímként kezeled/íród ki, az csak tőled függ.
|
|