Arduino/Genuino

Startat av swerecon, 22 augusti 2016 kl. 19:22:00

0 Medlemmar och 1 gäst tittar på detta ämne.

swerecon

Tänkte vi kunde ställa frågor och diskutera Arduino/Genuino i denna tråd. Kanske kan MrLinds eller Actros skapa en ny underkategori här under Elektronik.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

swerecon

Jag skulle behöva hjälp av någon som besitter kunskapen att programmera lite. Kontakta mig på PM så tar vi detaljerna där först.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

Är det inte bättre att föra hela diskussionen med alla frågor här i tråden? :)

swerecon

Det kan vi göra, spelar ingen större roll. Jag behöver hjälp med följande:

Jag vill ha upp information från tre sensorer på en OLED display, temp, volt och ampere. Tanken är att köra det med ett microkort. 

Någon som kan hjälpa mig med koden?
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

Låter kul :)
Jag är ingen hejare på Arduino men hjälper gärna till med det lilla jag kan.
Vad är det för Oled-display du har?
Har du sökt efter kod till denna?

swerecon

Toppen. Det är en SparkFun Micro OLED BoB i köpt från Lawicel. Jag har laddat ner och kört demokoden, testat att ändra antal kolumner och textstorlek.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

Bra! Då har du kommit en bit på vägen.
Vad är det för sensorer du pratar om?
Den enda sensorn jag kan tänka mig i sammanhanget är en tempsensor, för spänning och ström behövs väl bara några motstånd.
Hur ser koden ut?

swerecon

Jag hade tänkt använda någon av modellerna AttoPilot Volt & Current BoB 180A som också finns på Lawicel. Tempsensorn är en vanlig komponent som du säger. Har ingen möjlighet att ladda upp koden nu tyvärr men om du tittar på Lawicel finns det länkar när man tittar på produkten.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

#8
Ska kolla på det, men börja med att försöka ändra i koden så att du får texten som du vill ha den, sedan ska vi försöka få in datan på rätt ställe.

Behöver du verkligen 180A?

swerecon

Absolut, skall ta en titt på det någon kväll.
Nej, 180A behövs inte :) men dom hade väl tre olika varianter av den modellen.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

swerecon

#10
Här en bit kod för själva texten:

