Arduino som övervakar båtmotorn
Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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.
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.
Re: Arduino som övervakar båtmotorn
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:
och här är displayen under gång:
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
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: Arduino som övervakar båtmotorn
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.
Första försöket med konstiga varvtalsvärden.
Slutlig funktion.