Hur använda Arduino UNO för att sampla och lägga i databas?

Planering och tankar kring eventuella framtida projekt.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Låter som ett aprilskämt men tack ändå :)

Och jag menar verkligen mitt tack även om tidstämpeln blir lite väl kryptisk.

Ta dag-numret t.ex, hur lätt är det att hålla koll på det?

Det räcker ju liksom inte att räkna veckor, man måste ta hänsyn till vilken dag året började på också.

MVH/Roger
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43150
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av sodjan »

Alla år börjar alltid med dag 1 om du räknar så...
ronnylov
Inlägg: 987
Blev medlem: 23 februari 2012, 12:06:19
Ort: Borås

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av ronnylov »

Tja du har ju en dator / microkontroller som kan räkna om det kryptiska filnamnet till något mer läsbart. Går nog att klura ut en funktion som omvandlar filnamnen till mer normalt datum och vice versa. Annars får du väl skippa årtiondet:
50401230.155 om klockan är 23:01:55 2015-04-01.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Nu ska ni få se på grejer!

Jag har faktiskt och äntligen lyckats tidsstämpla mina grejer som jag ville :D

Det var inte helt lätt kan jag meddela.

Speciellt för att jag ville att första samplet alltid skulle börja på noll.

Jag fick jätte-huvudbry för hur jag skulle fixa det.

I huvet var det enkelt, det är ju liksom bara att dra av tiden vid första samplet och sedan lägga på det antalet sekunder det dröjer till nästa värde (för antalet sekunder och inte nån menlös räknare är vad som duger).

Men det onaturliga och sugiga programmeringsspråket gjorde detta enkla så oerhört komplicerat att jag var nära att ge upp.

Nåväl, här kommer bevisen på min ynkliga framgång :)

MVH/Roger
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Spisblinkaren 2 april 2015, 13:25:08, redigerad totalt 1 gång.
ronnylov
Inlägg: 987
Blev medlem: 23 februari 2012, 12:06:19
Ort: Borås

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av ronnylov »

Kom plötsligt på tanken att du skulle kunna skapa en filmapp för varje år och varje månad så kan du köra med ditt format på filnamnen men automatiskt skapa en ny mapp för lagring varje ny månad.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Tack för att du försöker hjälpa mig men jag tror jag kör på utstakat spår:

Den här är rolig :D

Men oj vad massa små löjliga problem det dyker upp när man programmerar.

Försökte skapa csv-filer istället för txt-filer.

Csv står för Comma Separated Value.

Allt för att enklare kunna plotta värdena.

Det visade sig dock inte gå, trots komma mellan värdena, så nu kör jag med txt-filer istället där man måste tala om för typ Excel hur den skall hantera värdena.

Min gamla hederliga Excel-97 promptar bara om man försöker öppna en txt-fil och det enda man behöver göra är att tala om vad som begränsar värdena (blanksteg i mitt fall).

MVH/Roger
PS
Sen har jag tydligen fått ett problem vad beträffar polling.

Jag har alltså en knapp (newUser).

När man trycker på den skall en ny fil skapas.

Det gör det.

Problemet just nu är bara att det skapas en fil både när jag trycker och släpper.

Jag har alltså en rutin där knappstatus först läses, sedan delay 500ms, sedan läses den igen.

Sen har jag ett villkor som jämför vad jag kallar "stat" med "dyn" och om dom skiljer sig (!=) så skall en ny fil skapas.

Innan hade jag en rutin som bara jämförde med logiskt noll (knappen är aktivt låg) men då märkte jag att hållandes knapp intryckt gav flera filer.

Med ovanstående variant får jag dock bara två filer (en vid tryck och en vid släpp).

Känns som om att jag måste ta till interupt för få ihop det här.

Men jag vet knappt vad interuptrutiner är :D
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
gunnerfeldt
Inlägg: 87
Blev medlem: 29 november 2010, 00:32:55

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av gunnerfeldt »

Det kanske inte är det du är ute efter men för att trigga på flank så brukar jag (och säkert många med mig) göra så här:
Om du lagrar knapptryckningar i en global eller static så kan du skifta vänster och sedan lägga till input pinnen som lägsta bit.

