Пример #1
0
        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));
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
        }