Arduino som övervakar båtmotorn

Planering och tankar kring eventuella framtida projekt.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Arduino som övervakar båtmotorn

Inlägg av BjörnO »

Tack, jag testade med volatile och tog bort övervarvsvarningen och fick betydligt stadigare avläsning. Nu tetsde jag bara vid bryggan och varvade i friläge. Får se om jag kan köra en "live" test i morgon.
Jag ska ta hänsyn till förslagen. dessutom ska jag trigga på negativ flank i stället för positiv. Tror att avläsningen blir renare så.
Men en variant med Timer library är också lockande. En interrupt som bara räknar pulser och timer på 6 sekunder sedan är det bara att multiplicera värdet med 10 för att få RPM. Båtmotorn ändrar inte varvtalet så ofta/fort.
Den första varianten testade jag genom att låta en annan Arduino vara funktionsgenerator och matat ut olika frekvenser.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: Arduino som övervakar båtmotorn

Inlägg av BjörnO »

Nytt test med även datorn i båten så att jag kunde ändra programmet och testa direkt i drift.
Min gamla variant fungerar tillräckligt bra så den får bli den slutliga. Det slutliga testet får bli när jag kör båten från hamnen till varvet för upttagning, därefter får det bli "torrsim" igen.
Varianten att räkna pulser under 6 sekunder och multiplicera med 10 gav sämre värden. Förmodligen får man med sig en del extra pulser pga. störningar.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino som övervakar båtmotorn

Inlägg av Icecap »

Nu är det ju viktigt att pulserna är störningsfria men OM man inte klarar det kan man - om man använder Capture-mätning - sortera bort mätningar som går utanför ett visst område. Man kan såklart också filtrera på så vis att om den nya mätningen avviker från de (t.ex.) 3 förra (legala) mätningar kastas mätningen.

Beroende på vilken typ signal givaren ger kan man även kolla pulslängd och se om den är för kort eller inte. Allt detta kräver dock att man måste göra en del eget med interrupt, Capture-enhet osv så det kan bli en del jobb - men sedan får man ett mycket stabilt system som reagerar snabbt och exakt.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: Arduino som övervakar båtmotorn

Inlägg av BjörnO »

Magnetsensorn innehåller redan pulsformande kretsar så utsignalen bör vara ganska ren. Men på vägen från motorn till förarplatsen går signalen parallellt med lite andra ledningar. Ska testa med partvinnad och kanske någon konding. Det är ingen hög frekvens, under 3000/minut, men jag är osäker på pulskvoten.
Jag filtrerar bort för höga värden så jag får ett ganska bra värde. Egentligen skulle jag kunna räkna fram ett vettigt medelvärde, men jag borde räkna på pulsvärdet i stället för RPM-värdet.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino som övervakar båtmotorn

Inlägg av Icecap »

Att partvinna fungerar inte om det är enkelfas signal. Är det enkelfas ska du använda skärmad kabel och då ska det vara matningen till sensorn, GND + signal som ska vara i den kabel som sedan skärmas.

Men en <signal> -> RS422 Tx -> partvinnad -> RS422 Rx ger en ganska störtålig överföring.

Man kan skapa och läsa RS422 signaler med de vanliga RS422/RS485 drivkretsar.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: Arduino som övervakar båtmotorn

Inlägg av BjörnO »

Nu fungerar det bra. Dessutom har jag lärt mig något om hur man kan använda en Arduino. När jag började hade jag tänkt bygga med "vanliga" IC-kretsar och transistorer, men detta gick ju lätt. :D
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av BjörnO 27 september 2015, 22:20:33, redigerad totalt 2 gånger.
Användarvisningsbild
Icecap
Inlägg: 26147
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Arduino som övervakar båtmotorn

Inlägg av Icecap »

Och HUR löste du det? Eller menar du att det ska vara hemligt?

Ja, jag ser att det ska till någon QuickTime-plugin för att se vad det nu är du har lagt in, jag kommer dock inte att installera detta.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: Arduino som övervakar båtmotorn

Inlägg av BjörnO »

Det beror nog på att jag använder paddan till att skriva inlägg. Ska se om jag kam gräva fram en dator och göra om inlägget.

Nu sitter jag med en dator.

Lösningen blev sensorer i motorrummet hopkopplade i en liten apparatlåda till en i2c-buss fram till förarplatsen. Arduinon i en större apparatlåda i ett stuvfack bredvid förarplatsen och slutligen en display på instrumentbrädan i en låda som från början hörde till en golvlampa.

