Ethernet(Wiznet) + SD kártya Megán

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

Hozzászólás Szerző: srejbi »

vespapierre írta: A furcsa még mindig az, hogy a serial on néha a Getting temperatures előtt más más karakter jelenik meg...
kezdem feladni...
ne add fel.

valószínűleg vagy túl nagy (stack-heap collisionhoz vezethet) vagy túl kicsi (ez esetben elképzelhető, hogy túlírsz a használható bájtokon /strcpyn -el lehet limitálni a másolt karakterlánc max. hosszát/) tömböt próbálsz foglalni.

/erre utal a Serial-on megjelenő társzemét/
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

és ettől lehet a duplázott érték is??
számoljam újra a karakterláncok hosszát?
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

Hozzászólás Szerző: srejbi »

vespapierre írta: kicseréltem az előzőleg csatolt forrást, ha esetleg valakinek lenne kedve, kapacitása rápillantani, mit csesztem (cseszek ) el.

Jaa és a furcsa az, hogy a hőmérséklet értékeknél a dupláját tárolja el!!és küldi el először...

Köszi!

Kód: Egész kijelölése

char tempbuf0[5];
...

strcpy(dataString, itoa(temp0,tempbuf0,5)); // na itt az egyik hiba
5-ös számrendszerben 20 fok '40'

helyesen:

Kód: Egész kijelölése

strcpy(dataString, itoa(temp0,tempbuf0,10));

a másik hiba (társzemét majd programhalál) itt van:

Kód: Egész kijelölése

// make a string for assembling the data to log:
  char dataString[30] = "";   // namost ez 29 használható karaktert jelent
  char sDate[11] = "";         // ez 10-t '2012/11/17' belefér + '\0' - ok
  char sTime[9] ="";           // ez 8-t '00:00:00' belefér, + '\0' - ok

// dátum+idő - 18 karakter, majd mikor beszúrod a dataString-be, maradni fog 11 használható karaktered  (hogy a '\0'-nak is maradjon 1 char)
  //-------------------------------------------------------------  
  
  strcpy(sTime, rtc.formatTime());
  //sTime=rtc.formatTime();   //read formatted time from i2C RTC
  strcpy(sDate, rtc.formatDate(RTCC_DATE_ASIA));
 // sDate=rtc.formatDate(RTCC_DATE_ASIA); //read formatted date from 12C RTC

  Serial.print(sTime);
  Serial.print(" ");
  Serial.print(sDate);
  Serial.println();
     
// akkor számoljunk - javítottam 10-es szrendszerre
  strcpy(dataString, itoa(temp0,tempbuf0,10));  // potenciálisan 4 char, ha pl. '20.1' fok
  strcat(dataString, ";");                                  // +1 = 5
  strcat(dataString, itoa(temp1,tempbuf0,10));  // +4 = 9
  strcat(dataString, ";");                                  // +1 = 10
  strcat(dataString, itoa(temp2,tempbuf0,10)); // +4 = 14 (már bukta, tudva, hogy még 18 karakternyi timestamp lesz hozzáfűzve, azért számoljunk tovább)
  strcat(dataString, ";");                               // +1 = 15
  strcat(dataString, sDate);                           // +10 = 25
  strcat(dataString, ";");                               // +1 = 26
  strcat(dataString, sTime);                          // +8 = 34 - nincs is értelme tovább nézni, rég máshova írunk a memóriában, mint szabad lenne
  strcat(dataString, ";");
1) növeld meg a dataStringet tömb méretét. ha nem akarsz szöszölni, akkor pl. 64-re.
2) ha mínusz fokokat is akarsz, akkor a tempbuf0-t is, mert így a -10.0 foknál már túlírnád a tempbuf0 méretét.
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

Hozzászólás Szerző: srejbi »

vespapierre írta:és ettől lehet a duplázott érték is??
azt az 5-ös számrendszerre való konverzió okozza.
vespapierre írta:számoljam újra a karakterláncok hosszát?
nem ártana, lásd a fent idézett kódrészletbe szúrt kommentjeimet.
Avatar
srejbi
DrótVégénSzéndarab
Hozzászólások: 16
Csatlakozott: 2012. november 5. hétfő, 7:00