Då kan man maska ut 0b11 och trigga vid 0b01 för uppgående flank ... eller längre mask om man vill debounca.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Tack gunnerfeldt för ditt bidrag!

Dock skrattar jag mest åt min egen dumhet för jag fattar nada :D

Det måste gå att fixa nåt vettigt utan interupt-komplikationen!

Jag vägrar ge mig på den punkten!

Polling regerar :D

MVH/Roger
PS
Vart har du varit i 5 år? :)
gunnerfeldt
Inlägg: 87
Blev medlem: 29 november 2010, 00:32:55

Hur använda Arduino UNO för att sampla och lägga i databas?

Inlägg av gunnerfeldt »

Äsch. Det är svårt att veta vilken nivå man ska förklara på. Jag brinner för det här med knappar, jag kan inte hålla mig :-)

Jag försöker bryta ner det i bitar (ursäkta skämtet).
Om detta inte intresserar dig så kan du ignorera denna post. Kanske finns det någon annan knappfetischist därute som blir glad.

Ok.
Om du redan har ett delay i din loop och inte planerar att utöka koden rejält så blir det ungefär samma effekt som en interrupt.

Vad jag försökte förklara var en lösning där EN knapptryckning endast registreras som ETT tryck. Alltså när input pinnen växlas från det "statiska" till det "aktiva", eller "dynamiska" som du kallade det.

Tänk ett pärlband med svarta och vita pärlor som läggs på rad vid varje läsning. Vit för icke nertryckt, svart för nertryckt. Det du behöver leta efter då är en sekvens av TVÅ pärlor där första vit och andra svart. Alla andra kombinationer räknas som icke nertryckt. Ok?

Detta är bra för att det går att utöka lätt om du vill ha större precision.
Låt säga att du vill läsa knappen i en väldigt snabb loop. 100kHz t.ex.
Då är det lätt att få kontaktstudsar. En så kallad bounce effekt. Där kontaktelementen glappar till några gånger vid till och av.
Detta skulle då ge ett pärlband av först en massa vita(statiska) pärlor och sedan - när knappen trycks ner - ett gäng vita och svarta huller om början för att sedan landa i bara svarta.
Då min vän, zoomar man ut och letar efter en rad som ser ut så här tex:
vit-svart-svart-svart-svart-svart-svart-svart
Den nervösa studsningen har då förhoppningsvis passerat och man kan tolka detta som en nertryckt knapp.

Eftersom jag valde 8 pärlor i mitt synfält så har jag gjort en 8 bitars "debounce" funktion. Ryms bra i en byte.

Kommer inte ihåg vilket språk du skriver men i C ser det ut så här:

static unsigned char debounceByte = 0; // vårt pärlband
unsigned char debMask = 0xFF; // vi begränsar synfältet till en byte, 8 bitar
unsigned char debMatch = 0x7F; // en vit till höger, resten svarta

// gör plats för en ny pärla till höger genom att skifta pärlbandet till vänster. Lägg sedan till input pinnen som 1 eller 0. 1 är alltså biten längst till höger i byten(pärlbandet). Så kallad LSB (least significant bit)
debounceByte = (debounceByte << 1) + inputPin;

// kolla om pärlbandet matchar vårt mönster
if((debounceByte & debMask) == debMatch) {
// booyaa!!
}

Vill man ha ännu bättre responskänsla tar man en tvåbitars match vid nertryckt samt en 8 bitars på uppsläppt. Sedan lägger dessa i ytterligare en static och letar efter en två bitars == 0x1 i den. Då har man supersnabb superlösning!!

Som sagt. Ursäkta malandet ... nu tar vi helg !!
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Tack för din kluriga lösning men tänk om knapparna istället vore två-läges...

Glad Påsk!

MVH/Roger
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
gunnerfeldt
Inlägg: 87
Blev medlem: 29 november 2010, 00:32:55

Hur använda Arduino UNO för att sampla och lägga i databas?

Inlägg av gunnerfeldt »

Aldrig testat en sådan lösning. Jag har testat flerpoliga parallella med gott resultat. Men .. det hör till en annan era. Nuförtin är det billiga kinaswitchar och fiffig kod som gäller. På gott och ont.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Du menar som ett slags tekniskt mode?

Dvs ut med gamla och mångt enklare lösningar bara för att de tillhör en annan era?

