public SpiConnection(ProcessorPin clock, ProcessorPin ss, ProcessorPin?miso, ProcessorPin?mosi, Endianness endianness) { this.clock = clock; this.ss = ss; this.miso = miso; this.mosi = mosi; this.endianness = endianness; driver = new MemoryGpioConnectionDriver(); driver.Allocate(clock, PinDirection.Output); driver.Write(clock, false); driver.Allocate(ss, PinDirection.Output); driver.Write(ss, true); if (mosi.HasValue) { driver.Allocate(mosi.Value, PinDirection.Output); driver.Write(mosi.Value, false); } if (miso.HasValue) { driver.Allocate(miso.Value, PinDirection.Input); } }
static void Main(string[] args) { log4net.Config.XmlConfigurator.Configure(); ILog log = LogManager.GetLogger("GPIO"); log.Debug("Start"); PinConfiguration output = ConnectorPin.P1Pin36.Output().Name("Output1"); PinConfiguration[] outputs = new PinConfiguration[] { output }; GpioConnection gpio = new GpioConnection(outputs); //gpio.Open(); ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3); var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver; Mcp3008SpiConnection spi = new Mcp3008SpiConnection( driver.Out(adcClock), driver.Out(adcCs), driver.In(adcMiso), driver.Out(adcMosi)); IInputAnalogPin inputPin = spi.In(Mcp3008Channel.Channel0); gpio.Open(); ElectricPotential volts = ElectricPotential.FromVolts(0); while (!Console.KeyAvailable) { var v = referenceVoltage * (double)inputPin.Read().Relative; Console.WriteLine("{0} mV", v.Millivolts); if ((Math.Abs(v.Millivolts - volts.Millivolts) > 100)) { volts = ElectricPotential.FromMillivolts(v.Millivolts); Console.WriteLine("Voltage ch0: {0}", volts.Millivolts.ToString()); } gpio.Toggle("Output1"); Thread.Sleep(2000); } gpio.Close(); //bool bShutdown = false; //while(!bShutdown) //{ // gpio.Toggle(output); // log.Debug("Toggle output"); // Thread.Sleep(5000); //} }
public void Action(ActionBase baseAction, CancellationToken cancelToken, dynamic config) { RgbSimpleAction action = (RgbSimpleAction)baseAction; // note that config is dynamic so we cast the pin values to integer _state = new { state = "setup" }; var connection = new MemoryGpioConnectionDriver(); var pins = new GpioOutputBinaryPin[] { connection.Out((ProcessorPin)config.pins[0]), connection.Out((ProcessorPin)config.pins[1]), connection.Out((ProcessorPin)config.pins[2]) }; _state = new { state = "preDelay" }; if (cancelToken.WaitHandle.WaitOne(action.PreDelayMs)) { return; } for (int loopCounter = 0; loopCounter < action.LoopCount; ++loopCounter) { for (int i = 0; i < pins.Length; ++i) { _state = new { state = $"startValue_{loopCounter}" }; pins[i].Write(action.StartValues[i]); } // wait until possible cancel, but continue if cancelled to at least set end value _state = new { state = $"startDuration_{loopCounter}" }; cancelToken.WaitHandle.WaitOne(action.StartDurationMs); for (int i = 0; i < pins.Length; ++i) { // only output if it changes if (action.EndValues[i] != action.StartValues[i]) { _state = new { state = $"endValue_{loopCounter}" }; pins[i].Write(action.EndValues[i]); } } _state = new { state = $"endDuration_{loopCounter}" }; if (cancelToken.WaitHandle.WaitOne(action.EndDurationMs)) { return; } } _state = new { state = "postDelay" }; if (cancelToken.WaitHandle.WaitOne(action.PostDelayMs)) { return; } }
private void Run(string[] args) { Console.WriteLine("Press any key to exit..."); var connection = new MemoryGpioConnectionDriver(); var pcell = connection.InOut(ProcessorPin.Pin18); // // See: https://learn.adafruit.com/photocells/using-a-photocell#bonus-reading-photocells-without-analog-pins // while (!Console.KeyAvailable) { int reads = 0; pcell.AsOutput(); pcell.Write(false); System.Threading.Thread.Sleep(100); // allow to go low/false pcell.AsInput(); while (pcell.Read() == false) { ++reads; if (reads >= MaxReads) { break; } } // // Note: first couple of reads may be zero // string output = null; if (reads >= MaxReads) { output = $"Dark:\treads={reads}"; } else if (reads > 2500) { output = $"Medium:\treads={reads}"; } else { output = $"Light:\treads={reads}"; } Console.WriteLine(output); // wait in between reads System.Threading.Thread.Sleep(3000); } }
static void Main() { const ConnectorPin adcClock = ConnectorPin.P1Pin12; const ConnectorPin adcMiso = ConnectorPin.P1Pin16; const ConnectorPin adcMosi = ConnectorPin.P1Pin18; const ConnectorPin adcCs = ConnectorPin.P1Pin22; Console.WriteLine("MCP-3008 Sample: Reading temperature on Channel 0 and luminosity on Channel 1"); Console.WriteLine(); Console.WriteLine("\tClock: {0}", adcClock); Console.WriteLine("\tCS: {0}", adcCs); Console.WriteLine("\tMOSI: {0}", adcMosi); Console.WriteLine("\tMISO: {0}", adcMiso); Console.WriteLine(); ElectricPotential voltage = ElectricPotential.FromVolts(3.3); var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver; using (var adcConnection = new Mcp3008SpiConnection( driver.Out(adcClock), driver.Out(adcCs), driver.In(adcMiso), driver.Out(adcMosi))) using (var temperatureConnection = new Tmp36Connection( adcConnection.In(Mcp3008Channel.Channel0), voltage)) using (var lightConnection = new VariableResistiveDividerConnection( adcConnection.In(Mcp3008Channel.Channel1), ResistiveDivider.ForLowerResistor(ElectricResistance.FromKiloohms(10)))) { Console.CursorVisible = false; while (!Console.KeyAvailable) { var temperature = temperatureConnection.GetTemperature(); var resistor = lightConnection.GetResistance(); var lux = resistor.ToLux(); Console.WriteLine("Temperature = {0,5:0.0} °C\tLight = {1,5:0.0} Lux ({2} ohms)", temperature, lux, (int)resistor.Ohms); Console.CursorTop--; Thread.Sleep(1000); } } Console.CursorTop++; Console.CursorVisible = true; }
public static void Main(string[] args) { try { Console.WriteLine("Starting application"); var driver = new MemoryGpioConnectionDriver(); var lcdSpiSettings = new SpiConnectionSettings(); lcdSpiSettings.BitsPerWord = 8; lcdSpiSettings.MaxSpeed = 3932160; lcdSpiSettings.Delay = 0; lcdSpiSettings.Mode = SpiMode.Mode0; var adsSpiSettings = new SpiConnectionSettings(); adsSpiSettings.BitsPerWord = 8; adsSpiSettings.MaxSpeed = 3932160; adsSpiSettings.Delay = 0; adsSpiSettings.Mode = SpiMode.Mode1; var spi0 = new NativeSpiConnection("/dev/spidev0.0", lcdSpiSettings); var spi1 = new NativeSpiConnection("/dev/spidev0.1", adsSpiSettings); var lcdRegisterSelectGpio = ConnectorPin.P1Pin11; driver.In(lcdRegisterSelectGpio).Read(); var lcdRegisterSelectOut = driver.Out(lcdRegisterSelectGpio); var lcdResetGpio = ConnectorPin.P1Pin16; var lcdResetOut = driver.Out(lcdResetGpio); using (var deviceConnection = new Ti430BoostAds1118Connection(spi0, spi1, lcdRegisterSelectOut, lcdResetOut)) { deviceConnection.InitializeLcd(); deviceConnection.DisplayStringOnLcd(LcdLine.FirstLine, "Hello!"); Thread.Sleep(500); deviceConnection.ClearLcd(); var temp = deviceConnection.GetMeasurement(); deviceConnection.DisplayStringOnLcd(LcdLine.SecondLine, string.Format("TEMP: {0} C", temp)); } } catch (Exception ex) { Console.WriteLine("Exception caught!"); Console.WriteLine("Exception Message: {0}", ex.Message); Console.WriteLine("Stack Trace: {0}", ex.StackTrace); } }
public void Action(ActionBase baseAction, CancellationToken cancelToken, dynamic config) { LedBuzzerSimpleAction action = (LedBuzzerSimpleAction)baseAction; // note that config is dynamic so we cast the pin values to integer _state = new { state = "setup" }; var connection = new MemoryGpioConnectionDriver(); var pinLed = connection.Out((ProcessorPin)config.pinLed); var pinBuzzer = connection.Out((ProcessorPin)config.pinBuzzer); _state = new { state = "preDelay" }; if (cancelToken.WaitHandle.WaitOne(action.PreDelayMs)) { return; } for (int loopCounter = 0; loopCounter < action.LoopCount; ++loopCounter) { _state = new { state = $"startValue_{loopCounter}" }; pinLed.Write(action.StartValue); pinBuzzer.Write(action.StartValue); // wait until possible cancel, but continue if cancelled to at least set end value _state = new { state = $"startDuration_{loopCounter}" }; cancelToken.WaitHandle.WaitOne(action.StartDurationMs); // only output if it changes if (action.EndValue != action.StartValue) { _state = new { state = $"endValue_{loopCounter}" }; pinLed.Write(action.EndValue); pinBuzzer.Write(action.EndValue); } _state = new { state = $"endDuration_{loopCounter}" }; if (cancelToken.WaitHandle.WaitOne(action.EndDurationMs)) { return; } } _state = new { state = "postDelay" }; if (cancelToken.WaitHandle.WaitOne(action.PostDelayMs)) { return; } }
public void Initialize(ConnectorPin adcClock, ConnectorPin adcMiso, ConnectorPin adcMosi, ConnectorPin adcCs) { AdcClock = adcClock; AdcMiso = adcMiso; AdcMosi = adcMosi; AdcCs = adcCs; Console.WriteLine("MCP-3008 Sample: Reading temperature on Channel 0 and luminosity on Channel 1"); Console.WriteLine(); Console.WriteLine("\tClock: {0}", adcClock); Console.WriteLine("\tCS: {0}", adcCs); Console.WriteLine("\tMOSI: {0}", adcMosi); Console.WriteLine("\tMISO: {0}", adcMiso); Console.WriteLine(); _driver = new MemoryGpioConnectionDriver(); _adcConnection = new Mcp3008SpiConnection( _driver.Out(AdcClock), _driver.Out(AdcCs), _driver.In(AdcMiso), _driver.Out(AdcMosi)); }
public void InitGpio() { outputs = new PinConfiguration[] { Station1OutputPin.Output().Name("Station1"), Station2OutputPin.Output().Name("Station2"), Station3OutputPin.Output().Name("Station3"), Station4OutputPin.Output().Name("Station4"), Station5OutputPin.Output().Name("Station5"), Station6OutputPin.Output().Name("Station6"), Station7OutputPin.Output().Name("Station7"), Station8OutputPin.Output().Name("Station8"), PumpOperationPin.Output().Name("PumpOperation"), TankRelayOutputPin.Output().Name("TankRelay"), SpareOutputPin.Output().Name("Spare"), ResetRelayOutputPin.Output().Name("ResetRelay") }; connection = new GpioConnection(outputs); connection.Add(LowPressureFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("LowPressureFaultInput {0}", b ? "on" : "off"); bLowPressureFaultState = b; CreateEvent(EventType.IOEvent, string.Format("Input {0} on", LowPressureFaultInputPin.ToString())); CreateEvent(EventType.FaultEvent, string.Format("Low pressure fault {0}", b ? "detected" : "cleared")); })); connection.Add(HighPressureFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("HighPressureFaultInput {0}", b ? "on" : "off"); bHighPressureFaultState = b; CreateEvent(EventType.IOEvent, string.Format("Input {0} {1}", HighPressureFaultInputPin.ToString(), b ? "on" : "off")); CreateEvent(EventType.FaultEvent, string.Format("High pressure fault {0}", b ? "detected" : "cleared")); })); connection.Add(LowWellFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("LowWellFaultInput {0}", b ? "on" : "off"); bLowWellFaultState = b; CreateEvent(EventType.IOEvent, string.Format("Input {0} {1}", LowWellFaultInputPin.ToString(), b ? "on" : "off")); CreateEvent(EventType.FaultEvent, string.Format("Low well fault {0}", b ? "detected" : "cleared")); if (b) { dtFaultStartDate = DateTime.Now; Log(string.Format("Initializing timeout at {0}", dtFaultStartDate.ToString())); ChangeState(State.WaitForTimeout); } else { ChangeState(State.Monitor); } })); connection.Add(OverloadFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("OverloadFaultInput {0}", b ? "on" : "off"); bOverloadFaultState = b; })); //ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3); var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver; Mcp3008SpiConnection spi = new Mcp3008SpiConnection( driver.Out(adcClock), driver.Out(adcCs), driver.In(adcMiso), driver.Out(adcMosi)); spiInput = spi.In(Mcp3008Channel.Channel0); connection.Open(); }
static void Main(string[] args) { Console.WriteLine("GPIOTestHarness"); bool Station1OutputState = false; bool Station2OutputState = false; bool Station3OutputState = false; bool Station4OutputState = false; //var Output1 = Station1OutputPin.Output(); //var Output2 = Station2OutputPin.Output(); //var Output3 = Station3OutputPin.Output(); //var Output4 = Station4OutputPin.Output(); var pins = new PinConfiguration[] { Station1OutputPin.Output().Name("Output1"), Station2OutputPin.Output().Name("Output2"), Station3OutputPin.Output().Name("Output3"), Station4OutputPin.Output().Name("Output4") }; //var settings = new GpioConnectionSettings(); var connection = new GpioConnection(pins); var Input1 = LowPressureFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("LowPressureFaultInput {0}", b ? "on" : "off"); if (Station1OutputState != b) { connection.Toggle("Output1"); Station1OutputState = b; } }); connection.Add(Input1); var Input2 = HighPressureFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("HighPressureFaultInput {0}", b ? "on" : "off"); if (Station2OutputState != b) { connection.Toggle("Output2"); Station2OutputState = b; } }); connection.Add(Input2); var Input3 = LowWellFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("LowWellFaultInput {0}", b ? "on" : "off"); if (Station3OutputState != b) { connection.Toggle("Output3"); Station3OutputState = b; } }); connection.Add(Input3); var Input4 = OverloadFaultInputPin.Input().OnStatusChanged(b => { Console.WriteLine("OverloadFaultInput {0}", b ? "on" : "off"); if (Station4OutputState != b) { connection.Toggle("Output4"); Station4OutputState = b; } }); connection.Add(Input4); ElectricPotential referenceVoltage = ElectricPotential.FromVolts(3.3); var driver = new MemoryGpioConnectionDriver(); //GpioConnectionSettings.DefaultDriver; Mcp3008SpiConnection spi = new Mcp3008SpiConnection( driver.Out(adcClock), driver.Out(adcCs), driver.In(adcMiso), driver.Out(adcMosi)); IInputAnalogPin inputPin = spi.In(Mcp3008Channel.Channel0); connection.Open(); ElectricPotential volts = ElectricPotential.FromVolts(0); while (!Console.KeyAvailable) { var v = referenceVoltage * (double)inputPin.Read().Relative; if ((Math.Abs(v.Millivolts - volts.Millivolts) > 100)) { volts = ElectricPotential.FromMillivolts(v.Millivolts); Console.WriteLine("Voltage ch0: {0}", volts.Millivolts.ToString()); } } connection.Close(); }