{
    oled.clear(PAGE);           
    oled.setCursor(0, 0);       
    oled.setFontType(0);         
    oled.print("B1:  ") ;         
    oled.setFontType(0);       
    oled.print(analogRead(A0));
    oled.print(" V") ;
    oled.setCursor(0, 8);     
    oled.setFontType(0);       
    oled.print("B2:  ") ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.print(" V") ;
    oled.setCursor(0, 24);
    oled.setFontType(0);
    oled.print("mAh:  ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A2));
    oled.setCursor(0, 40);       
    oled.setFontType(0);         
    oled.print("Temp: ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.print("C")  ;
    oled.display();
    delay(1000);
  }

Den är tagen ur demot där jag ändrat om vissa parametrar så jag får text och värden på rätt ställe. Har inte så mycket koll på dessa tecken ännu och hur man skall skriva i "init" för att det skall funka så vågar inte ändra för mycket i demofilen  [banghead]
Sensorerna (A0, A1, A2) finns ju inte så det är fiktiva värden från demot också.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

Du kan ändra så mycket du vill i demofilen om du sparar den i ett annat namn.
Klicka på "Fil" och "Spara som" så kan du döpa den till till något annat, typ Swetest1 eller nåt, och då kan du ha dom sida vid sida och klippa och klistra.

När du ändrar något så gör Verifiering efter varje ändring (ring uppe till vänster med bock).

swerecon

Då har jag lekt vidare och nu visas det som jag "tror" jag vill ha det. Det finns säkert ännu massor med saker som går att ta bort eller skriva enklare om man kan det  [vogel].
Nu behöver jag hjälp med resten som består av:

  • Förfina koden så allt onödigt är borta
  • Lägga till sensorerna i koden

Sen kanske det är något mer när jag blir klokare :)

Hela koden nedan//

#include <Wire.h>  // Include Wire if you're using I2C
#include <SPI.h>  // Include SPI if you're using SPI
#include <SFE_MicroOLED.h>  // Include the SFE_MicroOLED library

//////////////////////////
// MicroOLED Definition //
//////////////////////////
#define PIN_RESET 9  // Connect RST to pin 9
#define PIN_DC    8  // Connect DC to pin 8
#define PIN_CS    10 // Connect CS to pin 10
#define DC_JUMPER 0

//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS); // SPI declaration
//MicroOLED oled(PIN_RESET, DC_JUMPER);    // I2C declaration

void setup()
{
  oled.begin();    // Initialize the OLED
  oled.clear(ALL); // Clear the display's internal memory
  oled.clear(PAGE); // Clear the buffer.
 
  randomSeed(analogRead(A0) + analogRead(A1));
}
void pixelExample()
{
  printTitle("Pixels", 1);
 
  for (int i=0; i<512; i++)
  {
    oled.pixel(random(oled.getLCDWidth()), random(oled.getLCDHeight()));
    oled.display();
  }
}
void  textExamples()
{
  printTitle("   POWERED      BY      C A T",           0);
 
  oled.clear(PAGE);


  for (int i=0; i<25; i++)
  {
    oled.clear(PAGE);           
    oled.setCursor(0, 0);       
    oled.setFontType(0);         
    oled.print("B1:  ") ;         
    oled.setFontType(0);       
    oled.print(analogRead(A0));
    oled.print(" V") ;
    oled.setCursor(0, 8);     
    oled.setFontType(0);       
    oled.print("B2:  ") ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.print(" V") ;
    oled.setCursor(0, 24);
    oled.setFontType(0);
    oled.print("mAh:  ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A2));
    oled.setCursor(0, 40);       
    oled.setFontType(0);         
    oled.print("Temp: ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.print("C")  ;
    oled.display();
    delay(1000);
  }
}

void loop()
{
    textExamples();  // Finally the text example
}

// Center and print a small title
// This function is quick and dirty. Only works for titles one
// line long.
void printTitle(String title, int font)
{
  int middleX = oled.getLCDWidth() / 5;
  int middleY = oled.getLCDHeight() / 5;
 
  oled.clear(PAGE);
  oled.setFontType(font);
  // Try to set the cursor in the middle of the screen
  oled.setCursor(middleX - (oled.getFontWidth() * (title.length()/5)),
                 middleY - (oled.getFontWidth() / 5));
  // Print the title:
  oled.print(title);
  oled.display();
  delay(3000);
  oled.clear(PAGE);
}
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490

GöranA

#13
Jisses, här går det undan  <hands>
Huvudsaken är ju att det funkar och får plats i minnet, sedan kan man alltid städa och förfina koden.

Ser att du inte använder I2C, då bör du kunna ta bort det biblioteket, sätt två snedstreck framför och prova. Funkar allt så kan du ta bort raderna med I2C.
//#include <Wire.h>  // Include Wire if you're using I2C
//MicroOLED oled(PIN_RESET, DC_JUMPER);    // I2C declaration

Sensorerna har du väl inte ännu men en simulerad Voltmätare kan du fixa med en potentiometer:
https://www.arduino.cc/en/Tutorial/ReadAnalogVoltage

Det finns ju hur mycket hjälp och tips som helst ute på nätet, vill man lära sig lite mer om Arduino så titta gärna på eTechTom på Youtube:
https://www.youtube.com/playlist?list=PLrLOfmf1dB-gNMG2RBjhx1V51bKhtHI4E
Trevlig gubbe, sitter och ritar på whiteboard och skriver ut koden på papper  :) men förklarar lugnt och sakligt, utan hiphop-musik.
Här är exempelvis en om temperaturmätning:
https://www.youtube.com/watch?v=EbaY5D0O9S0&index=6&list=PLrLOfmf1dB-gNMG2RBjhx1V51bKhtHI4E

swerecon

Har fixat lite idag också, koden ser nu ut som följer:

#include <Wire.h>  // Include Wire if you're using I2C
#include <SPI.h>  // Include SPI if you're using SPI
#include <SFE_MicroOLED.h>  // Include the SFE_MicroOLED library

//////////////////////////
// MicroOLED Definition //
//////////////////////////
#define PIN_RESET 9  // Connect RST to pin 9
#define PIN_DC    8  // Connect DC to pin 8
#define PIN_CS    10 // Connect CS to pin 10
#define DC_JUMPER 0

//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS); // SPI declaration
//MicroOLED oled(PIN_RESET, DC_JUMPER);    // I2C declaration

void setup()
{
  oled.begin();    // Initialize the OLED
  oled.clear(ALL); // Clear the display's internal memory
  oled.clear(PAGE); // Clear the buffer.
 
  randomSeed(analogRead(A0) + analogRead(A1));
}
void pixelExample()
{
  printTitle("Pixels", 1);
 
  for (int i=0; i<512; i++)
  {
    oled.pixel(random(oled.getLCDWidth()), random(oled.getLCDHeight()));
    oled.display();
  }
}
void  textExamples()
{
  printTitle("   POWERED      BY      C A T",           0);
 
  oled.clear(PAGE);


  for (int i=0; i<25; i++)
  {
    int   rawAnalogValue;
  float volt, degC;
  rawAnalogValue = analogRead(3);
  volt = rawAnalogValue * 5.0 / 1023.0;
  degC = (volt - 0.5) * 100.0;
    oled.clear(PAGE);           
    oled.setCursor(0, 0);       
    oled.setFontType(0);         
    oled.print("B1:  ") ;         
    oled.setFontType(0);       
    oled.print(analogRead(A0));
    oled.print("V") ;
    oled.setCursor(0, 16);     
    oled.setFontType(0);       
    oled.print("B2:  ") ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.print("V") ;
    oled.setCursor(0, 8);
    oled.setFontType(0);
    oled.print("mAh: ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A2));
    oled.setCursor(0, 24);
    oled.setFontType(0);
    oled.print("mAh: ")  ;
    oled.setFontType(0);
    oled.print(analogRead(A1));
    oled.setCursor(0, 40);       
    oled.setFontType(0);         
    oled.print("Temp: ")  ;
    oled.setFontType(0);
    oled.print((degC));
    oled.print("C")  ;
    oled.display();
    delay(1000);
  }
}

void loop()
{
    textExamples();  // Finally the text example
}

void printTitle(String title, int font)
{
  int middleX = oled.getLCDWidth() / 5;
  int middleY = oled.getLCDHeight() / 5;
 
  oled.clear(PAGE);
  oled.setFontType(font);
  // Try to set the cursor in the middle of the screen
  oled.setCursor(middleX - (oled.getFontWidth() * (title.length()/5)),
                 middleY - (oled.getFontWidth() / 5));
  // Print the title:
  oled.print(title);
  oled.display();
  delay(2000);
  oled.clear(PAGE);
 
}

Jag får tempsensorn att funka som det skall när jag kör den i seriella monitorn som den är gjord för: http://www.lawicel.se/blog/about/arduino-lektion-10-tmp36-analog-temperaturgivare/

När jag försöker få över den i OLED får jag konstiga värden, bara -värden. Min kunskap är som sagt obefintlig och är förvånad att jag lyckats så här bra :)
Någon som kan hjälpa mig?

Simulerad voltmätare har jag testat och det funkade utan konstigheter, dock inte med i koden ovan.
MvH/Bengt

Volvo 250G
Scania 6x4 lastväxlare
Komatsu PC 490