Låter rent utsagt löjligt i mina öron.

MVH/Roger
gunnerfeldt
Inlägg: 87
Blev medlem: 29 november 2010, 00:32:55

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av gunnerfeldt »

Löjligt kanske för vissa. Dyrt för andra. En bra switch med analog debounce kostar skjortan.
Mikrokontrollers utveckling i prestanda och pris sker i rasande fart.
"Enklare lösning" är inte helt objektivt. För mig är en bra algoritm enklare än en analog krets.
Man får välja själv helt enkelt. Är det kommersiell produkt blir det dock snävare val.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

Mitt program fungerar nu hyfsat tillfredsställande.

Jag fick dock hjälp av en kollega med att koda upp för flank vad gäller tryckknappar för som amatören jag kodade fick jag antingen nya filer löpande om jag bara höll inne knappen (newUser, som då genererar ny fil) eller så fick jag två nya filer.

Skillnaden i dessa fall var att först kände jag bara av "nedtryckt" dvs 0 (och fick alltså flera filer om jag höll inne knappen för länge), sedan kände jag av "skillnaden" mellan om den var nedtryckt innan loopen började (eller snarare delayet) och efter delayet.

Men min mycket kompetenta kollega förklarade att den mest ligger i delayet så därför blir det alltid två filer (en när man trycker och en när man släpper).

Iom att jag har så lång fördröjning på min loop som 1100ms så räckte det emellertid med flank-avkänning och inte "mjukvaru-kondensator" (som en annan kollega tipsade mig om) vad gäller kontaktstudsfiltrering.

Är f.ö lite stolt över hur kompakt och snyggt huvudprogrammet blev :)

Bara några villkor ihop med ett gäng funktioner.

Bifogar kodningen av huvudprogrammet.

Mycket nöje :)

MVH/Roger

Kod: Markera allt

void loop () {
 sensor_stat=analogRead(0);
 delay(1100);
 
  newUser_dyn=digitalRead(2);
  if ((newUser_dyn==0) && (newUser_dyn != newUser_stat)){
     newUser();
  }
 newUser_stat=newUser_dyn; 
 
  cal_dyn=digitalRead(3);
  if ((cal_dyn==0) && (cal_dyn != cal_stat)){
    Cal();
  }
 cal_stat=cal_dyn; 
  
 sensor_dyn=analogRead(0);
 if (abs(sensor_dyn-sensor_stat)>1){
   Sensor();
  }
}
Senast redigerad av Spisblinkaren 18 april 2015, 23:55:56, redigerad totalt 1 gång.
Användarvisningsbild
Spisblinkaren
EF Sponsor
Inlägg: 12990
Blev medlem: 13 december 2012, 21:41:43

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Inlägg av Spisblinkaren »

För att göra det mer komplett kommer här de tre funktionernas kodning:

MVH/Roger

Kod: Markera allt

// newUser enables new data sequence input
void newUser(){
    Serial.println("Closing File");
    myFile.close();
    getFileName();
    Serial.println(&filename);
    myFile = SD.open(&filename, FILE_WRITE);
    ackBlink();
    j=0;//resets sample counter 
    maxForce=0; //resets maxForce 
}

// Cal calibrates sensor to actual reference force (5kg)
void Cal(){              
  tempCal=analogRead(0);//put 5kg of force before pressing Cal button
  while ((tempCal>5) || (tempCal<5)) { //tune as closely as you can
    if (tempCal>5) highBlink();//blinks green LED ._.___
    if (tempCal<5) lowBlink();//blinks green LED .___
    delay(500);//tune pot on sensor
    tempCal=analogRead(0);
  }
  calBlink();//turns green LED on
  maxForce=0; //resets maxForce
}

void Sensor(){
  displayTmp(sensor_dyn);
  //dataMonitor(sensor_dyn);
  DateTime now = rtc.now();
  j=j++;
  if (j==1) {
  offSet=now.minute()*60 + now.second(); 
  Seconds=0;
  }
  if (j>1) {
    Seconds=now.minute()*60 + now.second() - offSet;
  }
  myFile.print(Seconds);
  myFile.print(' ');
  //myFile.print(',');//Do not work for csv...
  myFile.println(sensor_dyn);
}
Skriv svar