Kapacitiv Sensor för flytande (12 / 14 steg)
Steg 12: Firmware
Programmering av barebone är ganska enkel. Allt du behöver är en Arduino Uno med mikrokontroller bort (det ser barebone som controller).
http://Arduino.cc/en/main/standalone
http://Arduino.cc/en/tutorial/ArduinoToBreadboard
Jag lödde ett huvud till 5V, marken, reset, rx och tx, så jag kan ansluta min sensor Arduino till en Arduino uno som har Atmega chip bort. Detta sätt kan jag programmera Arduino så jag skulle med några andra Arduino.
Du måste också installera capacitiveSensor biblioteket till Arduino IDE: http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense
Uppladdning firmware
Den inbyggda programvaran kan laddas i bilagor. CLS_Sensor_firmware är den firmware som ska laddas upp till den kapacitiva nivåsensorn. CLS_sensor_reader firmware kan laddas upp till en annan Arduino och används för att kommunicera med sensor. Läsaren Arduino måste anslutas till sensorn genom I2C, med 2 4k7ohm pull-up motstånd. I nästa steg kommer att förklaras alla kommandon som kan användas. Du kan också använda kodavsnitt från läsaren för att lägga till din egen kod, så kan du enkelt ställa in och läsa sensorn utan att behöva skriva funktioner själv.
Hur koden fungerar
Sensorn fungerar ganska rakt fram. Varje N sekunder det noterar tiden på millis() timern. Sedan börjar det 100 CapacitiveSensor cykler. Då mäter tid igen och subtraherar starttiden från sluttiden. Detta är rå värdet som sensorn jämför vätskenivån. Sensorn gör också en 0-255 värde och en avståndet i mm från raw värde, genom att jämföra den till de lägsta och högsta värde.
Värdena lagras i EEPROM att göra dem beständigt. När sensorn befogenheter upp, kommer det läsa värdena från EEPROM och börja mäta.
Sensorn har också en I2C linje att kommunicera med en master mikrokontroller. I2C adress sensorn är 42. Master kommunicerar med sensorn på följande sätt.
Master begäran exempel
Wire.beginTransmission(42); öppen kommunikation
Wire.write(30); berätta sensorn att göra (30 = skicka raw värde)
ytterligare skriver kan hända vid 60.
Wire.endTransmission(); avsluta överföringen
Wire.requestFrom(42,2); begära 2 byte från sensorn
IF(Wire.available()) / / om två byte mottogs
{
readValue [0] = Wire.read(); Läs den första byten
readValue [1] = Wire.read(); läsa byten
}
De kommandon som kan skickas till givaren är:
- 10: skicka 0-255 värde (returnerar 1 byte);
- 20: skicka avståndet i mm (returnerar 2 byte, först den höga byten, då den låg byten).
30: skicka raw åtgärd tid (returnerar 2 byte, först den höga byten, då den låg byten).
- 40: sätta sensor 0% värde (händer ingenting ytterligare);
- 50: sätta sensor 100% värde (händer ingenting ytterligare);
- 60: ställa in sensorn längd i den enhet som du vill ha (2 extra byte förväntas skickas som anger längden på sensorn din valda enheten)
- 70: läsa set lägre raw gränsvärdet (returnerar 2 byte (övre byte första) med lägre raw värde);
80: Läs det råa set övre gränsvärdet (returnerar 2 byte (övre byte första) med övre raw börvärde);
- 90: läsa set sensor längden (returnerar 2 byte (övre byte första) med ange längd i den enhet som du valt)
En viktig bugg i Wire.h
Wire biblioteket är har en nyfiken bugg i den vid 2 Arduino kommunikation. När befälhavaren har skickat en requestFrom till slav, kan slaven inte skicka tillbaka detta sätt:
byte sendValue1;
byte sendValue2;
Wire.write(sendValue1);
Wire.write(sendValue2);
I stället måste skicka tillbaka värdet på så sätt:
byte sendValue [2].
Wire.write(sendValue,2);
Om inte gjort detta sätt, master ser bara sista byte skickas, och alla andra ignoreras. Det kan tyckas enkelt, men frågan här kostade mig 3 dagar att räkna ut.
!!! 3 DAGAR!!!
(Om det vore möjligt skulle jag också använda kapital 3).