public static void PacketGroundSensor(Packet Packet) { if (Packet == null || Packet.Data == null || Packet.Data.Payload == null || Packet.Data.Payload.Length != 40) { Log.Output(Log.Severity.WARNING, Log.Source.NETWORK, "Ground sensor packet invalid. Discarding. Length: " + Packet?.Data?.Payload?.Length); return; } DateTime Timestamp = DateTime.Now; int UVLight = UtilData.ToInt(UtilMain.SubArray(Packet.Data.Payload, 0, 4)); float AirQuality = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 4, 4)); float SoilMoist = UtilData.ToFloat(UtilMain.SubArray(Packet.Data.Payload, 8, 4)); uint ThermocoupleData = UtilData.ToUInt(UtilMain.SubArray(Packet.Data.Payload, 12, 4)); double AtmoTemp = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 16, 8)); double AtmoPres = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 24, 8)); double AtmoHumid = UtilData.ToDouble(UtilMain.SubArray(Packet.Data.Payload, 32, 8)); UV.Data.Add(new Datum <int>(Timestamp, UVLight)); AirPollution.Data.Add(new Datum <float>(Timestamp, AirQuality)); SoilMoisture.Data.Add(new Datum <float>(Timestamp, SoilMoist)); ThermoExt.Data.Add(new Datum <float>(Timestamp, MAX31855.ConvertExternalFromRaw(ThermocoupleData))); ThermoInt.Data.Add(new Datum <float>(Timestamp, MAX31855.ConvertInternalFromRaw(ThermocoupleData))); AirTemp.Data.Add(new Datum <double>(Timestamp, AtmoTemp)); AirPressure.Data.Add(new Datum <double>(Timestamp, AtmoPres)); AirHumidity.Data.Add(new Datum <double>(Timestamp, AtmoHumid)); }
internal static void TestSPI() { IDigitalOut CS_Thermo = new DigitalOutPi(7); MAX31855 Thermo = new MAX31855(new SPIBusPi(0), CS_Thermo); Log.SetSingleOutputLevel(Log.Source.SENSORS, Log.Severity.DEBUG); for (int i = 0; i < 100; i++) { Thermo.UpdateState(); Log.Output(Log.Severity.DEBUG, Log.Source.SENSORS, "Thermocouple Data, Faults: " + string.Format("{0:G}", Thermo.GetFaults()) + ", Internal: " + Thermo.GetInternalTemp() + ", External: " + Thermo.GetExternalTemp() + " (Raw: " + Thermo.GetRawData() + ")"); Thread.Sleep(500); } }
internal static void TestSPI() { BBBPinManager.AddMappingsSPI(BBBPin.P9_21, BBBPin.NONE, BBBPin.P9_22); BBBPinManager.AddMappingSPI_CS(BBBPin.P9_12); BBBPinManager.ApplyPinSettings(RoverMain.ApplyDevTree); IDigitalOut CS_Thermo = new DigitalOutBBB(BBBPin.P9_12); MAX31855 Thermo = new MAX31855(SPIBBB.SPIBus0, CS_Thermo); Log.SetSingleOutputLevel(Log.Source.SENSORS, Log.Severity.DEBUG); for (int i = 0; i < 100; i++) { Thermo.UpdateState(); Log.Output(Log.Severity.DEBUG, Log.Source.SENSORS, "Thermocouple Data, Faults: " + string.Format("{0:G}", Thermo.GetFaults()) + ", Internal: " + Thermo.GetInternalTemp() + ", External: " + Thermo.GetExternalTemp() + " (Raw: " + Thermo.GetRawData() + ")"); Thread.Sleep(500); } }
public void TestDataConvert() { // External (Thermocouple) temperature // | Thermocouple |R|F| Internal |R|Flt| Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b1111_0000_0110_00_0_0_0000_0000_0000_0_000), -250F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b1111_1111_1111_00_0_0_0000_0000_0000_0_000), -1F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b1111_1111_1111_11_0_0_0000_0000_0000_0_000), -0.25F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b0000_0000_0000_00_0_0_0000_0000_0000_0_000), 0F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b0000_0001_1001_00_0_0_0000_0000_0000_0_000), 25F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b0000_0110_0100_11_0_0_0000_0000_0000_0_000), 100.75F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b0011_1110_1000_00_0_0_0000_0000_0000_0_000), 1000F); Assert.AreEqual(MAX31855.ConvertExternalFromRaw(0b0110_0100_0000_00_0_0_0000_0000_0000_0_000), 1600F); // Internal (calibration) temperature // | Thermocouple |R|F| Internal |R|Flt| Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_1100_1001_0000_0_000), -55F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_1110_1100_0000_0_000), -20F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_1111_1111_0000_0_000), -1F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_1111_1111_1111_0_000), -0.0625F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_0000_0000_0000_0_000), 0F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_0001_1001_0000_0_000), 25F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_0110_0100_1001_0_000), 100.5625F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(0b0000_0000_0000_00_0_0_0111_1111_0000_0_000), 127F); // Fault detection // | Thermocouple |R|F| Internal |R|Flt| Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_0_0000_0000_0000_0_000), MAX31855.Fault.NONE); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_1_0000_0000_0000_0_100), MAX31855.Fault.SHORT_VCC); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_1_0000_0000_0000_0_010), MAX31855.Fault.SHORT_GND); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_1_0000_0000_0000_0_001), MAX31855.Fault.NO_THERMOCOUPLE); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_1_0000_0000_0000_0_111), (MAX31855.Fault.SHORT_VCC | MAX31855.Fault.SHORT_GND | MAX31855.Fault.NO_THERMOCOUPLE)); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_1_0000_0000_0000_0_101), (MAX31855.Fault.SHORT_VCC | MAX31855.Fault.NO_THERMOCOUPLE)); Assert.AreEqual(MAX31855.ConvertFaultFromRaw(0b0000_0000_0000_00_0_0_0000_0000_0000_0_111), MAX31855.Fault.NONE); // The fault bit is not set, so any faults should be ignored. // Real data test // | Thermocouple |R|F| Internal |R|Flt| uint Data = 0b0000_0001_1010_10_0_0_0001_0111_0111_0_000; Assert.AreEqual(MAX31855.ConvertExternalFromRaw(Data), 26.50F); Assert.AreEqual(MAX31855.ConvertInternalFromRaw(Data), 23.4375F); }
public void Initialize() { this.ADC = new TLV2544(this.SPI0, new DigitalOutPi(16));// { TraceLogging = true }; TLV2544.Configuration Config = TLV2544.DefaultConfig; Config.VoltageRef = TLV2544.VoltageReference.INTERNAL_2V; Config.ConversionClockSrc = TLV2544.ConversionClockSrc.INTERNAL; Config.UseEOCPin = true; //Config.UseLongSample = true; this.ADC.Configure(Config); this.Thermocouple = new MAX31855(this.SPI0, new DigitalOutPi(18)); this.UVLight = new VEML6070(this.I2C1); this.Atmospheric = new BME280(this.I2C1); this.Atmospheric.Configure(); this.Atmospheric.ChangeMode(BME280.Mode.NORMAL); this.AirQuality = new MQ135(this.ADC.Inputs[0], 3300, 6400, 4.6); this.SoilMoisture = new VH400(this.ADC.Inputs[1]); this.TakeReadings = true; }