Hozzászólás Szerző: srejbi »

ja, és a kód jelen formájában továbbra is számíthatsz rá, hogy előbb utóbb behal a netezés, mivel továbbra is String-et adsz át a thingspeak-os rutinodnak, és abban azt használod:

Kód: Egész kijelölése

 void updateThingSpeak(String tsData)
inkább

Kód: Egész kijelölése

 void updateThingSpeak(char *tsData)
illetve:

Kód: Egész kijelölése

tsData.length()
helyett

Kód: Egész kijelölése

strlen(tsData)
(irtsd ki a String-et teljesen, amúgy ígéretes az átirat)
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

kiszedtem a stringeket...de sajnos a helyzet ugyanaz...
első sor üres bejegyzés, utána 11 helyes bejegyzés, majd csupa üres sor...
az errorlog pedig:
Program start:
2012-11-18 18:04:14
Program start:
2012-11-18 18:04:25
Program start:
2012-11-18 18:06:16
Program start:
2012-11-18 18:06:33
Program start:
2012-11-18 18:16:38

itt valami más is van...:( a társzemét is megmaradt...
jav.: a pinmode kapcsolgatásokat kivettem, és minden maradt, ahogy előtte:

Program start:
2012-11-18 18:38:33
Program start:
2012-11-18 18:38:47
Program start:
2012-11-18 18:47:42
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

friss tapasztalatok:

alapvetően a thingspeak update esetén keletkezett társzemét sd kártya nélkül is...

kipróbáltam egy másik szolgáltatót, ott nincs társzemét...
külön futtatva a pachube feltöltést és külön az SD kártya írást, minden ok...
Ha együtt próbálom egy kódban, akkor a helyzet továbbra is fennáll...ugyan karakter nem vész el a logfileban, de :
- az erorrlog alapján többször újraindul a program ( feltöltésben ez nem látszik)
- továbbra is egy idő után üres sorok jelentkeznek a datafile-ban
Ezek szerint a két "eszköz" kezelésével van a gubanc? Jelenleg kifogytam az ötletekből...
eredeti forrás felülírva az első hozzászólásban...
Srejbinek köszönöm az eddigieket!
Bármilyen ötletet javaslatot szívesen veszek!
Köszi!
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

Újabb fejlemények...sajnos a sztori azóta sem oldódott meg. Kisebb szemléletváltás után az új kód először logol sd kártyára ( eddig minden sima ), majd töltene fel az internetre...na itt jön a gubanc...itt ismét előjön a régi jelenség : üres sorok, és a log leállása... pedig a kódban sokmindent máshogyan csináltam és mégis...
egészen addig minden ok, amíg a getpage() funkciót meghívom...ha azt kikommentelem, akkor az első logírás nem sikerül, de utána megy szépen...ha visszateszem a getpage()-et...akkor már kampec...
van ötletetek???

Kód: Egész kijelölése

#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Rtc_Pcf8563.h>
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>

// Data wire is plugged into port 3 on the Arduino
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress Thermometer1, Thermometer2, Thermometer3 ;

//init the real time clock 
Rtc_Pcf8563 rtc; 

//variables

int temp0;
int temp1;
int temp2;
char pageAdd[140];
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// change to your server
IPAddress server(184,106,153,149);
EthernetClient client;

// **********************************SETUP*****************************************************
void setup(void)
{

  // start serial port
  Serial.begin(9600);

  // disable w5100 while setting up SD
  pinMode(10,OUTPUT);
  digitalWrite(10,HIGH);

  //start SD
  Serial.print(F("Starting SD..."));
  if(!SD.begin(8)) Serial.println(F("failed"));
  else Serial.print(F("ok "));

  // Start w5100
  Serial.print(F("Starting wi5100..."));
  if(!Ethernet.begin(mac)) Serial.println(F("failed"));
  else Serial.print(F("ok "));

  // this corrects a bug in the Ethernet.begin() function
  digitalWrite(10,HIGH);

  Serial.print(F("IP: "));
  Serial.println(Ethernet.localIP());

  delay(2000);
  Serial.println(F("Ready"));

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print(F("Locating devices..."));
  Serial.print(F("Found "));
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(F(" devices."));

  // report parasite power requirements
  Serial.print(F("Parasite power is: ")); 
  if (sensors.isParasitePowerMode()) Serial.println(F("ON"));
  else Serial.println(F("OFF"));

  oneWire.reset_search();
  if (!oneWire.search(Thermometer1)) Serial.println(F("Unable to find address for Thermometer1"));
  if (!oneWire.search(Thermometer2)) Serial.println(F("Unable to find address for Thermometer2"));
  if (!oneWire.search(Thermometer3)) Serial.println(F("Unable to find address for Thermometer2"));

  // show the addresses we found on the bus
  Serial.print(F("Device 0 Address: "));
  printAddress(Thermometer1);
  Serial.println();

  Serial.print(F("Device 1 Address: "));
  printAddress(Thermometer2);
  Serial.println();
  
  Serial.print(F("Device 2 Address: "));
  printAddress(Thermometer3);
  Serial.println();

  // set the resolution to 9 bit
  sensors.setResolution(Thermometer1, TEMPERATURE_PRECISION);
  sensors.setResolution(Thermometer2, TEMPERATURE_PRECISION);
  sensors.setResolution(Thermometer3, TEMPERATURE_PRECISION);

  Serial.print(F("Device 0 Resolution: "));
  Serial.print(sensors.getResolution(Thermometer1), DEC); 
  Serial.println();
  Serial.print(F("Device 1 Resolution: "));
  Serial.print(sensors.getResolution(Thermometer2), DEC); 
  Serial.println();
  Serial.print(F("Device 2 Resolution: "));
  Serial.print(sensors.getResolution(Thermometer3), DEC); 
  Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print(F("0"));
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print(F("Temp C: "));
  Serial.print(tempC);
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print(F("Resolution: "));
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();    
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print(F("Device Address: "));
  printAddress(deviceAddress);
  Serial.print(F(" "));
  printTemperature(deviceAddress);
  Serial.println();
}

//********************************************LOOP**************************************

void loop(void)
{ 
  delay(15000);
  Serial.print(F("Requesting temperatures..."));
  sensors.requestTemperatures();
  Serial.println(F("DONE"));

  // print the device information
  //  printData(Thermometer1);
  //  printData(Thermometer2);

  Serial.print(F("Temperatures are "));
  Serial.print(sensors.getTempC(Thermometer1));
  Serial.print(F(" Celsius, "));
  Serial.print(sensors.getTempC(Thermometer2));
  Serial.print(F(" Celsius, "));
  Serial.print(sensors.getTempC(Thermometer3));
  Serial.print(F(" Celsius, "));
  Serial.print(F("\n\r"));

  temp0=(sensors.getTempC(Thermometer1));
  temp1=(sensors.getTempC(Thermometer2));
  temp2=(sensors.getTempC(Thermometer2));

  //datetime
  char sdate[11] = ""; 
  char stime[9] =""; 
  strcpy(stime, rtc.formatTime()); 
  strcpy(sdate, rtc.formatDate(RTCC_DATE_ASIA)); 
  Serial.print(stime); 
  Serial.print(" "); 
  Serial.print(sdate); 
  Serial.println();  
  
   if(!logFile(sdate,stime,temp0,temp1,temp2)) Serial.println(F("Log failed"));
  else Serial.println(F("Log ok"));
  
sprintf(pageAdd,"/update?key=xxxxxxxxxxxxxxxx&field1=%i&field2=%i&field3=%i",temp0,temp1,temp2); 

if(!getPage(server,pageAdd)) Serial.print(F("Fail "));
 else Serial.print(F("Pass "));
  
}
int logFile(char* sdate, char* stime, int temp0, int temp1, int temp2) {
  File fh = SD.open("test.txt",FILE_WRITE);
  if(!fh) {
    Serial.println(F("Open fail"));
    return 0;
  }

  sprintf(pageAdd,"%s,%s,%i,%i,%i;",sdate,stime,temp0,temp1,temp2);
  fh.println(pageAdd);
  fh.close();
  return 1;
}
 byte getPage(IPAddress ipBuf,char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  if(client.connect(ipBuf,80))
  {
    Serial.println(F("connected"));

    sprintf(outBuf,"GET %s HTTP/1.0\r\n\r\n",page);
    client.write(outBuf);
  } 
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

  // connectLoop controls the hardware fail timeout
  int connectLoop = 0;

  while(client.connected())
  {
    while(client.available())
    {
      inChar = client.read();
      Serial.write(inChar);
      // set connectLoop to zero if a packet arrives
      connectLoop = 0;
    }

    connectLoop++;

    // if more than 10000 milliseconds since the last packet
    if(connectLoop > 10000)
    {
      // then close the connection from this end.
      Serial.println();
      Serial.println(F("Timeout"));
      client.stop();
    }
    // this is a delay for the connectLoop timing
    delay(1);
  }

  Serial.println();

  Serial.println(F("disconnecting."));
  // close client end
  client.stop();

  return 1;
}
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Egy hibát találtam:

Kód: Egész kijelölése

byte getPage(IPAddress ipBuf,char *page) 
 { 
   int inChar; 
   char outBuf[128]; 

   Serial.print(F("connecting...")); 

   if(client.connect(ipBuf,80)) 
   { 
     Serial.println(F("connected")); 

     sprintf(outBuf,"GET %s HTTP/1.0\r\n\r\n",page); 
     client.write(outBuf); 
// Itt hiányzik a vissza adot érték, pedig a hívó várja!
// Szerintem ez rácsorog a következő rutinra. Mivel hiányzik a Return!

   } 
   else 
   { 
     Serial.println(F("failed")); 
     return 0; // Csak itt van visszatérési érték?

   }

Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

opsz... ott kimaradt volna egy

Kód: Egész kijelölése

return 1;
...

Köszi! Kipróbálom!
már csak reménykedem, mert kifogytam az ötletekből...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Következő olvasatra lehet, hogy tévedtem!
Mert a rutinod végén ott van a return.
:?
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

akkor most kakukk van...
szabad SRAM memoria a setup() elején :6063.
már az arduino fórumon is kezdünk tanácstalanok lenni...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

println(F("Timeout"))
esetén a (F( muszáj? Ez időigényes...


Mega esetén:
- 50-51-52 lábak 1:1ben a wiznetre (SPI busz)
- 53. láb (/SS) üresen marad és a D10-et használja az ethernet. Ezt a kódban helyenként kézzel kell kapcsolni!
- az SD aktivizálásakor a Wiznetet inaktiválni kell! (akár kézzel is)
Avatar
vespapierre
DrótVégénSzéndarab
Hozzászólások: 37
Csatlakozott: 2012. október 31. szerda, 6:00

Hozzászólás Szerző: vespapierre »

50-51-52 tiszta sor. A wiznet chipselectet meg nem probaltam...ha jol ertem akkor a setup elejen resetbe tenni? Output+low es 250 mili utan high?
Sd eseten a wiznetet outputra + high ra pakoltam.Wiznet eseten az sd-t nem az igaz...
Kiprobalom,koszi.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Nincs előttem a rajz, de ha jól emlékszem:
#reset van rajta, azaz megegyezik az AVR-rel. Wiz_RESET ába Low szinten RESET, High szinten normál működés.
Viszont a ChipSelect mind a SD, mind a Wiznet esetén ne legyen aktív!

A hibás adatírás/olvasás az lehet attól is, hogy a 2 eszköz /CS lába egyszerre aktív! Így mindkettővel beszélgetsz, ők meg vissza és ettől bezavarodik a rendszer....
Válasz küldése