public static void TestSpi(ArduinoBoard board) { const double vssValue = 5; // Set this to the supply voltage of the arduino. Most boards have 5V, some newer ones run at 3.3V. SpiConnectionSettings settings = new SpiConnectionSettings(0, 10); using (var spi = board.CreateSpiDevice(settings)) using (Mcp3008 mcp = new Mcp3008(spi)) { Console.WriteLine("SPI Device open"); while (!Console.KeyAvailable) { double vdd = mcp.Read(5); double vss = mcp.Read(6); double middle = mcp.Read(7); Console.WriteLine($"Raw values: VSS {vss} VDD {vdd} Average {middle}"); vdd = vssValue * vdd / 1024; vss = vssValue * vss / 1024; middle = vssValue * middle / 1024; Console.WriteLine($"Converted values: VSS {vss:F2}V, VDD {vdd:F2}V, Average {middle:F2}V"); Thread.Sleep(200); } } Console.ReadKey(); }
public void InvalidChannel_Throws() { using (Mcp3008 adc = CreateAdc()) { Assert.Throws <ArgumentOutOfRangeException>(() => adc.Read(-1)); Assert.Throws <ArgumentOutOfRangeException>(() => adc.Read(8)); } }
public void PWM_DutyCycleIsSetCorrectly() { using (PwmChannel pwm = CreatePwmChannel(dutyCycle: 0)) using (Mcp3008 adc = CreateAdc()) { for (int n = 0; n < 2; n++) { for (int i = 0; i <= 10; i++) { pwm.DutyCycle = i * 0.1; // Settling time is ~1.1ms (when going from GND to max) // R=4.7k ohm // C=0.1uF // f=10k Hz // peak to peak is ~0.18V (5.5% VCC) // in this scenario is 2 * error Thread.Sleep(3); int expected = (int)Math.Round(pwm.DutyCycle * 1023.0); AdcValueAround(expected, adc.Read(0)); } } } }
private static void SpiRaspiTestWithHardwareCs(Board raspi) { Console.WriteLine("MCP3008 SPI Hardware CS Test"); // Runs a test communication against an MCP3008. The CS pin 8 is expected to be controlled by the driver, as // we specify it here (SPI0_CE0 is BCM pin 8 on ALT0) SpiConnectionSettings spiSettings = new SpiConnectionSettings(0, 0) { ChipSelectLineActiveState = PinValue.Low }; using SpiDevice dev = raspi.CreateSpiDevice(spiSettings); using Mcp3008 mcp = new Mcp3008(dev); while (!Console.KeyAvailable) { for (int i = 0; i < 8; i++) { int value = mcp.Read(i); Console.WriteLine($"Channel {i} has value {value}."); Thread.Sleep(100); } Thread.Sleep(500); } Console.ReadKey(true); }
private static void SpiRaspiTestWithSoftwareCs(Board raspi) { Console.WriteLine("MCP3008 SPI Software CS Test"); // Runs a test communication against an MCP3008. The CS pin 8 is controlled explicitly by software (this binding // fails to have support for this) SpiConnectionSettings spiSettings = new SpiConnectionSettings(0, -1) { ChipSelectLineActiveState = PinValue.Low }; using SpiDevice dev = raspi.CreateSpiDevice(spiSettings); using Mcp3008 mcp = new Mcp3008(dev); using GpioController ctrl = raspi.CreateGpioController(); // Note that if we have only a single device attached to the SPI bus, we could just as well pull the CS line // hard to low, but this is to show the concept. ctrl.OpenPin(8, PinMode.Output); ctrl.Write(8, PinValue.High); while (!Console.KeyAvailable) { for (int i = 0; i < 8; i++) { ctrl.Write(8, PinValue.Low); int value = mcp.Read(i); ctrl.Write(8, PinValue.High); Console.WriteLine($"Channel {i} has value {value}."); Thread.Sleep(100); } Thread.Sleep(500); } Console.ReadKey(true); }
public int GetVolumeValue() { double value = _mcp3008.Read(0); value = value / 10.24; value = Math.Round(value); return((int)value); }
private async Task ReadAdc() { while (true) { int grillValue = _adc.Read(0, Mcp3008.InputConfiguration.SingleEnded); int probe1Value = _adc.Read(1, Mcp3008.InputConfiguration.SingleEnded); int probe2Value = _adc.Read(2, Mcp3008.InputConfiguration.SingleEnded); int probe3Value = _adc.Read(3, Mcp3008.InputConfiguration.SingleEnded); int probe4Value = _adc.Read(4, Mcp3008.InputConfiguration.SingleEnded); _grillResistances.Enqueue(CalculateResistanceFromAdc("grill", grillValue)); _probe1Resistances.Enqueue(CalculateResistanceFromAdc("probe1", probe1Value)); _probe2Resistances.Enqueue(CalculateResistanceFromAdc("probe2", probe2Value)); _probe3Resistances.Enqueue(CalculateResistanceFromAdc("probe3", probe3Value)); _probe4Resistances.Enqueue(CalculateResistanceFromAdc("probe4", probe4Value)); while (_grillResistances.Count > 100) { double temp; _grillResistances.TryDequeue(out temp); } while (_probe1Resistances.Count > 100) { double temp; _probe1Resistances.TryDequeue(out temp); } while (_probe2Resistances.Count > 100) { double temp; _probe2Resistances.TryDequeue(out temp); } while (_probe3Resistances.Count > 100) { double temp; _probe3Resistances.TryDequeue(out temp); } while (_probe4Resistances.Count > 100) { double temp; _probe4Resistances.TryDequeue(out temp); } await Task.Delay(TimeSpan.FromMilliseconds(10)); } }
public void SPI_Mcp3008CanRead() { using (Mcp3008 adc = CreateAdc()) { // We don't care about specific value for the first 5 channels for (int i = 0; i <= 4; i++) { Assert.InRange(adc.Read(i), MinAdc, MaxAdc); } // VCC Assert.InRange(adc.Read(5), MaxAdc - 5, MaxAdc); // GND Assert.InRange(adc.Read(6), MinAdc, MinAdc + 5); // Voltage divider with equal resistors (50% VCC) AdcValueAround(HalfAdc, adc.Read(7)); } }
public void ChangingFrequency_UpdatesDutyCycle() { // choice of frequencies is not random // 9k -> 20k makes sure that 0.5 duty cycle must be updated // otherwise it will go out of range in the driver (at least on Linux) // 9k is because DACs (or PWM + low pass filter) // settling time calculation was done for 10k and 9k was close enough // to not change calculations significantly using (PwmChannel pwm = CreatePwmChannel(9000)) using (Mcp3008 adc = CreateAdc()) { // Let the analog value to settle Thread.Sleep(3); AdcValueAround(HalfAdc, adc.Read(0)); pwm.Frequency = 20000; Thread.Sleep(3); AdcValueAround(HalfAdc, adc.Read(0)); } }
static void Main(string[] args) { Console.WriteLine("Hello Mcp3008!"); // This sample implements two different ways of accessing the MCP3008. // The SPI option is enabled in the sample by default, but you can switch // to the GPIO bit-banging option by switching which one is commented out. // The sample uses local functions to make it easier to switch between // the two implementations. // SPI implementation Mcp3008 GetMcp3008WithSpi() { Console.WriteLine("Using SPI protocol."); var connection = new SpiConnectionSettings(0, 0) { ClockFrequency = 1000000, Mode = SpiMode.Mode0 }; var spi = new UnixSpiDevice(connection); var mcp3008 = new Mcp3008(spi); return(mcp3008); } // GPIO (via bit banging) implementation Mcp3008 GetMcp3008WithGpio() { Console.WriteLine("Using GPIO pins."); var mcp3008 = new Mcp3008(18, 23, 24, 25); return(mcp3008); } Mcp3008 mcp = GetMcp3008WithSpi(); // Uncomment next line to use GPIO instead. // Mcp3008 mcp = GetMcp3008WithGpio(); using (mcp) { while (true) { double value = mcp.Read(0, Mcp3008.InputConfiguration.SingleEnded); value = value / 10.24; value = Math.Round(value); Console.WriteLine(value); Thread.Sleep(500); } } }
private async Task ReadAdc() { while (true) { int grillValue = _adc.Read(0); int probeValue = _adc.Read(1); _grillResistances.Enqueue(CalculateResistanceFromAdc(grillValue)); _probeResistances.Enqueue(CalculateResistanceFromAdc(probeValue)); while (_grillResistances.Count > 100) { double temp; _grillResistances.TryDequeue(out temp); } while (_probeResistances.Count > 100) { double temp; _probeResistances.TryDequeue(out temp); } await Task.Delay(TimeSpan.FromMilliseconds(10)); } }
private async Task ReadAdc() { while (true) { int probeValue = _adc.Read(0, Mcp3008.InputConfiguration.SingleEnded); _probeResistances.Enqueue(CalculateResistanceFromAdc(probeValue)); while (_probeResistances.Count > 100) { _probeResistances.TryDequeue(out double resistance); } await Task.Delay(TimeSpan.FromMilliseconds(10)); } }
public void Read() { var hardwareSpiSettings = new SpiConnectionSettings(0, 0) { ClockFrequency = 1000000 }; using SpiDevice spi = SpiDevice.Create(hardwareSpiSettings); using Mcp3008 mcp = new Mcp3008(spi); while (true) { double value = mcp.Read(0); value = value / 10.24; value = Math.Round(value); Console.WriteLine($"{value}%"); Thread.Sleep(500); } }
static void Main(string[] args) { var hardwareSpiSettings = new SpiConnectionSettings(0, 0) { ClockFrequency = 1000000 }; using (SpiDevice spi = new SoftwareSpi(clk: 6, miso: 23, mosi: 5, cs: 24)) // For hardware implementation replace it with following // using (SpiDevice spi = SpiDevice.Create(hardwareSpiSettings)) using (Mcp3008 mcp = new Mcp3008(spi)) { while (true) { double value = mcp.Read(0); value = value / 10.24; value = Math.Round(value); Console.WriteLine($"{value}%"); Thread.Sleep(500); } } }
internal int Read(int v) { return(_adcConvertor.Read(0)); }
public static void Run(string[] args) { Console.WriteLine("Nusbio initialization"); var serialNumber = Nusbio.Detect(); if (serialNumber == null) // Detect the first Nusbio available { Console.WriteLine("Nusbio not detected"); return; } using (var nusbio = new Nusbio(serialNumber)) { Cls(nusbio); var halfSeconds = new TimeOut(500); /* Mcp300X - SPI Config gpio 0 - CLOCK gpio 1 - MOSI gpio 2 - MISO gpio 3 - SELECT */ ad = new Mcp3008(nusbio, selectGpio: NusbioGpio.Gpio3, mosiGpio: NusbioGpio.Gpio1, misoGpio: NusbioGpio.Gpio2, clockGpio: NusbioGpio.Gpio0); ad.Begin(); var analogTempSensor = new Tmp36AnalogTemperatureSensor(nusbio); analogTempSensor.Begin(); var analogMotionSensor = new AnalogMotionSensor(nusbio, 4); analogMotionSensor.Begin(); var lightSensor = new AnalogLightSensor(nusbio); lightSensor.AddCalibarationValue("Dark", 0, 100); lightSensor.AddCalibarationValue("Office Night", 101, 299); lightSensor.AddCalibarationValue("Office Day", 300, 400); lightSensor.AddCalibarationValue("Outdoor Sun Light", 401, 1000); lightSensor.Begin(); while(nusbio.Loop()) { if (halfSeconds.IsTimeOut()) { const int lightSensorAnalogPort = 7; const int motionSensorAnalogPort = 6; const int temperatureSensorAnalogPort = 5; ConsoleEx.WriteLine(0, 2, string.Format("{0,-20}", DateTime.Now, lightSensor.AnalogValue), ConsoleColor.Cyan); lightSensor.SetAnalogValue(ad.Read(lightSensorAnalogPort)); ConsoleEx.WriteLine(0, 4, string.Format("Light Sensor : {0} (ADValue:{1:000.000})", lightSensor.CalibratedValue.PadRight(18), lightSensor.AnalogValue), ConsoleColor.Cyan); analogTempSensor.SetAnalogValue(ad.Read(temperatureSensorAnalogPort)); ConsoleEx.WriteLine(0, 6, string.Format("Temperature Sensor: {0:00.00}C, {1:00.00}F (ADValue:{2:0000}) ", analogTempSensor.GetTemperature(AnalogTemperatureSensor.TemperatureType.Celsius), analogTempSensor.GetTemperature(AnalogTemperatureSensor.TemperatureType.Fahrenheit), analogTempSensor.AnalogValue), ConsoleColor.Cyan); analogMotionSensor.SetAnalogValue(ad.Read(motionSensorAnalogPort)); var motionType = analogMotionSensor.MotionDetected(); if (motionType == MotionSensorPIR.MotionDetectedType.MotionDetected || motionType == MotionSensorPIR.MotionDetectedType.None) { ConsoleEx.Write(0, 8, string.Format("Motion Sensor : {0,-20} (ADValue:{1:000})", motionType, analogMotionSensor.AnalogValue), ConsoleColor.Cyan); } } if (Console.KeyAvailable) { var k = Console.ReadKey(true).Key; if (k == ConsoleKey.C) { Cls(nusbio); } if (k == ConsoleKey.Q) { break; } Cls(nusbio); } } } Console.Clear(); }