Så här blev den slutliga koden:

Kod: Markera allt

#include <DallasTemperature.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

OneWire sensorBus(4); //sensors connected to digital pin 4
DallasTemperature sensors(&sensorBus);

// Connect the LCD with SDA to analog pin 4 and SCL to analog pin 5
// set the LCD address to 0x27 (check the address)
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

volatile unsigned long previousMillis = 0;
volatile unsigned long currentMillis = 0;
volatile unsigned long result = 0;
unsigned long rpm = 0;

DeviceAddress Oiltemp =
{
  0x28, 0xFF, 0x18, 0x53, 0x02, 0x15, 0x04, 0x67
};
DeviceAddress Watertemp =
{
  0x28, 0xFF, 0x58, 0x54, 0x02, 0x15, 0x04, 0x08
};
DeviceAddress Exhausttemp =
{
  0x28, 0xFF, 0x07, 0x9F, 0x02, 0x15, 0x03, 0xDC
};

int alarm = 7; //the pin number of the alarm

float tempC;

void setup()
{
  // Read and display sensor addresses
  delay(1000);
  Serial.begin(9600);
  sensors.begin();

  lcd.begin(16, 2);  // initialize the lcd for 16 chars 2 lines, turn on backlight
  // ------- Quick 3 blinks of backlight  -------------
  for(int i = 0; i < 3; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on

  // 3 beeps with alarm
  pinMode(alarm, OUTPUT);
  for(int i = 0; i < 3; i++)
  {
    digitalWrite(alarm, HIGH);
    delay(250);
    digitalWrite(alarm, LOW);
    delay(250);
  }

  // NOTE: Cursor Position: (CHAR, LINE) start at 0
  lcd.setCursor(0, 0); //Start at character 0 on line 0
  lcd.print("Varvtal");  //rad 1
  lcd.setCursor(0, 1);
  lcd.print("Temperatur");  //rad 2
  delay(5000);

  attachInterrupt (0, inputPulse, FALLING);  //pulse imput from rev sensor (digital pin 2)

  sensors.setResolution(Oiltemp, 10);
  sensors.setResolution(Watertemp, 10);
  sensors.setResolution(Exhausttemp, 10);

  lcd.clear();
}

void loop()
{

  sensors.requestTemperatures();
  lcd.setCursor(0, 1); //print temp on display
  lcd.print("Water:   ");
  printTemperature(Watertemp);

  if (tempC > 70) //alarm on high temp.
  {
    digitalWrite(alarm, HIGH); //alarm signal output
    lcd.setCursor(0, 0);
    lcd.print(" WARNING TEMP.  ");
    delay(1000);
  }
  else
    digitalWrite(alarm, LOW);


  lcd.setCursor(0, 1);
  lcd.print("Oil:     ");
  printTemperature(Oiltemp);

  if (tempC > 100) //alarm on high temp.
  {
    digitalWrite(alarm, HIGH); //alarm signal output
    lcd.setCursor(0, 0);
    lcd.print(" WARNING TEMP.  ");
    delay(1000);
  }
  else
    digitalWrite(alarm, LOW);

  lcd.setCursor(0, 1);
  lcd.print("Exhaust: ");
  printTemperature(Exhausttemp);

  if (tempC > 70) //alarm on high temp.
  {
    digitalWrite(alarm, HIGH); //alarm signal output
    lcd.setCursor(0, 0);
    lcd.print(" WARNING TEMP.  ");
    delay(1000);
  }
  else
    digitalWrite(alarm, LOW);
}

void printTemperature(DeviceAddress deviceAddress) //read sensors and print result
{
  // Read temp
  float tempC = sensors.getTempC(deviceAddress);
  // Print temp
  lcd.print(tempC);
  lcd.print(" C ");

  // Print RPM
  rpm = 60000 / result;

  if (rpm < 3000) //filter out invalid readings
  {

    lcd.setCursor(4, 0);
    lcd.print(rpm); //print rpm on display
    lcd.print(" rpm  ");

  }

  delay(3000);

}// End printTemperature


void inputPulse() //interrupt - pulse input digital pin 2
{
  currentMillis = millis();                        //read millis
  result = currentMillis - previousMillis;  //rpm
  previousMillis = currentMillis;                  //prepare for next pulse
}

och här är displayen under gång:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: Arduino som övervakar båtmotorn

Inlägg av BjörnO »

För de som inte kan se quictime-filmer har jag lagt in i Youtube.
Första försöket med konstiga varvtalsvärden.

Slutlig funktion.
Skriv svar